2012年8月5日日曜日

VirtualBoxで開発環境構築 アプリケーションのインストール

Apacheのインストール

  • Apacheのインストールコマンド
    • yum -y install httpd
  • Apacheの設定
    • ランレベルの設定
    •  /sbin/chkconfig httpd on
    •  /sbin/chkconfig --list httpd

MySqlのインストール

  • MySqlのインストールコマンド
    • yum -y install mysql-server
  • MySqlの設定
    • 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
  • 自動起動設定
    • /sbin/chkconfig mysqld on
    • /sbin/chkconfig --list mysqld
  • 起動を確認
    • /etc/init.d/mysqld start

PHPのインストール

  • 取得先のGPG-KEY 取得
    • rpm –import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
  • 設定ファイルを作成
    • vi /etc/yum.repos.d/utterramblings.repo
[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
  • 取得先のGPG-KEY 取得
    • yum install php
    • yum install php-devel
    • yum install php-common
    • yum install php-gd php-mbstring php-pdo php-mcrypt php-mysql php-ncurses php-xml
  • バージョンの確認コマンド
    • php -v

Pearのインストール

  • Pearをインストール
    • yum -y install php-pear

Symfonyのインストール

  • symfonyのチャネルを登録
    • pear channel-discover pear.symfony-project.com
  • symfonyのチャネルを登録
    • pear channel-discover pear.symfony-project.com
  • Pearでsymfonyをインストール
    • pear install symfony/symfony-1.0.20
  • バージョンの確認コマンド
    • symfony -V

vsftpdのインストール

2012年8月4日土曜日

VirtualBoxで開発環境構築 セキュリティとネットワークの設定

参考にさせていただいたサイト

セキュリティの設定

  • userの作成
  • VirtualBoxのネットワークアダプタ設定
  • SELinuxの設定
  • iptablesの設定

userの作成

  • useradd 作成したいユーザ名
  • passwd 作成したいユーザ名
    • 警告が出るが作成は可能
rootだとなんでも出来てしまって危険なので基本はuserで作業する
suコマンドでrootになれる

VirtualBoxのネットワークアダプタ設定

  • ssh接続のための設定
    • VirtualBoxの「詳細」にある「ネットワーク」
    •  アダプタ1→ホストオンリーネットワーク(ゲストOSとホストOS間のネットワーク)
    •  アダプタ2→NAT(ゲストOSから外部へのネットワーク)
ゲストOS起動中の場合は一度停止してからでないと変更が出来ない

SELinuxの設定

  • SELinuxの無効化
    • # vi /etc/sysconfig/selinux
    •   SELINUX=enforcing
    •   ↓
    •   SELINUX=disabled
    • rebootコマンド→getenforceコマンドでdisabledであることを確認

iptablesの設定

  • 最初に設定
    • iptables -P INPUT ACCEPT (外部からのアクセスを許可)
    • iptables -P FORWARD DROP (次にデータを渡す)
    • iptables -P OUTPUT ACCEPT (外部にデータを渡す)
  • ルールの初期化
    • iptables -F (上のコマンドiptablesのルールの設定を反映させるためのコマンド)
  • 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
  • 設定の確認
    • cat /etc/sysconfig/iptables
  • 再起動する
    • reboot
VirtualBoxで開発環境構築 アプリケーションのインストールに続く

2012年8月1日水曜日

VirtualBoxで開発環境構築 CentOSのインストール

参考にさせてもらったサイト


詳しい手順が載ってます
感謝です

centOSのダウンロード


VirtualBoxでの作業

  • 新規の仮想マシンの作成
  • 仮想マシンを起動
    • isoイメージをマウントさせるように設定する
    • 初回起動ウィザードで、起動したときに選択肢がでる
    • 自動的にインストールに移行する
    • メニューバーのデバイス→CD/DVDデバイスの項目でも選択できる

インストール準備(BIOSっぽい設定)

  • インストールに使用する言語
    • japanese
    • 次の画面でtextモードでは英語になるという警告が出るのでOK
  • キーボードタイプ
    • jp106
  • Installation Method
    • HTTP
  • Configure TCP/IP
    • とりあえずDHCPで自動割り当て
    • IPv6 supportのチェックを外す(*をスペース入力で置き換える)
  • HTTP setup
    • web site name:ftp.riken.jp
    • CentOS directory:Linux/centos/5.1/os/x86_64

centOSのインストール

  • ドライブを削除する等の初期化
    • 許可してデフォルトでパーティションを作成させる
  • ネットワークデバイス
    • デフォルト
  • ホスト名を設定
    • DhCP経由で自動設定
  • rootのパスワードの設定
    • メモの保存を忘れずに
  • Desktop-Gnomeのチェックを外す
    • GUIは使わないので
  • 追加でソフトウェアリポジトリを加える
    • 今すぐカスタマイズするにチェック
  • セレクトボックスの開発を選択し以下の項目をチェック
    • レガシーなソフトウェアの開発
    • 開発ツール
    • 開発ライブラリ
  • 以上の設定を終えればインストールに入る
    • この作業は数分かかる
    • インストール成功後に自動的に再起動される
    • このときデバイスにネットインストールisoが選択されてる状態だともう一度インストールしようとするようだ
    • メニューバーのデバイス→CD/DVDデバイスの項目でisoイメージを選択解除できる
完了!

2012年7月31日火曜日

VirtualBoxで開発環境構築 VirtualBoxのインストール

インストールするアプリケーション

  • VirtualBox
  • CentOS
  • Apache
  • symfony

参考にさせてもらったサイト


詳しい手順が載ってます
感謝です

VirtualBoxのダウンロード

  • 公式サイトでVirtualBoxをダウンロード
  • ダウンロードしたファイルを実行
    • インストールウィザードでsetupする
    • 今回、最新版をインストールしようとしたら失敗した(理由不明)ので3.2をインストールした

VirtualBoxで開発環境構築 CentOSのインストール につづく

2012年7月25日水曜日

2012年07月25日 ブログにコードを表示してみる

ブログにコードを貼り付けようと思い立つ
色々ググると参考サイトが出て来る

すぐに忘れる脳みそのためのメモ
Blogger でソースコードに色付けをする - google-code-prettify

求めてる内容そのままだった……(感謝)

bloggerにコードをきれいに表示するには
  googleサイト
  google-code-prettify
を利用して
  preタグ
を使う

詳しくは上記のサイトの通りやれば出来るので、以下備忘録的な何か
ざっとした流れ
google-code-prettifyをダウンロードして自分の環境下で解凍
●googleサイトで自分のサイトを作る
☆テンプレートをサイトキャビネットにする?→サイトのテンプレート内を探してた(そこじゃなかった)
☆新しいページを作成→テンプレートでファイルキャビネットを選べる
●解凍したgoogle-code-prettifyフォルダ内にあるprettify.jsとprettify.cssをファイルキャビネットにアップロード
☆.jsファイルがたくさんあるけど、他のは今のところ必要なさそう
●bloggerテンプレート>HTML の編集でhtmlをカスタマイズ
☆直前に記述

<!-- google-code-prettify -->
<link href='https://sites.google.com/site/サイト名/ページ名/prettify.css' rel='stylesheet' type='text/css'/>
<script src='https://sites.google.com/site/サイト名/ページ名/prettify.js' type='text/javascript'/>
<!-- /google-code-prettify-->

☆の中に記述(既にclassとかが居るけどねじ込む)

<body expr:class='"loading" + data:blog.mobileClass' onload='prttiyPrint()'>

●bloggerテンプレートデザイナーでcssを追加
pre{
overflow: auto;
}
☆autoじゃなくてscrollにしたら縦スクロールバーが主張して野暮ったくなったのでautoがいいかも


導入した感想:
少し見た目を変えたら追記する予定
現状だとちょっと無骨なので、コードが書いてありますよ!という感じにしたい

追記:
<や>をそのまま文字として表示する方法
HTMLタグをエスケープしてないから表示できてなかった(^p^)
さくらエディタで<を&lt;に全部置換して完了

2012年7月24日火曜日

2012年07月24日 オライリーEbookを購入

オライリーEbookを購入



両方とも多分初級者向けな感じ
値段も少し安い、ボリュームも気が遠くなるほどでもないっぽいので購入
Webエンジニア養成科を修了した人にとっては、phpの復習と補完にちょうどいい内容に感じる
上級過ぎず入門書過ぎず、即使えるプラスαが習得できると思われる
とにかくphpを使って動かすことから、もう少し体系的な学習とプログラミングという概念の視野を広げるために丁度良いんじゃないかなという感想

オライリーのEbookストアで購入すると、どちらも1512円(日本語)
iphoneアプリでは600円(英語)

iphoneアプリ版を購入すれば、アプリをepub化してipadで読める
perl - O'ReillyのiPhoneアプリ本からepubをぶっこぬく
↑このあたりを参照

英語を読める人にとっては全部買うでしょレベルかもしれない
(英語をガチで学ぶ決意をするほどのお得感……ぐぬぬ……)

EbookはDRMフリーなのでいろんな端末で読めてとても良いし、
データが消えても再ダウンロードが可能
PDFなのがちょっと微妙かなという程度

アプリをepub化してibooksの辞書機能も使えるようになるっぽい
(設定をいじらなければ英英辞書、どこかをいじれば英和にできるっぽいので慣れてきたらチャレンジだ)

とりあえずスキルが初級レベルなので日本語版と英語版の両方を買って専門用語や言い回しに慣れるとかがいいかもしれない
今はまず、プログラミングのスキルアップが重要であるとの判断
(日本語版と英語版の差額がラーメン一杯分なのでマジでくやしい)

とにかくガチで英語を学ぶ理由も出来たのでよしとする

2012年7月20日金曜日

2012年07月20日 講義103日目(最終日)

2012年07月20日
講義103日目
------------------------------1H------------------------------
★ショッピングカート
●仕様
・カートの情報は全て$SESSION["cart"]内で管理
・$SESSION["cart"]内に商品情報を要素として持つ配列を生成する
・$SESSION["cart"][]内の商品情報に与える要素(テーブル構成により変動)
商品ID
商品名
価格
注文数
画像ファイル名
・カートの中身一覧ページ、他のページから参照できる簡易表示部品の二点を作成する
・中身一覧ページにアクセスする際にカート内に情報を追加する
・中身一覧ページでは、テーブル内のプライマリーなキーとして「ID」を
    注文数として「quantity」を添え字としたデータをgetで渡すものとする
    いずれかが存在しない場合はカート内に情報を追加しない
・中身一覧ページで在庫数を変えられるようにするカート外で行うべき処理
・既にカート内に存在する商品の場合追加しない
・カート外で行うべき処理
    ユーザが「カートに入れる」行動を取る際、在庫を上回る数を選択しないように導くこと
    注文を確定させた段階で在庫量カラムの数を減らすこと
    在庫を上回る注文であった場合にエラーとなること(※)
    テーブルに存在しないIDであった場合にエラーとなること(※)

※他のページでも行う可能性のあるエラーチェックのため関数化しておく
------------------------------2H------------------------------
★ショッピングカート
●cartの作成
①カートが存在しなければ初期化する
②まずはフォームから送られてきた「ID」「stock」を受け取れる
③エラーチェックを行う
    IDとストックいずれかがないなら追加しない
    既にカート内に存在する商品の場合追加しない
    存在しないIDなら追加しない
    在庫を上回るstockなら追加しない
④問題なければDBからデータを取得
⑤カートに入れる
⑥最後にカートの中身を表示
・テンプレートに書いていく
------------------------------3H------------------------------
★ショッピングカート
●cart
・削除変更
  セッションを書き換える
  再びcartページに戻ってくる
------------------------------4H------------------------------
★環境のバックアップ
●VMware上のファイルを退避する
・FFFTPで接続し、一旦ローカルPCに落としてくる
(Cドライブ直下などに、退避用のフォルダを作成しておく)
・データベースのデータは、phpmyadminを使うか、mysqldumpコマンドを使ってエクスポートする
・rootユーザで作ったファイルは、FFFTPでは触れないで、一旦puttyでログインし、
  /home/userの下に移動してからFFFTPで取得する
・カレントディレクトリ下にフォルダやファイルが大量にあるなら、
  zipコマンドやtarコマンドで圧縮してから移動すると良い
  rootユーザのカレントディレクトリごと圧縮するにはrootになる
  zipコマンドでの圧縮例
  su
  zip -r /home/bk_from_vmware.zip /home/user
  mv /home/bk_from_vmware.zip /home/user
・.htaccess や .bash_profileなどのファイル名の頭に
  ピリオドの付くファイルは隠しファイルなので気をつける
●ローカルPCのファイルを退避する
授業で使用したPC内の退避ファイル例
・VMwareから退避したファイルたち
・インストールしたツールたち
・C\pleiades 下のプロジェクトや設定ファイル
・IDmanagerの保存ファイルや、パスワードはサービスごとに多岐にわたるので
  情報を紛失するとログインができなくなるため注意
------------------------------5H------------------------------
★RSS
●XMLの生成
生成ツールを使う
crontab で自動化
------------------------------6H------------------------------
★修了式
●コマンドプロンプト
・ftpコマンド
 ftp接続ができる
ftp open IPアドレス
対象のIPアドレスに対して接続することができる
put getで送受信が可能
ファイル単位でしか送受信できないので圧縮するなどしたファイルを送受信する
・sshコマンド
とかもある
●PHPの資格取得などで体系的に学ぶことも可能になるので受けてみるのもいいかもしれない
-----------------------------memo------------------------------

2012年7月18日水曜日

2012年07月19日 講義102日目

2012年07月19日
講義102日目
------------------------------1H------------------------------
★リファクタリング
●googleSpreadSheetへの接続サポートclass
・メンバ変数はプロテクテッドがいい(プライベートも状況によって使う)
親クラスでメンバ変数を呼ぶ作りにするとか
別のgoogleサービスへの接続サポートclassも子クラスにできるような親クラスを作成するのがいい
コンストラクタでメンバ変数を渡すとか
・クラスの説明
クラス使い方、動き、目的などを説明
各メソッドの説明
など
・insertRowdataを直したほうがいい
参照するメソッドが有効でない場合の処理(falseを返すなど)を追加するほうがいい
・参考本
マーチンファウラーのリファクタリング
------------------------------2H------------------------------
★復習
●テストもあるし色々と復習
------------------------------3H------------------------------
★最終テスト
------------------------------4H------------------------------
★リファクタリング
●class
・可変変数
変数名を元にした変数を作成する
$hoge  = "test";
$$hoge = "dayo";

echo "$hoge${$hoge}"; //出力 testdayo

・可変変数を使ってsetData()メソッドを作成する
$hoge = "test";
myGdataSpreadsheet->setData($hoge);
の時に、$hogeで内容がtestであるメンバ変数を作成するメソッドを作る
------------------------------5H------------------------------
------------------------------6H------------------------------
★ショッピングカート
criteriaにつなぐ復習など
-----------------------------memo------------------------------

2012年07月18日 講義101日目

2012年07月18日
講義101日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★過去の小テストの内容を色々と復習する
  smartyとかmysqlとか
------------------------------3H------------------------------
★再テスト
------------------------------4H------------------------------
★リファクタリング
●Zend_Gdata_Spreadsheetsからの情報を取得するためのclassをリファクタリング
・getとsetに処理を分けて関数を細かくしていく
------------------------------5H------------------------------
★リファクタリング
●zend_gdata_Photosからの情報を取得するためのclassをリファクタリング
・Spreadsheetsと同じ要領で細かく分けていく
------------------------------6H------------------------------
★運営運用実習
●用語
・SEO
  検索エンジン最適化
・SEM
  検索エンジンを使ったマーケティング
・LPO
  ランディングページ最適化
  (トップページなど)
-----------------------------memo------------------------------

2012年7月17日火曜日

2012年07月17日 講義100日目

2012年07月17日
講義100日目
------------------------------1H------------------------------
★運営運用実習
●モバイルからのアクセスについて
・.htaccessで対応
・$_SERVERで対応
●.htaccess
・サブドメインにも.htaccessかけておく(放置してた)
・htpassコマンド
  htpasswd -c .htaccess
------------------------------2H------------------------------
★運営運用実習
●rootの取れない外部共有サーバなどにsymfonyをインストールする手順
・pearのインストール
go-pear.phpを使う
nstallation prefix →pearをインストールしたいパス
php.ext path ... →phpのバイナリの絶対パス(サーバ次第で変わる)
・pearをインストールしたディレクトリにパスを通す
  .bashrcにパスを追加
・パーミッションエラーの対処
  pear config-showを確認
  pear config-setコマンドで設定を自分が扱えるディレクトリに変更
・symfonyをpearコマンドでインストール
------------------------------3H------------------------------
☆リファクタリング
  ソースの改修作業のこと
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
-----------------------------memo------------------------------
★おまけ
ショッピングカートを作ろう!
●DBの作成
id
商品名
価格
在庫
画像
カテゴリid
削除フラグ
created_at
update_at

・クエリ
create table item_list (
id int not null auto_increment,
item text,
price int,
stock int,
photo text,
category_id int,
delete_yn char(1),
created_at datetime,
update_at datetime,
primary key (id)
);

色違いだけど同じ商品を扱いたいケース用の拡張
プランA:IDを文字含みにして、11R、11Bのように同じID番号+色にする
・insert intoする
insert into item_list (
item,
price,
stock,
photo,
category_id,
delete_yn,
created_at,
)
values (
"アイテム名テスト1",
"1000",
"100",
"01.jpg",
"カテゴリ名テスト1",
"n",
"2012-07-17 11:11:11"
);

☆さくらスタンダードでサブドメイン振らないで、symfonyのプロジェクトを
確認しながら作成するのはできないの忘れてたのでVMwareで作るとか
☆ブラウザで見れるようにするのを忘れてたりして地味に焦るなど(チートシートの作成が必要かも)

・シンボリックリンクを作成
cp -a /home/ユーザ名/local/lib/php/data/symfony/web/sf ./sf

2012年7月13日金曜日

2012年07月13日 講義099日目

2012年07月13日
講義099日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★リリース実習
●bug fix
------------------------------3H------------------------------
★リリース実習
●googleアナリティクス
・自分のサイトのプロパティを作成
・トラッキング コードを全てのページheadタグに貼り付ける
</head>の直前あたりに貼り付ける
symfonyではlayout.phpを編集すれば全てに適応される
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
★リリース実習
-----------------------------memo------------------------------

2012年7月12日木曜日

2012年07月12日 講義098日目

2012年07月12日
講義098日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★リリース実習
●作成したwebサイトの改修作業
------------------------------3H------------------------------
★リリース実習
ソースの差分を確認してみる
●linuxコマンド
・diff
ファイルの差分を取得する
例)diff config.php config2.php
行単位で差分を取得してくれる
●SVNコマンド
・svn diff
リポジトリ同士のソースに対して差分を取得できる
例)svn diff svn://localhost/shonanbbs/trunk/config/settings.yml svn://localhost/shonanbbs/branches/config/settings.yml
------------------------------4H------------------------------
★リリース実習
●検索エンジン
・検索エンジンにひっかからないようにする
  web/robot.txt
  クローラの挙動を操作
    User-agent: *
    Disallow: / ←ここでディレクトリを指定
  web/.htaccess
  ベーシック認証
☆site:urlでgoogle内にindex化されてるか確認できる
------------------------------5H------------------------------
------------------------------6H------------------------------
★リリース実習
●サービスリリースに向けてがんばるなど
新規ユーザ登録モジュールは完成
肝心のレシート入力にかなり色々と発生してて作り直しレベル
-----------------------------memo------------------------------

2012年7月11日水曜日

2012年07月11日 講義097日目

2012年07月11日
講義097日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★リリース実習
●SVN
・staging環境のソースをtrunkにコミット
  svn ci -m ""
・staging環境で発生したエラーを解消する
  問題点を開発に報告する
☆バイナリファイルを16進数で編集するエディタとかがある
  意図的に壊れたファイルを作るなどができる
------------------------------3H------------------------------
------------------------------4H------------------------------
★リリース実習
●バリデーション
・バリデーションを色々と試行錯誤
ユーザ新規登録モジュールを作成
  カスタムバリデータの作成
    ユーザネーム、メールアドレスの重複をチェックするバリデータ
  バリデーションconfirm.ymlを作成
------------------------------5H------------------------------
★リリース実習
●dev.shonanbbs.comの問題点解決
・画像のエラーを解消
  カスタムバリデータの作成
  /lib/validate/myUploadImageValidator.class.phpの作成
●バリデーターの拡張
・sfFileValidatorの拡張
validator側を編集
class myUploadImageValidator extends sfFileValidator
{
    public function execute(&$value, &$error)
    {
        //画像の正常性チェック(myUtil使用)
        $id = myUtil::getFileExtId($value["tmp_name"]);
        //(myUtil未使用の場合)
        //$ids = @getimagesize($value["tmp_name"]);
        //$id = ids[2];

        $image_types = sfConfig::get("sf_image_types");
        if(@exif_imagetype($value["tmp_name"]) !== $id || !array_key_exists($id, $image_types)){
            $error = $this->getParameter("mime_type_error");
            return false;
        }
        //php.iniの画像サイズを超える
        if($value["error"] === 1){
            $error = $this->getParameter("max_size_error");
            return false;
        }
        if(!parent::($value, $error)){
            return false;
        }
       
        return true;
    }
}

・yml側の編集
fields:
  content:
    required:
      msg: 内容を入力してください。
  nickname:
    required:
      msg: 名前を入力してください。
  photo:
    file:       True
    sfFileValidator:
      mime_types:
        - 'image/gif'
        - 'image/jpeg'
        - 'image/png'
        - 'image/x-png'
        - 'image/pjpeg'
      mime_types_error: GIFとPNGとJPEGの画像のみ許可されます
      max_size:         512000
      max_size_error:   最大のサイズは512KBです
------------------------------6H------------------------------
★リリース実習
●SVN
・dev環境の変更をbranchesにコミットする
・staging環境で試しのmergeをする
svn merge --dry-run -r 現在のリビジョン:HEAD(最新のリビジョン) svn://localhost/shonanbbs/branches
  問題が無ければ
svn merge --dry-run -r 現在のリビジョン:HEAD(最新のリビジョン) svn://localhost/shonanbbs/branches
  staging環境で動作の確認ができたらコミットする
・本番環境でsvn up
  コンフリクトが発生してたら解消
・ディレクトリの書き込み権限を確認
・サーバのメンテナンスを表示してたhtaccessを元に戻して完了
-----------------------------memo------------------------------
☆参照渡し
&$valueとかを使うと容量が軽い

2012年7月10日火曜日

2012年07月10日 講義096日目

2012年07月10日
講義096日目
------------------------------1H------------------------------
★リリース実習
●SVN
・本番環境のメンテナンス画面のページを作成
sf.shonanbbs.com/web/maintenance.html
・/web/.htaccessの編集
  Ifmodule内を変更
  コメントアウト→  # RewriteRule ^(backend/.*)$ backend/backend.php [QSA,L]
  メンテナンスのhtmlに飛ばす→  RewriteRule ^(.*)$ maintenance.html [QSA,L]
  メンテナンス状態になる
・本番環境のリポジトリに不必要なファイルを除外する
①既にtrunkには各種ディレクトリ、ファイルの対象外設定がなされているため
  svn upで反映させるが、その際に一時的にファイルが消えるためにバックアップを取る
  dev環境などで取ったバックアップ方法と同じ
②trunkの内容で更新
  ☆本番環境からコミットsvn ci -m ""はしない
③バックアップを戻す
  dev環境などで取ったバックアップを戻す方法と同じ
------------------------------2H------------------------------
★リリース実習
●SVN
・マージとは
☆branchesのリポジトリ→ステージング環境を動かす
  trunkのリポジトリ→開発環境を動かす(あまりやらない)
・マージコマンド
  svn merge
  指定したリビジョンで環境を更新する
  ・マージコマンドの例
    例)svn merge -r 10:30 svn://localhost/shonanbbs/branches
      svn merge →
      -r →
      10:30 →欲しいリビジョン番号、10から30のリビジョンを取得
      svn://localhost/shonanbbs/branches →欲しいリポジトリのパス
  ・逆マージ
    例)svn merge -r 30:10 svn://localhost/shonanbbs/branches
  ・10から最新までマージ   
    例)svn merge -r 10:HEAD svn://localhost/shonanbbs/branches
  ・試しに10から最新までマージ
    例)svn --dry-run -r 10:HEAD svn://localhost/shonanbbs/branches
・マージする
  staging環境で試しのマージをしてみる
[ユーザ名@localhost staging.shonanbbs.com]$ svn merge --dry-run -r 1:HEAD svn://localhost/shonanbbs/branches
------------------------------3H------------------------------
★リリース実習
●Tips
・ターミナルで表示を変更する
  puttyのウィンドウ設定で変更可能
・コマンドのlogの取得
  例)svn --dry-run -r 1:HEAD svn://localhost/shonanbbs/branches > ~/mergetest.log
  >>で追加書き込み
  ☆~はhomeの略
・スクリプトコマンド
  script ~/script_test.log
  ・コマンドの実行結果を取得
    view script_test.log
  ・ログへの記録を終了する
    exitもしくは[ctrl+d]
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
★リリース実習
●SVN
・マージしたときにコンフリクトしてるファイルの修正
コンフリクトしてたファイルたち
//apps/backend/templates/_menu.php
//apps/front/config/routing.yml
//apps/front/modules/comment/templates/detailSuccess.php
//apps/front/modules/default/actions/actions.class.php
//apps/front/modules/default/validate/submit.yml
//apps/front/modules/default/templates/error404Success.php
//apps/front/modules/default/templates/indexSuccess.php
//apps/front/modules/news/templates/indexSuccess.php
//apps/front/templates/layout.php

・svn resolved コンフリクトしてるファイル名
  コンフリクトを解消する
・ファイル内に発生したコンフリクトしてるソースの修正をする
  vi ファイル名
  <<<<<.working
  ステージングのソース←この部分を消す
  ===========
  trunkのソース←この部分を残す
  >>>>>>>>>rリビジョン番号
☆注意config/settings.ymlのコンフリクト
hostname部分をステージング環境用に変更して
変更は維持するように書き換える

既存の問題点
①壊れてる画像ファイル(gif)をアップロードした際に
拡張子が空の状態でレコードに登録される
例)テキストファイルの拡張子をgif等に変えてアップロード

②/images/commnetの書き込み権限がないので画像が投稿できない問題
対処→chmod 777 commnet
-----------------------------memo------------------------------
●VMwareのソースをgooglecodeへ
svn importでgooglecodeにインポートする

2012年7月9日月曜日

2012年07月09日 講義095日目

2012年07月09日
講義095日目
------------------------------1H------------------------------
------------------------------2H------------------------------
------------------------------3H------------------------------
★リリース実習
●SVN
・ファイルの除外
cache/
log/
ページの読み込むたびに変わるので邪魔
config/databases.yml
config/propel.ini
環境ごとに接続先が変わりうるため
・除外するファイルをバックアップする
web/index.php
web/backend/backend.php
web/images/comment/*
おのおの_bkを付けてコピー
☆cp -rp
フォルダ(r)を権限保持して(p)コピー
・propeditでディレクトリにリポジトリ除外を指定する
propeditはコマンドを打つディレクトリ内のディレクトリに内容を記述する
[ユーザ名@localhost dev.shonanbbs.com]$ svn propedit svn:ignore web
内部に
index.php
[ユーザ名@localhost web]$ svn propedit svn:ignore backend
内部に
backend.php
[ユーザ名@localhost images]$ svn propedit svn:ignore comment
内部に
*
を記述
・svn propeditでの修正をコミットする
svn ci -m ""
・リポジトリのソースを消す
svn rm svn://サーバIP/shonanbbs/branches/web/index.php -m ""
svn rm svn://サーバIP/shonanbbs/branches/web/backend/backend.php -m ""
svn rm svn://サーバIP/shonanbbs/branches/web/images/comment/ -m ""
・バックアップしておいた_bkファイルを元の名前に戻す
[ユーザ名@localhost images]$ mv comment_bk/ comment
[ユーザ名@localhost web]$ mv index.php_bk index.php
[ユーザ名@localhost backend]$ mv backend.php_bk backend.php
・リポジトリから消えてない場合.svnを消去して対処
[ユーザ名@localhost comment]$ rm -rf .svn
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
★リリース実習
●SVN
・ステージング環境でのtrunkの不要なディレクトリの除去
/log
/cache
web/backend/backend.php
web/index.php
config/detabases.yml
config/propel.ini

①対象外設定を行うディレクトリを指定
svn propedit svn:ignore config
②viで記述(全てのファイルの場合は「*」)
databases.yml
propel.ini
③対象外設定をコミット
svn up
④場合に応じてバックアップを取っておく
cp databases.yml databases.yml_bk
cp propel.ini propel.ini_bk
⑤対象外にしたいファイルを一時的に消し、リポジトリとの差分を解消
rm -rf ファイル名(全て消す場合は「*」)
svn up
ls
svn rm 対象のファイル
svn ci -m ""
⑥バックアップを取っている場合は戻す
mv databases.yml_bk databases.yml
mv propel.ini_bk propel.ini
☆SVNのコンフリクトについて
同じリビジョンを更新しようとすると発生する
・dev2.shonanbbs.comを作成し、brunchesからチェックアウトしてくる
[ユーザ名@localhost dev2.shonanbbs.com]$ svn co svn://localhost/shonanbbs/branches/ ./

[ユーザ名@localhost dev.shonanbbs.com]$ svn resolved apps/front/templates/layout.php
'apps/front/templates/layout.php' の衝突状態を解消しました
-----------------------------memo------------------------------

2012年7月8日日曜日

2012年07月08日 講義094日目

2012年07月08日
講義094日目
------------------------------1H------------------------------
★symfony復習
●画像のアップロード
・imagesフォルダへの書き込み権限変更
[ユーザ名@localhost web]$ chmod -R 777 ./images
☆symfony fix permsで変更は戻らない
・拡張子の正常性、ファイルの正常性チェック
画像であるかどうかチェックするロジックを追加する
アップロードされてきたファイル名をそのままDBに入力するロジックだと、
画像以外のファイルもアップロードされてしまい危険
例)悪意のあるphpファイル、スクリプトなども通ってしまい実行されてしまう
●settings.ymlに追記
・settings.ymlを修正
    image_types:
      1: gif
      2: jpg
      3: png
ここで入力したキー値を元にsfConfig::get('sf_image_types')で拡張子を作成
☆getimagesize()で取得できる定数で判断

●executeSubmit()の修正
・/lib/にmyUtil.class.phpを設置する
myUtil.class.php内の拡張子の判断に利用する関数部分
    public static function getFileExtId($filePath)
    {
        $info = @getimagesize($filePath);
        return  $info[2];←
    }
    public static function getFileExt($filePath)
    {
        $id = myUtil::getFileExtId($filePath);
        $image_types = sfConfig::get('sf_image_types');←ここでsettings.ymlを読み込んでる

        return  '.'.$image_types[$id];
    }

・executeSubmit()の修正
        //セットした値をデータベースに反映させる
        $comment->save();

        if($photo["tmp_name"])
        {
            $filename = $comment->getId().".jpg";
            $this->getRequest()->moveFile("photo",sfConfig::get('sf_web_dir')."/images/comment/".$filename);
            $comment->setPhoto($filename);
            $comment->save();
        }


        //セットした値をデータベースに反映させる
        $comment->save();

        if($photo["tmp_name"])
        {
            $filename = $comment->getId().myUtil::getFileExt($photo["tmp_name"]);
            $this->getRequest()->moveFile("photo",sfConfig::get('sf_web_dir')."/images/comment/".$filename);
            $comment->setPhoto($filename);
            $comment->save();
        }

------------------------------2H------------------------------
★symfony復習
●画像ファイルへのバリデーション
・default/validate/submit.ymlの修正
☆ファイルのバリデーター
fields:
  image:
    file:       True
    required:
      msg:      画像ファイルをアップロードしてください
追加記述部分ここから↓
    sfFileValidator:
      mime_types:
        - 'image/jpeg'
        - 'image/png'
        - 'image/x-png'
        - 'image/pjpeg'
      mime_types_error: PNGとJPEGの画像のみ許可されます
      max_size:         512000
      max_size_error:   最大のサイズは512KBです

・許可するファイルの修正
mime_types:
  - 'image/gif'
・エラーメッセージ部分の修正
mime_types_error: GIFとPNGとJPEGの画像のみ許可されます
・ファイルのサイズ制限の修正
☆apaheの上限、symfonyの上限(ほぼコレをチェック)など、phpの上限(apaheと密接)などがあるので各設定も確認する

☆photoカラムのファイル名末尾に.が付いているレコードが存在すると挙動が怪しくなる
------------------------------3H------------------------------
------------------------------4H------------------------------
★リリース実習
●自分のサイトの公開準備
・色々と途中でやばい
------------------------------5H------------------------------
★リリース実習
●SVN
・特定のファイルをリポジトリから除外するために
リポジトリに登録するときに該当のファイルを除外しておく
コミットしない
例)config/databases.yml
    config/propel.ini
    web/index.php
    web/backend/index.php
    web/images/comment/*
・現在の環境にupdateさせる
svn upでリポジトリと一致させる
svn stat -uで確認
?をsvn addでリポジトリに追加させる
・特定のファイルをコミット対象外にする
svn propedit svn:ignore cache
viで開くので*を記述する(全てを対象外にするために)
svn propedit svn:ignore log
viで開くので*を記述する(全てを対象外にするために)
・svn up

[ユーザ名@localhost dev.shonanbbs.com]$ svn list svn://サーバIP(local環境ならlocalhost)/shonanbbs/branches/cache/
backend/
front/
tmp/
・cache下のファイルを確認
[ユーザ名@localhost dev.shonanbbs.com]$ svn rm svn://サーバIP/shonanbbs/branches/cache/backend -m ""
リビジョン 10 をコミットしました。
[ユーザ名@localhost dev.shonanbbs.com]$ svn rm svn://サーバIP/shonanbbs/branches/cache/front -m ""
リビジョン 11 をコミットしました。
[ユーザ名@localhost dev.shonanbbs.com]$ svn rm svn://サーバIP/shonanbbs/branches/cache/tmp -m ""
・log下のファイルを確認
リビジョン 13 をコミットしました。
[ユーザ名@localhost dev.shonanbbs.com]$ svn rm svn://サーバIP/shonanbbs/branches/log/front_dev.log -m ""
リビジョン 14 をコミットしました。
これでリポジトリからcacheとlogが削除された
・svn upを実行
リポジトリ情報を元に、cache下のファイルが消える
・symfony ccでキャッシュが生成される
------------------------------6H------------------------------
★リリース実習
●SVN
・バージョン管理外に置きたいファイルの操作(必ずしも管理外に置かなくてもいい)
config/databases.yml
config/propel.ini
web/index.php
web/backend/index.php
web/images/comment/*←データベースのカラムと結びつくのではずす

☆重要☆database.ymlとpropel.iniの退避
cpコマンドを使い、開発環境下のdatabase.ymlおよびpropel.iniを末尾に_bkをつけるなどして退避
・プロジェクト直下で
svn propedit svn:ignore config
・viの中に、対象とするファイル名を記述
databases.yml
propel.ini
・configディレクトリをコミット
svn ci -m ""
・svn list svn://サーバIP/プロジェクト名/branches/config/
でconfig下のファイルを確認
・リポジトリのソースを消す
svn rm svn://サーバIP/プロジェクト名/branches/config/databases.yml -m ""
svn rm svn://サーバIP/プロジェクト名/branches/config/propel.ini -m ""
・svn upする
リポジトリの情報を元に、config下のファイルが消える
退避したファイルの名前を元通りにし、ブラウザから確認
-----------------------------memo------------------------------

2012年7月6日金曜日

2012年07月06日 講義093日目

2012年07月06日
講義093日目
------------------------------1H------------------------------
★symfony復習
●ヘルパー
・テンプレート側で使う関数
  フォームヘルパー
  バリデーションヘルパー
  リンクヘルパー
    routhing.ymlで設定したリンク先を使うこともできる
   
    ・テンプレート側
      <?php echo link_to("サイトマップ","@sitemap_sub")?>
    ・routhing.yml
      sitemap_sub:
      url:   /sitemap
      param: { module: default, action: sitemap }
 
・ヘルパーのカスタマイズ
  授業で使ったページャ用のヘルパーはsymfonyで用意されたものではなく自作のヘルパー
  <?php use_helper("MyPagerQuery", "Validation")?>
  引数は一つ以上もつことができる
☆バリデーションの流れ
①submitボタン押す
②sfValidateクラスが動く
③作成したmodule/validate/submit.ymlのエラーチェックを確認
④executeHandleErrorが動く
⑤ヘルパーのform_errorが実行され、エラーがでる←ヘルパー<?php use_helper("Validation")?>が機能する場所はココ
  <?php echo form_error("");?>でエラーメッセージを表示させる
------------------------------2H------------------------------
★symfony復習
●部品化
・パーシャル
  テンプレートのみ
    指定したモジュールのテンプレートを読み込む場合は
    include_partial("モジュール名/テンプレート名")
    複数のモジュールで使用する場合、apps/templateに設置する
    その場合は、include_partial("global/テンプレート名")で呼び出す
    ☆パーシャルでデータを渡す
    テンプレート側
    <?php include_partial("global/page_discription", array("mes" => "コメントの詳細ページ"))?>
    パーシャル側
    <?php echo $mes?>で変数として受け取れる
      配列も受け取ることができる
      注意:変数が存在しない場合にエラーが出てしまうので
      <?php echo (isset($mes))?$mes:"メッセージなし";?>
      のように三項演算子でチェックしておくのがいい
------------------------------3H------------------------------
★symfony復習
●部品化
・スロット
  データの部品化
    メタ情報を書き換えたりするときに使う
    ・テンプレート
    <?php slot("footer_mes");?>
    内容
    <?php end_slot;?>
    ・レイアウト
    <?php include_slot("footer_mes");?>
    ☆has_slot()
    slotがあるか確認する関数、返り値はtrueかfaulse
    ☆スロット内でパーシャルを呼び出したりとかも可能
------------------------------4H------------------------------
★symfony復習
●部品化
・コンポーネント
  ロジックとテンプレート
  ・action
    components.class.php
  ・template
    _テンプレート名Success.php
・componentだけのモジュールを作成する
  ・compshareモジュールを作成
    symfony init-mod front compshareコマンドを打つ
    ・components.class.php
    class compshareComponents extends sfComponents{
        public function executeAccessCheck()
        {
       
        }
    }
    ・_accessCheck.php
      コンポーネントのテンプレートにはSuccessは付けない
    ・default/template/sitemapSuccess.phpでコンポーネントを呼び出す
      <?php include_component("compshare", "accessCheck")?>
------------------------------5H------------------------------
★symfony復習
●エラーチェック
・backendにnews_addモジュールを追加
  newsを投稿できるactionを作成
  public function executeSubmit()
  {
      //データベースに接続
      $news = new News;
      $news->setTitle($this->getRequestParameter("title"));
      $news->setArticle($this->getRequestParameter("article"));
      $news->setDeleteFlg("n");
      $news->save();

      $this->redirect("/");
  }
・バリデーション(エラーチェックを入れる)のために
  送信先のアクション名でvalidate/submit.ymlの作成
 
・yamlファイルの項目
  ・required:
    入力されているかどうかをチェック
  ☆注意☆
    フォームのmethodは"post"でないとバリデーションが効かない
------------------------------6H------------------------------
★symfonyテスト
-----------------------------memo------------------------------

2012年7月5日木曜日

2012年07月05日 講義092日目

2012年07月05日
講義092日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★SEOとかについて
  ターゲットキーワード
  同タイトルのサイトがあるか確認
  ページ構成によってSEO
------------------------------3H------------------------------
★symfony復習
●dev.shonanbbs.comの変更
・O/Rマッパ
  オブジェクトとリレーショナルデータベース
・executeModeltest()の作成
  executeIndex()のModelに接続してる部分を移行する
・retrieveByPk()でidからレコードを取得
  $this->member_two = MemberPeer::retrieveByPk(2);
●Criteriaの復習
・Criteria
  Criteriaはclass
・doSelect()
  $comments = CommentPeer::doSelect($c);
・doSelectOne()
  $this->firstcomment = CommentPeer::doselectOne($c);
  データが存在するかどうか確認したいときなど
・doCount()
  $this->cnt_comments = CommentPeer::doCount($c);
  条件に一致するレコードの件数を取得する
------------------------------4H------------------------------
★symfony復習
●Criteriaの復習
・lib/model/omのBaseMemberを見てみる 
・BaseMemberPeer.php
  オブジェクト化するためのクラス
・BaseMember.php
  オブジェクトから値を引き出す関数が記述されたクラス
・add()
  $c->add(CommentPeer::CATEGORY_ID, "1");
  $this->cate_one = CommentPeer::doSelect($c)
・add(Criteria::NOT_EQUAL)
  $c = new Criteria;
  $c->add(CommentPeer::CATEGORY_ID, "1");
  $this->cate_one = CommentPeer::doSelect($c);
  ↑new Criteriaしている理由は条件をクリアするため
  add()の場合には$cに条件が追加されているので$cを使いまわす場合には気をつける
------------------------------5H------------------------------
★symfony復習
●Criteriaの復習
・getNewCriterion()
  一つのカラムに対して複数の条件を加える場合(範囲指定など)
  $c = new Criteria;
  $now = date("Y-m-d H:i:s");
  $from = date("Y-m-d H:i:s", strtotime("-1 month"));
  $c1 = $c->getNewCriterion(CommentPeer::CREATED_AT, $now, Criteria::LESS_THAN);
  $c2 = $c->getNewCriterion(CommentPeer::CREATED_AT, $from, Criteria::GREATER_THAN);
  $c1->addAnd($c2);
  $c->add($c1);
  $this->one_month_comments = Comment::PeerdoSelect($c);
  条件を$c1、$c2と増やしてaddAnd()やaddOr()でつなげる
  最終的には$cにadd()でつなげる
☆addOr()もある
・addDecendingOrderByColumn()
  並べ替え関数
  $c = new Criteria;
  $this->id_order = MemberPeer::doSelect($c);

  $c->addDescendingOrderByColumn(MemberPeer::ID);

  $this->id_order_desc = MemberPeer::doSelect($c);

  $c = new Criteria;
  $c->addAscendingOrderByColumn(MemberPeer::ID);
  $this->id_order_asc = MemberPeer::doSelect($c);
------------------------------6H------------------------------
★symfony復習
●CRUDの復習
・Read
  $this->replys = ReplyPeer::doSelect($c = new Criteria);
  ↑を元にテンプレートでdev.shonanbbs.com/default/modeltest/up/1のようなurlを作るテーブルなどを作成
    ・getRequestParameter()
      dev.shonanbbs.com/default/modeltest以下の/up/1部分を受け取ることができる
・Update
  $up = $this->getRequestParameter("up");
  $reply->save();
  ☆is_object()でオブジェクトかどうか調べて条件分岐させる処理も必要になってくる
・Delete
  $del = $this->getRequestParameter("del");
  $reply = ReplyPeer::retrieveByPk($del);
  ・値を物理削除する場合
      $reply->delete();
  ・値を論理削除する場合はUpdateを使って削除用のカラムを書き換える
      $reply->setDeleteFlg("y");
      $reply->save();
-----------------------------memo------------------------------

2012年7月4日水曜日

2012年07月04日 講義091日目

2012年07月04日
講義091日目
------------------------------1H------------------------------
★復習
●symfonyの復習
・logについて
  デバックフラグを立てておくとlogファイルにlogがたまっていく
  vi、またはtail -f(リアルタイムで表示)
------------------------------2H------------------------------
★復習
●symfonyの復習
・wordpressとかec-cubeとかをwebの下に置けばとりあえず動く(symfonyとは関係ないが)
・アプリケーションの切り分けはサイトの見た目が完全に違う場合などに
・よく使うロジック→関数化→クラス化→プラグイン化という感じ
------------------------------3H------------------------------
★復習
●symfonyの復習
・使用するテンプレートの切り替え
  $this->settemplate()
・ymlファイルで、appsごとにプラグインを指定したりもできる
・symfony fix-permsでファイルの設定を標準化してくれる
・apacheの設定ファイルを変更する
  sakuraのスタンダードだと、etc/httpd/conf.d/httpd-vhost.confがいじれないので.htaccessで解決する
・symfony freeze コマンド(symfony unfreezeコマンドで解除)
  sandboxにする時に使う
  プロジェクトlib/にsymfony本体が入る(ライブラリっぽく?)ので、
  別の環境にプロジェクトごとコピーして
  ☆注意
  web/sfが存在する場合は、sfフォルダを作ろうとするのでsymfony freezeコマンドが失敗する
  別名で保存するか、削除するなりして対応しておく
------------------------------4H------------------------------
★symfonyの復習
●サイトマップを作る
  モジュールにする必要もないページなので、actionで作成する
・return sfView::SUCCESS;の省略
    public function executeSitemap()
    {
        return sfView::SUCCESS;
    }
    ↓
    public function executeSitemap()
    {
    }
    これでsitemapSuccess.phpを読み込みに行ってくれる
☆条件分岐も可能
    public function executeSitemap()
    {
        $error = "あり";
        if($error == "あり"){
            return sfView::ERROR;
        }else{
            return sfView::SUCCESS;
        }
●テンプレートを作る
・urlを省略できる条件
  rewriteRuleでルーティング
  routing.ymlで指定
    url:   /symfony/:action/*
    :→ルールに従って:以下の場所に飛ばす処理
    *→全て
------------------------------5H------------------------------
★復習
●symfonyの復習
・routing.ymlの編集
sitemap:
  url:   /sitemap/
  param: { module: default, action: sitemap }

sitemap:
  url:   /sitemap
  param: { module: default, action: sitemap }
☆linkが/sitemap/の場合
  ↑の順番を変えると、先にsitemapモジュールを探しにいってしまうので注意
●urlをリクエストパラメータとして扱う設定
・routing.ymlの編集
#パラメータのテスト用ルーティング
sitemap_test:
  url:   /sitemap/:name
  param: { module: default, action: sitemap, age: 31}

☆getRequestParameter()でnameを受け取れる
  executeSitemap()で
    echo $this->getRequestParameter("name");
    echo $this->getRequestParameter("age");
   と、記述しておくと受け取れていることがわかる
●よく使うymlファイルたち
  app/front/config/routing.yml
                 settings.yml
                 view.yml
                 securty.yml
  config/database.yml
●settings.ymlの設定について
  ・no_script_name:
  フロントコントローラー名をurlに使うか
  大抵はon
  ・404エラーの設定
    error_404_module:       default   # To be called when a 404 error is raised
    error_404_action:       error404  # Or when the requested URL doesn't match any route
  ・エスケープの設定
    escaping_strategy:      both       
    escaping_method:   ESC_ENTITIES  
  ・バリデーション(エラーメッセージ)の設定
    validation_error_prefix:    ''
    validation_error_suffix:    ''
●view.ymlの設定について
layout.phpの
<?php include_http_metas() ?>
<?php include_metas() ?>
<?php include_title() ?>
部分に反映される

☆サイトの文字化けを防ぐために
・文字化けの原因→読み込んでるアプリケーションの設定とファイルの文字コードが違う
  サーバー内での文字コードの指定
  ファイル内での文字コードの指定
  ブラウザ内での文字コードの指定
のズレがおきると文字化けが起こる
サーバーとファイルの文字コードを統一しておくのが良い
(symfonyで作成されるファイルのデフォルトはutf-8っぽい)
------------------------------6H------------------------------
★symfonyの復習
●app.ymlについて
  自分でymlファイルを作りたい場合はココに書く
  そのアプリケーションでしか使わない配列などを書く
●module/configにymlファイルを置く
    上位階層のymlファイルの内容より強い
    かぶる項目が存在した場合に、優先して反映させることができる
    もちろん内容の追加も可能
●schema.ymlについて
①propel-build-schema
  propel.iniの情報を元にshema.ymlを生成
②propel-build-model
  schema.ymlを元にlib/model
の流れ
●database.ymlについて
  デフォルトではコメントアウトされてる
  encoding:    utf-8などを書く
★dev.shonanbbsの変更をsvnにコミットする
・svn stut -u
  変更点の確認
・svn add
  svn add ファイル名で?のファイルをAに変更
・svn ci -m ""
  コミットする
-----------------------------memo------------------------------

2012年7月3日火曜日

2012年07月03日 講義090日目

2012年07月03日
講義090日目
------------------------------1H------------------------------
★SVN
●VMwareにSVNサーバーをインストール
・現在google codeにリポジトリを作成してるが、
  VMwareにSVNサーバーを立ててそちらにリポジトリを作成する
●SVNクライアント
・eclipceもプラグインを入れるとクライアントに出来たりする
・windowsだとtortoisesvnがある
☆今まではクライアントのみ使ってた
  サーバ機能はこれから設定する
●SVNサーバの設定
・リポジトリの作成
suでルートになる
[root@localhost  ユーザ名]# cd /var/www
この下にリポジトリを作る
[root@localhost www]# mkdir svn
[root@localhost www]# cd svn
・svnadminコマンド
[root@localhost svn]# svnadmin create shonanbbs
[root@localhost svn]# ls
shonanbbs
[root@localhost svn]# ls shonanbbs/
README.txt  conf  dav  db  format  hooks  locks
↑confをいじっていく
・権限を書き換える
  wwwからリポジトリを書き換えるためapacheに権限を与える
[root@localhost svn]# ls -l
合計 4
drwxr-xr-x 7 root root 4096  7月  3 10:54 shonanbbs
chown -R apache:apache shonanbbs
-Rでディレクトリ全てを指定
[root@localhost svn]# ls -l
合計 4
drwxr-xr-x 7 apache apache 4096  7月  3 10:54 shonanbbs
●用語復習
コミットする→リポジトリのバージョンを上げる
チェックアウトする→リポジトリからダウンロードする
パーミッション→アクセス権のこと
------------------------------2H------------------------------
★SVN
●SVNサーバの設定
・conf
[root@localhost svn]# cd shonanbbs/conf/
[root@localhost conf]# vi svnserve.conf
・読み込み書き込みの設定
# anon-access = read
# auth-access = write

anon-access = none
auth-access = write
(#の後のスペースは消さないと挙動しない)
・パスワードの設定
# password-db = passwd

password-db = passwd
・passwd
[root@localhost conf]# vi passwd
[users]
# harry = harryssecret
# sally = sallyssecret
ユーザ名 = パスワード
・bachの設定に追加
  rootでsvnを使うときのために環境変数を追加
[root@localhost ~]# vi .bash_profile
export SVN_EDITER="vi"
[root@localhost ~]# source .bash_profile
・SVNサーバーを起動させる
[root@localhost ~]# svnserve -d -r /var/www/svn

●ソースの管理と開発環境
・SVNの構成
trunk
本番
branches
開発
tags
バックアップ
・staging環境
テストのサーバーで本番ソース、本番DBによってテストする環境
ベータ版
------------------------------3H------------------------------
★SVN
●リポジトリの作成
・svn mkdir svn://サーバのアドレス/shonanbbs/trunk
rootでifconfigでサーバのアドレスを参照して入力
☆ifconfigはrootでしか動かない
・コミットする
  viでコメント入力画面が開くので何かを入力して終了
  エラーが出た場合にはコメントがsvnコマンドを打った場所に残るので
  これらがコミットされないように消すようにする
・sf.shonanbbs.comが別のsvnサーバと紐付いてるかどうか確認する
[ユーザ名@localhost ~]$ ls -a sf.shonanbbs.com/
.svnが無ければ紐付いてない
・svn import
svn import 元になるソースのパス リポジトリのパス
でコミットできる
------------------------------4H------------------------------
★SVN
●svnコマンド
・svn list リポジトリのパス
  コミットした内容を表示するコマンド
  [サーバ名@localhost ~]$ svn list svn://svnサーバIP/shonanbbs/trunk
  で/trunkの内容が表示される
 
☆linuxで日本語の文字でディレクトリを作成すると文字化けなどを起こす場合がある
ファイル名が指定出来ない
  もし作った場合には、そのディレクトリのほかの内容を退避させて
  そのディレクトリごと消すなどの対応になってしまうので注意
●tagsの作成
・svn mkdir svn://svnサーバIP/shonanbbs/tags -m ""
●リポジトリのコピー
・svn cp コピー元 コピー先
  svn cp svn://svnサーバIP/shonanbbs/trunk svn://svnサーバIP/shonanbbs/branches -m ""
●リポジトリの削除
  svn rm 削除したいリポジトリのパス

●開発環境のディレクトリを作成
sf.shonanbbs.comの開発環境として
[サーバ名@localhost ~]$ mkdir dev.shonanbbs.com
を作成
本番環境  sf.shonanbbs.com
開発環境  dev.shonanbbs.com
●check outコマンド
svn co check out元 check out先
●svn info
色々情報が出てくる

●dev.shonanbbs.comのパスを通す
  /etc/httpd/conf.d/httpd-vhost.confを編集
  /etc/init.d/httpd restart
  hostsファイルの編集
 
  開発環境のプロジェクト下で
  symfony fix-perms
  symfony cc
------------------------------5H------------------------------
★SVN
●本番環境と開発環境での注意点
・接続先のDB
操作→データベースのコピー先:
dev_studyと名付けた開発用のDBを作成
☆設定ファイルを変更したら
  symfony fix-perms
  symfony cc
☆symfonyでの本番環境と開発環境での注意点
・config.php
  $sf_symfony_lib_dir  = '/usr/share/pear/symfony';
  $sf_symfony_data_dir = '/usr/share/pear/data/symfony';
  などのディレクトリの変更
・database.yml
  dsn:でDBの変更
・propel.ini
  propel.database.createUrl  = 開発用のDB
  propel.database.url        = 開発用のDB/DB名
・setting.yml
  hostname:でアプリケーション間のhostnameを設定してるのでurlが違えば要変更
☆設定ファイルを変更したら
  symfony fix-perms
  symfony cc
 
●staging環境の作成
本番環境と同じソース、本番に上げる目前のテスト
/home/ユーザ名/staging.shonanbbs.com
のディレクトリを作成し。trunkのソースをチェックアウトしておく

http-vhost.confおよびhostsを編集し、ブラウザから確認できるようにする
サイトが表示されない場合
symfony fix-perms
symfony cc

config/settings.yml
らを変更する。データベースは本番の「study」DBを使用する
☆basic認証をかけたりする
staging環境と本番環境は
------------------------------6H------------------------------
★SVN
●デバックフラグ
・本番環境では見せてはいけないもの
・symfony
/web/index.php
/web/backend/index.php
の記述を変更する
define('SF_ENVIRONMENT', 'dev');
define('SF_DEBUG',       true);

define('SF_ENVIRONMENT', 'prod');
define('SF_DEBUG',       false);
●本番環境にsvnを反映させる
[サーバ名@localhost dev.shonanbbs.com]$ svn ci -m ""
・svnが反映されてないsf.shonanbbs.comの内容を全て削除
[サーバ名@localhost sf.shonanbbs.com]$ rm -rf *
フォルダごとでもかまわないが、ファイルを全て消すコマンドで対応
・trunkからチェックアウトする
[サーバ名@localhost sf.shonanbbs.com]$ svn co svn://サーバIP/shonanbbs/trunk
・色々と本番用に整える
  symfony fix-prems
  symfony cc
  hostnameの場所をなどを変更
-----------------------------memo------------------------------

2012年7月2日月曜日

2012年07月02日 講義089日目

2012年07月02日
講義089日目
------------------------------1H------------------------------
★職場体験
●サンプルソースについて補足
・phpの新しいバージョンではファイルを開いたらfopen()、fclose()で閉じる
------------------------------2H------------------------------
★最終課題発表に向けての準備
・色々と動かなくなってるのでやばい
・色々と動くようになったけどやばい
・scriptをwindow.onloadで動かすとかにトライ中
  →なんか出来た(ちゃんと出来てるか不明)
------------------------------3H------------------------------
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
★最終課題発表
-----------------------------memo------------------------------

2012年6月29日金曜日

2012年06月29日 講義088日目

2012年06月29日
講義088日目
------------------------------1H------------------------------
★職場体験
●インポートのプログラムを作成する
・任意のディレクトリを作成する
・実行権限のあるphpファイルを作成する
・コマンドでphpファイルを実行する
●ファイルが存在してるか確認の条件分岐
・file_exists()
------------------------------2H------------------------------
●ファイルを/csvから/importにコピーする
・copy()
・アパッチからの書き込み権限(その他の書き込み権限)が無かったので
  ブラウザ上からのコピーができてなかった
・puttyで自分のユーザで打てば解決
------------------------------3H------------------------------
●nkfコマンドを実行してutf-8に変換
・nkf -w --overwriteコマンドをphpのsystem()で実行するロジックを作成
☆linuxでしか動かない処理なので関数化するなどして複数の環境で対応できるようにする
●csvファイルを取り込む
・fopen()
・fgetcsv()  第二引数は一行のバイト数っぽい
・fgetcsv()はcsvファイルの接続情報しか変数に入らないので、接続情報をwhileでまわす
  $data配列をさらに別な$arr_import_file配列に入れて多次元配列で保持
  フラグを立てて、最初のカラム名部分を読み込まないロジックを作成してもいい
------------------------------4H------------------------------
●//データベースに接続
・配列を色々取得したりとか試行錯誤
・結局時間内には完成しなかった
  データベースに入力する部分までたどり着けなかったのは残念だ
------------------------------5H------------------------------
★職場体験
●インポートのプログラムの解説
・まずはファイル/ディレクトリ構成を決めておく
  base_csvディレクトリ→元になるcsvが置かれるべき場所
  tmpディレクトリ→作業ディレクトリ
  outputディレクトリ→吐き出されるcsvが置かれる場所
  logディレクトリ→ログ保存
  import_php→インポートの処理を行うプログラム
・ロジックの流れ
①ファイルのコピー
②データの読み込み、文字コードのチェック
③読み込んだデータを出力フォーマット配列に放り込む
  住所、沿線のチェック、必要に応じてログ吐き出し
④csvが置かれる場所に吐き出す
⑤tmpディレクトリのコピーを消す

☆returnでエラーの表示をして処理を終了させてもいい
  exitは使わないほうがいい
  exit(1);などで正常終了してるかを判断するなども可能
-----------------------------memo------------------------------

2012年6月27日水曜日

2012年06月27日 講義087日目

2012年06月27日
講義087日目
------------------------------1H------------------------------
★職業体験
●マッピングテーブルの作成
・m_stationのline_nameを抽出
SELECT line_name FROM m_station GROUP BY line_name;
・master_ensen_abstractのensen_nameを抽出
SELECT ensen_name FROM master_ensen_abstract GROUP BY ensen_name
------------------------------2H------------------------------
●マッピングテーブルの作成
・whileで回さないと配列にできないことをすっかり忘れていた件
$sql = "SELECT ensen_name FROM master_ensen_abstract GROUP BY ensen_name";
$result =mysql_query($sql);
$row = mysql_fetch_array($result);

while($row = mysql_fetch_array($result)){
    $sql_master_ensen_abstractEnsen_name[] =$row;
}

foreach($m_stationLine_name as $k => $v){
    foreach($master_ensen_abstractEnsen_name as $k2 => $v2){
        if($k == $k2){
            $ensen[] = $k;
        }else{
            $ensen2[] = $k
        }
    }
}
------------------------------3H------------------------------
●マッピングテーブルの作成
foreach($arr_master_ensen_abstractEnsen_name as $k2 => $v2){
    $flg = 0;
    foreach($arr_m_stationLine_name as $k => $v){
        if($v == $v2){
            $arr_ensen[$v] = $v2;
            $flg = 1;
        }
    }
    if($flg != 1){
        $arr_notmach_ensen[] = $v2;
    }
}
------------------------------4H------------------------------
●マッピングテーブルの作成
・similar_text()を使ってみた
foreach($arr_notmach_ensen as $k => $v){
    $flg = 0;
    foreach($arr_m_stationLine_name as $k2 => $v2){
        $c = similar_text($v, $v2, $percent);
        if($percent > 70){
            echo $v." と ".$v2." は ".intval($percent)."%一致します".$c."文字一致します<br>";
            $arr_ensen2[$v2] = $v;
            $flg = 1;
        }
    }
        if($flg != 1){
            $arr_notmach2_ensen[] = $v;
        }
    }
    print_r($arr_ensen2);
------------------------------5H------------------------------
●マッピングテーブルの作成
・マッピングに必要な沿線の総数→81件
・完全一致させるて抽出の結果→14件
・similar_text()を使用して抽出の結果
80%→36件
75%→44件 ほぼ大体間違えてない(気がする)
70%→56件 ほとんどマッチする、間違った結果もいくつか含まれた
65%→85件 なんだか微妙な結果に 重複が目に余る
60%→完全につかいものにならない結果に→数えるまでもない
------------------------------6H------------------------------
●インポートのプログラムを作成する
・目的:物件情報のcsv内のデータを
          沿線マッピングテーブル
          住所テーブル
          出力フォーマット
        を元にして、指定されたフォーマットに書き換えてcsvで出力するプログラムを作成する
・使用するファイル
  元となるcsvファイル、日々異なる内容のcsvを得る
  出力するcsvのフォーマット
  住所一覧のテーブル
●作業手順
・物件情報のcsvを読み込み、内容を出力用に書き換えてcsvで吐き出すロジックを作成する
●注意点
・csvを読み込んだだけでは文字化けしてる可能性がある
  ソース内で文字コードを変換する
  CentOS上で実施してるならexec関数でnkfコマンドを実行するなどして対処
・住所コードや沿線・駅コードに、実在しないデータが存在した場合は、その物件は処理しない
  (その際、エラーメッセージを出したり、ログに書き込むなどすると良い)
・出力ファイルに書き込む際にはflock関数を使って排他ロックする
・可能なら
    出力されるレコードの
    address_idには、「例)学園東町~」のデータを含む11桁の数字とする
    block_numberには、所在地詳細_非表示部のみが入る
  難しいなら、所在地名称と所在地詳細_非表示を合わせた文章をblock_numberカラムに入れる
-----------------------------memo------------------------------

2012年6月25日月曜日

2012年06月25日 講義086日目

2012年06月25日
講義086日目
------------------------------1H------------------------------
★職場体験
●コンバート
・コンバートの流れ
公開したいデータ
入力したいデータ
↓インポート
コンバートシステム
↓エクスポート↓
サイトA、サイトB……
・目的:記述の異なる二つの沿線情報をマッピングするためのマッピングテーブルの作成
  サイトによって違う情報をすり合わせるためにマッピングテーブルを作成
  コンバートするサイトによってデータの形式が違う
●sqlファイルをデータベースにインポート
・mysql> create database work_experience;
データベースを作る
・FFFTPで
homeディレクトリにコピー
mysql -u nishi -p データベース名 < インポートしたいsqlファイル.sql
・myphpadminで
インポートの項目からインポートする
------------------------------2H------------------------------
★職場体験
●テーブルの作成
・mappingテーブルの作成
ensen_id : char(4)
eki_id : char(3)
line_cd : char(5)
station_cd : char(7)
☆line_cdとstation_cdがユニークなキー
------------------------------3H------------------------------
★職場体験
●phpプロジェクトの作成
・VM内にディレクトリを作成
・vhostとかhostsとか色々設定
・以前使ったmyUtilでDBに接続→パスワードが間違っててハマる
  echo ini_set("display_errors","1");
  でエラーを表示させて、解決
・とりあえずprint_r()でDBの中身を表示
------------------------------4H------------------------------
★職場体験
●DBにcsvファイルをインポートする
・四苦八苦するなど
・結局カラムの型を適当にintに設定してたのが原因だった
  charと緯度経度はdoubleに変更して正常にインポートすることができた
------------------------------5H------------------------------
★職場体験
●SQL文を復習するとか
------------------------------6H------------------------------
★職場体験
●SQL文の入れ子
・IN()などで二つのDBのカラム名の比較が実現可能らしい
・master_ensen_abstractDBのline_nameと
  m_stationDBのensen_name|ensen_name_short
・master_ensen_abstractDBのstation_name
  m_stationDBのeki_name|eki_name_short
  がそれっぽく一致したレコードに
  m_stationDBのline_cd,station_cd
  master_ensen_abstractDBのensen_id,eki_id
  をレコードに入れる
  的なロジックを作る感じのアプローチかな
・なんとなく一致してるロジックは正規表現?がスキル的に無理かなーとか
-----------------------------memo------------------------------

2012年06月21日 講義085日目

2012年06月21日
講義085日目
------------------------------1H------------------------------
★最終課題
●昨日進めたこと
・jqueryの読み込みの順番の見直し、ライブラリ別に整理するなどの改善
・ログイン画面にhero-unitの導入
・問題点→レシートモジュールのメニューのjavascriptが効かなくなった
          <!-- bootstrap-image-gallery -->を読み込んでる部分で再度古いbootstrapを読み込んでいた

●actionからtemplateへassign
action側  $this->でsymfonyのクラスを使ってオブジェクトをassign
例)$this->comments = 何かの値
template側 
例)<?php foreach($comments as $comment):?>
    $comment->getCategoryId()や$comment->getUrl()のようにオブジェクトから値を引っ張る
------------------------------2H------------------------------
------------------------------3H------------------------------
●レシートモジュール
・Feed内の値の取得方法で完全に迷宮に突入
・一つのFeedからテンプレート側で色々取得できる感じだったのに、ほしいurlまでたどり着けなかった
  関数が用意されてない
・foreachの中で別の配列をインクリメントさせてまわすとかで解決した
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
●色々と行き詰るなど
-----------------------------memo------------------------------

2012年6月19日火曜日

2012年06月19日 講義084日目

2012年06月19日
講義084日目
------------------------------1H------------------------------
★小テスト返却
・vi で開いたファイル内の検索
/検索したい文字列で検索できる
例)/PHP
★最終課題
●コンポーネント
・コンポーネント化する部分について考えるとか
ログインページ(loguinSubmitのアクションで)
新規ユーザ登録ページ(loginモジュールでやるんじゃなくて別モジュールに飛ばして解決するほうがいい?)
使い方を見るページへ(別モジュールに飛ばすリンクのみ)
をdefault/indexに配置してるので、どうしようかと考える

結論→ログインモジュールはログインだけやらせる
      新規ユーザ作成モジュールを作成し、そこに飛ばすことに

●ログインの機能強化について
・setcookie()
  クッキーに接続情報を登録する関数
・データベースに最終アクセス日時が登録
  それとクッキーの中身を照合するロジックを配置するなどが必要
 
結論→そのうち作ってみるか
------------------------------2H------------------------------
●user_registrationモジュール
・とりあえずlogin画面と切り分け
・ボタンの場所とかレイアウトが気に食わないとかはとりあえず放置で
  むしろ、作業の優先順位的に新規作成モジュール自体を放置の予感
------------------------------3H------------------------------
●レシートモジュールを改修
・レシートの
  望む動きがページ遷移では実現できないっぽいことが判明
------------------------------4H------------------------------
●flexslider
・jqueryでコンテンツスライダーを実現する
  色々と探す、たくさんの候補があるがシンプルなものを選ぶ(時間がかかる)
・flexsliderというのがよさそうなので実装
------------------------------5H------------------------------
------------------------------6H------------------------------
●flexslider
・cssが効かないという問題
-----------------------------memo------------------------------
やらなきゃリスト
・レシートモジュールで取得したように
  マップモジュールで位置情報を取得する
  ポインタを位置情報の分だけ作成
  ・レシートモジュールに対して、そのレシート写真へのリンクを作る(レシートモジュールそういうアクションを作る)
  ・ドキュメントモジュールに対して、そのレシートドキュメントの編集リンクも作る(ドキュメントモジュールにそういうアクションを作る)

2012年6月18日月曜日

2012年06月18日 講義083日目

2012年06月18日
講義083日目
------------------------------1H------------------------------
★最終課題
●zend AuthSubの実装
------------------------------2H------------------------------
●zend AuthSubの実装
・find ./ -name "*.php" | xargs grep ""
でそのディレクトリにある.php内のキーワードを絞り込んで探せる
Zendまで行って関数を見に行くとかする
------------------------------3H------------------------------
●zend AuthSubの実装
・結局、マニュアルのAuthSubの説明のソースを使ったらうまくできた
・セッションに作成したトークンがモジュール間で重複していたのが原因の一つとしてありそうだったので、
そのあたりを解消できたっぽいので解決したという予想(結局原因は不明)
・echoされてる部分をheader()でリダイレクトに変更
------------------------------4H------------------------------
●zend AuthSubの実装
・ログアウトするとAuthSubで使ったセッションを消去したりするロジックを追加
  $_SESSION = array();
  セッションを空にするとか
  マニュアルではなんか色々と複雑なことをやってるっぽい感じだったけど
------------------------------5H------------------------------
●ドキュメント
FeedからspreadsheetKeyを取得するために試行錯誤してみるとか
------------------------------6H------------------------------
●ドキュメント
・spreadsheetKeyの取得
  strlen()で文字列の長さを取得
  str()でその文字列の長さ分削る
・メニューをスプレッドシート一覧にしてドキュメントの数だけループさせメニュー作成
  問題点→表示の上限をどうやって設定するか→登録したシートのみ表示させるとか
         
  ドキュメントは表示させるだけにしようか
・検索フォームも使いたい
-----------------------------memo------------------------------

2012年6月14日木曜日

2012年06月14日 講義082日目

2012年06月14日
講義082日目
------------------------------1H------------------------------
------------------------------2H------------------------------
●spreadsheetrenderer.js
・という便利なライブラリを公開してる人がいたのでありがたく使わせて頂く
http://webos-goodies.jp/archives/spreadsheetrenderer_js_an_easy_way_to_display_spreadsheet.html
・しかしサンプルソースではうまく動かなかった
<script type="text/javascript">
//template.addWindowEvent('load', function() {
  var renderer = new SpreadsheetRenderer({
    key: 'キーの値を入れます',
    template:'<li>%0% : %1% : %2%</li>' });

  renderer.render('select * limit 10', 'result');
//});
</script>
こうやったら動いた、自力では表示させられなかったので動きがよくわかってない
しかし、これで直接テーブルが作れるっぽいので試行錯誤してみるなど
------------------------------3H------------------------------
●小テスト
・Linuxコマンド
------------------------------4H------------------------------
●spreadsheetrenderer.js
・テーブルを表示させてみるなど
・表示はできたが、カラム名を読み込んでくれない仕様っぽいという問題
  解決プラン→カラム名決め打ちで<head>を準備してしまう
              例えば、ユーザの設定に配列で保持してそれを読み込むとか
              配列の数を数えてその分だけ<td>を作り出す<?php ?>を埋め込む
・そもそもテーブルを表示する必要あるのか疑問に思い始めるなど
・やっぱりinputモジュールが必要な気がしてきた
  receiptモジュールでインプットモードになるというのでもいいかもしれないが
------------------------------5H------------------------------
●google chart tools
・chartを表示させるテスト
・Homeのエリア3つ、タブでの表示切り替えについての問題点
  エリアが3つなので表示の迫力がなく、文字の視認性も悪くなってる
  表示エリアは2つが限界かもしれない
・やはりHomeが入力モードであるほうがいいのかも
  Homeでレシート画像、データ入力を登録
・レシートモジュールで画像をクリックすると編集モードになるように
・新たにチャートモジュールを作るのがいいかも
------------------------------6H------------------------------
●色々散漫になってきたので優先順位を考えるなど
・picasaに画像が入力できる
  spreadsheetにデータが入力できる
  spreadsheetのデータを編集できる
・入力したデータをチャートに表示できる
--------↑完成しないとグダグダになるライン---------
・カレンダーで購入履歴をチェックできる
・レシート画像表示選択で入力したデータの編集画面に飛ぶ
--------↓無ければ無いで諦めが付くライン-----------
・BBS機能
●サイトの構成を見直す
・チャートモジュールを作成
・Homeに入力フォーム領域、写真表示領域を作る
-----------------------------memo------------------------------
あと二週間で発表か

2012年06月13日 講義081日目

2012年06月13日
講義081日目
------------------------------1H------------------------------
★svn
●リポジトリの準備の流れ
・プロジェクトをサーバ側に作る
・クライアント側でバージョン管理したいプロジェクトを作成する
・クライアントとサーバを紐付ける.svnファイルを作成する(チェックアウト)
  svn checkout
・ひとまず空のプロジェクトをコミットする
  svn ci * -m ""
  リビジョンは1となる、中身はまだ無い
・クライアント側で開発が進行したら、差分を確認する
  svn stat -u
・コミットする
  svn ci * -m ""
  リビジョンは2となる
・symfonyで開発してる場合、cacheやlogをいちいちコミットするのは非効率なのでリポジトリにコミットされないように設定する
  svn propedit svn:ignore ./cache
  viの中に対象外にするファイルを指定する
  全ての場合は*/*(cacheフォルダの下のファイルまで全部)と記述して保存
  やり直したい場合はコマンドをもう一度打って編集
  svn propedit svn:ignore ./log
  viの中に対象外にするファイルを指定する
  全ての場合は*と記述して保存
  やり直したい場合はコマンドをもう一度打って編集
・.svnを編集したのでリポジトリにコミットする
  svn ci * -m ""
  リビジョンは3となる
・symfony側のcache、logを更新する
  symfony fix-permes
  symfony cc
  これでリポジトリとの差分が発生
・リポジトリとの差分を確認
  svn stat -u
・!の表示はリポジトリに存在しない発生したcache、logなので、それらを消去
  svn rm 「svn stat -uで表示された!のついたフォルダ」
  stat -uで表示される!をD(消去)にする
・cache、logの無い状態のプロジェクトをコミットする
  svn ci * -m ""
  リビジョンは4となる
●リポジトリを使う
・共同で開発してる場合は、開発を始める前にsvn up
  自分の開発がひと段落したらコミットするsvn ci -m ""
--------------------------------------------------------------
★.htaccessについて(これだと通らないので後で修正)
●sakuraのwwwに配置する.htaccessについて
/www  ←webルート
/www/project/web  ←frontのパス
/www/project/web/backend  ←他のアプリのパス
の場合

/www/.htaccess
RewriteEngine On
RewriteBase   /
RewriteRule ^(backend/.*)$ /project/web/backend/backend.php
            ↑どんなurlか  ↑どのディレクトリに飛ばすか
RewriteRule ^(.*)$ /project/web
            ↑RewriteRuleの一番最後には、それ以外のアドレスを打たれたらどうするかを指定
           
☆RewriteRuleは上から優先
☆sakuraの本ドメインを使うことにしたらプロジェクトのディレクトリを指定して、
  それ以外のディレクトリにアクセスできないようにする必要がある
------------------------------2H------------------------------
★最終課題
・ログインページに新規登録を追加
  新規登録のactionを増やす
・helpモジュールの作成
  bbsと連動させたいけど今は保留
  わからないことがあったらbbsにいって質問してねフォームを作るとかで対応
  開発者にメールする機能も作ろうかどうしようか、メールが来ても答えられない気がするからどうしよう
・tourモジュールの作成
  外部から専用ページなのでレイアウトはloginlogout.phpを使う
・bbsモジュールの作成
  actionでなんとかなるっぽい
☆カベージコレクト
  サイトの余分なデータをどうにかすること
  cronでtempのデータを消去したりする
  phpではgc~~()などで関数が用意されてる
------------------------------3H------------------------------
●googledocsのspredsheetのfeed
・資料を読むなど
------------------------------4H------------------------------
●googledocsのspredsheetのfeed
・feedの内容を取得してみるなど
------------------------------5H------------------------------
●Zend_Gdata_Spreadsheets
・色々と接続してみる
------------------------------6H------------------------------
●Zend_Gdata_Spreadsheets
・google chart toolsはWEBに公開してないと
  直接Spreadsheetsで作ったガジェットを表示できない
・というか、ガジェットを作るという手間を導入する意味が基本的に無いということに気が付いた
  どーしたもんかなー楽に表を作れるんじゃないかというイメージとは程遠かった
・Zend_Gdata_Spreadsheetsの構造化問い合わせで取得したい値をgoogle chart toolsで表示していく感じか
・google chart toolsのscriptに<php ?>を埋め込んで動的に表示させる方向で
-----------------------------memo------------------------------

2012年6月13日水曜日

2012年06月12日 講義080日目

2012年06月12日
講義080日目
------------------------------1H------------------------------
★最終課題
●backendのurl直打ち対策など
・default:
  is_secure: on
  credentials: [member, admin]
  に設定、is_secure: をonにし忘れて/backendに進入できるというミスをするなど
  とりあえず権限を持ってないとbackendには入れない状態
------------------------------2H------------------------------
●バックエンドのページ遷移を整えるなど
・404エラーページの表示
・defaultに申し訳程度にリンクを作る
・memberのcrudは基本的なバリデーションとかかける程度で放置の予定
・seculityは多分大丈夫な気がする
------------------------------3H------------------------------
------------------------------4H------------------------------
★バージョン管理ソフトの導入
●リポジトリの保存に際してキャッシュを対象外にする
・svnで使うエディターを設定する
  [ユーザ名@localhost ~]$ vi .bash_profile
  export SVN_EDITOR="vi"
  を最後の行に追加
  [ユーザ名@localhost ~]$ source .bash_profile
  で変更を有効にする

・キャッシュとログを弾く.svnの設定を書き換える
  リポジトリにコミットされない様に設定
  svn propedit svn:ignore ./cache
  viの中に対象外にするファイルを指定する
  全ての場合は*/*(cacheフォルダの下のファイルまで全部)と記述して保存
  やり直したい場合はコマンドをもう一度打って編集
  svn propedit svn:ignore ./log
  viの中に対象外にするファイルを指定する
  全ての場合は*と記述して保存
  やり直したい場合はコマンドをもう一度打って編集
・svn stat -u
  M→変更がある
  A→新たに追加
  ?→リポジトリに無い
  !→リポジトリにしかない
  D→削除予定
  C→コンフリクト
・開発したソースをリポジトリにコミットするための準備
  svn add *で?をAする
  svn delete *で!をDにする

------------------------------5H------------------------------
●google docsのフィードの表示を試行錯誤してみる
・カレンダーと同様にClientAuthで接続(後日Auth subに変更する)
          //スプレッドシートの一覧の取得
        $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
        $spreadsheetService = new Zend_Gdata_Spreadsheets($client);
        $feed = $spreadsheetService->getSpreadsheetFeed();

        foreach($feed->entries as $entry){
            echo $entry->title->text;
            echo "<br>";
        }
------------------------------6H------------------------------
●google docsのフィードの表示を試行錯誤してみる
・spreadsheetKey
  どうやらURLらしい
  すでに取得してるらしい
-----------------------------memo------------------------------

2012年6月12日火曜日

2012年06月11日 講義079日目

2012年06月11日
講義079日目
------------------------------1H------------------------------
★最終課題
●マイアカウント画面作成
・タブ表示にする部分とそうでない部分を悩むなど
・タブ一つにつき一つのアクション(一つのタブにつき一つのデータベースを更新)
  コンポーネントにするという手もあるっぽいが、動的じゃないのでパーシャルでいい気がする
  アクションとテンプレートが連携していればコンポーネントということになるっぽい
  クラス作らないとコンポーネントとして定義できないから調べる
・モジュール内のテンプレートを指定する方法
  <?php include_partial("モジュール名/_テンプレート名")?>
------------------------------2H------------------------------
●マイアカウント画面のフォームを作成する
・formタグの@~~とか、別に今はとりあえず使わないでいいか
・なんかフォームがズレる件
------------------------------3H------------------------------
●modelとschema
・symfony propel-build-modelでデータベース名Peer.phpのextendした関数は上書きされてしまうんだっけ?
・backendにmemberモジュールを作成
・[ユーザ名@サーバ名 ~/www/sftest]$ symfony propel-generate-crud backend member Member
  引数は三つ、また間違えてサーバに怒られるなど
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
★バージョン管理ソフトの導入
●SVN
・リポジトリ
  ソースの情報を管理する
・SVNサーバ用のソフトをインストールして使う
・クライアント側にもソフトをインストールする
[root@localhost ユーザ名]# yum -y install subversion mod_dav_svn
・svnサーバをネット上に持つ
  google codeを使う
  http://code.google.com/hosting/
  ・Project name  自分のプロジェクト名
    Version control system  Subversion
    などを記入してプロジェクトを作成
  ・自分のサーバのプロジェクトがある階層に[ユーザ名@サーバ名 ~/www]$ mkdir sftest_dev
  ・goglecodeのsouceタブを開き、
    svn checkout https://自分のプロジェクト名.googlecode.com/svn/trunk/ sftest-mis019 --username 自分のグーグルアカウント名
    を打つ
  ・開発してるディレクトリをコピー
  ・.svnのあるフォルダでリポジトリを作成するコマンド svn add * を打つ
  ・svn ci * -m ""
    -m はコメントを入れるオプション""で空文字を入れる
    空文字を入れないとviでコメントを入れないとならなくなる
●よく使うsvnコマンド
  ・コピー先に移動して
    svn add *
    svn ci * -m ""
  ・状態を調べる
    svn stat -u
    svn info
  ・リポジトリを消す
    svn rm
    svn delete
  ・複数のリポジトリ間で環境を一致させる
    svn merge
  ・ソースの衝突(コンフリクト)を解除する
    svn resolved
  ・リポジトリ無いのソースの表示
    svn list
  ・最新のリポジトリ情報で更新
    svn up
  ・リポジトリの情報でプロジェクトを作成
    svn co
   
●リポジトリをgooglecodeからチェックアウトする
  ・まだsvn管理していない本来のソースのあるプロジェクトに移動して
    svn checkout https://自分のプロジェクト名.googlecode.com/svn/trunk/ ./ --username 自分のグーグルアカウント名
    を打ってみる
  ・リポジトリがあるかどうか確認する
    googlecodeのBrowseで見ることができる
  ・チェックアウトできたらsymfonyコマンドで権限などを整える
    symfony fix-parms
    symfony cc

●バージョンを上げる場合
  svn stat -u
    差分を表示する
      M→変更されたファイル
      ?→新たに作られたファイル
    symfonyの場合は、cacheを避けたディレクトリで打つなどする
  svn add
  svn ci * -m ""

・データベースの情報はとって置けないのでdumpでどこか別に保持する

●レンタルサーバにsvnクライアントをインストール
svn infoでサーバに存在してるか確認
●xammpにsvnクライアントインストール
TortoiseSVNをインストール
外部でリポジトリを持ちたくない場合など
-----------------------------memo------------------------------
問題点メモ
マップ
表示にhtmlを宣言するときに publicを入れるとマップが表示されない
メニューの検索などのスタイルがpublicを入れないと崩れる

レシート
bootstrap ImageGalleryの挙動がなんかおかしい

マイアカウント
フォームのズレ

symfony propel-build-modelでデータベース名Peer.phpのextendした関数は上書きされてしまうんだっけ?

2012年6月8日金曜日

2012年06月08日 講義078日目

------------------------------1H------------------------------
★最終課題
●イメージギャラリーの設置
・マニュアルを見て試行錯誤
・スクリプトを読み込む位置に迷うなど→<head>でいいんじゃねという結論
レイアウトの切り分けも後でいいんじゃないかと思うなど
------------------------------2H------------------------------
●イメージギャラリーの設置
単純に<a href="">で指定するファイルの記述を間違っていただけ
とりあえず表示されたので、順次以下の問題を解決する
  picasaと接続した場合の表示
  サムネイルを並べて表示させたい
  ナビバーのメニューで昇順降順、年月日別、タグ別、店別などのソートができるといい(これは全ての機能に実装したい)
------------------------------3H------------------------------
●picasaへの接続テスト
symfonyがlibの下に置いてあるclassは読み込んでくれるのでrequire_onceとかを書かなくても良い
UserFeedは取得できるが、AlbumFeedが取得できずサムネイルが表示できない
インクリメントする前の変数は$i = 0;などで初期化しておくと、Noticeが出ないっぽい
サンプルソースのエスケープが効いてなかったっぽくて肝心の画像表示部分がソースに隠れてたorz
------------------------------4H------------------------------
●backendの作成
管理者は少人数なのでコマンドでざっくり作る
装飾などは別にやらなくていいかも
セキュリティだけは完全にする
●sfPageFrowでざっくり作るために
rootが取れるサーバでやらないとできない
☆同じデータベース名などで上書きされてしまう可能性があるので、気をつける
念のためにgenerate用のプロジェクトなどを作るのがいいかも
①schema.ymlのテーブル情報をrootが取れるサーバにコピー
②build-model
③symfony propel-generate-crud コマンドを使う
作られたモジュールをrootが取れないサーバにコピーするなどして使う
------------------------------5H------------------------------
------------------------------6H------------------------------
●マイアカウントページの作成
ユーザが自分のデータベースの内容を編集できる
やり直す機能なども実装したい、前の設定に戻す、デフォルトに戻すなど
conf_map
conf_calendar
conf_document
conf_receipt
テーブルの作成

中身はサービスが出来てきたら考える

-----------------------------memo------------------------------

2012年06月07日 講義077日目

2012年06月07日
講義077日目
------------------------------1H------------------------------
●ログインのレイアウトを独立させる
・layoutの切り替えを実装、各modulesのconfigにview.ymlを設置
・frontのtemplateにloginlogout.phpという新しいテンプレートを設置しそれを読み込む
------------------------------2H------------------------------
●マップ用の<head>を作るために
・_head.phpテンプレートを独自に作成させるプラン
  _head.phpテンプレート内で条件分岐させるプラン
↓ではなく
スロットを使って解決
☆どうやらfooterでjsで読み込んでるので全て表示されるまでjquery部分が動かない
  最適化する必要がある
 
●_menu.phpのメニューで表示中のページがアクティブになるようにする
<?php $module = $sf_context->getModuleName();?>
        <li <?php echo($module == "default")?"class=\"active\"":"";?>><a href="/">Home</a></li>
       
●404ページが表示されない件
☆error404Success.phpがerror404SUCCESS.phpと間違っていた
------------------------------3H------------------------------
★ログイン、ログアウトの実装
●modelが作成されない件
☆propel.iniとdatabase.ymlの設定をサーバにつなぐための値に変更し忘れてた
●ログイン機能の実装
seculity.ymlの編集でmember権限が無い場合にログインページに飛ばす処理をする

ログインの挙動メモ
①バリデーションにかける
  カスタムバリデーションを作って、ログイン失敗したら戻す
②executeSubmitでテンプレートを指定する
例)
  $this->setTemplate("読み込ませたいテンプレート");
  $this->mailaddress = $this->getRequestParameter("mailaddress");
  などにしてアサインする
③forwordさせる(handleerrorと同じ挙動)or redirect
例)
  $this->forword("default","index");

  ①と②、①と③を組み合わせるパターンで作成するのが良い
●handleErrorSubmit()の作成
とりあえずバリデーションを作成した後のために作った
------------------------------4H------------------------------
●ログアウト実装
logoutモジュールにseculity.ymlを作成して、  is_secure: offに設定
loginモジュールにもseculity.ymlを作成して、  is_secure: offに設定
してやらないと、権限が無くて挙動がおかしくなる
☆loginモジュールにexecuteSubmitを作成したのはバリデーションをかけるため
------------------------------5H------------------------------
------------------------------6H------------------------------
●Zendを読み込むために
libの下に直接Zendのライブラリを配置して解決するしかなかった
本来ならpearでインストールしたZendを読み込んで、複数のプロジェクトから読み込みたかったが
今はとりあえずこれで読み込めてるので我慢して開発していく
-----------------------------memo------------------------------
やらなきゃならんことメモ
bootstrap ImageGalleryの設置

2012年6月5日火曜日

2012年06月05日 講義076日目

2012年06月05日
講義076日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★最終課題開発
●仕様書の作成
・内部仕様書
  データベース構成を大体決める
・外部仕様書
  画面遷移図の作成
・ページの構成
  ユーザが移動できるのはfrontのみ
  backendは管理者(とりあえず一人)のみ
  backendに関しては基本的にsymfonyで作成、とりあえず見た目は凝らなくていいんじゃないか
------------------------------3H------------------------------
●各メニューページの作成
・各ページを作成していく
・遷移のテスト
------------------------------4H------------------------------
●データベースとテーブルの作成
・さくらの管理ページからデータベースを作成する
  テーブルも少ないのでとりあえず作ってテスト用のデータを入力
・routing.yml
色々設定できる
・404ページを作成
先に作っておいて、表示されたらリンクとrouting.ymlを確認する的な
setting.ymlの404の設定部分のコメントが外れてることを確認

・datanases.ymlの接続情報を編集
dsn:          mysql://ユーザ名:パスワード@データベースサーバ名/データベース名
・テーブルを作る
CREATE TABLE member (
id int not null auto_increment,
username text,
mailaddress text,
password text,
admin_yn char(1),
delete_yn char(1),
updated_at datetime,
created_at datetime,
primary key(id)
);

データの入力
INSERT INTO member(
username, mailaddress, password, admin_yn, delete_yn, updated_at, created_at)
values
("test1", "test1", "test1", "y", "n", "2012-06-06 00:00:00", "2012-06-05 00:00:00");
sql文がぜんぜん受け付けられなくて四苦八苦(結局カラム名に""を使ったのが原因っぽい)
------------------------------5H------------------------------
●ruthingとかなんとかで詰る、集中力が完全に終了するなど
------------------------------6H------------------------------
●なんだかbackendに.htaccessをコピーして書き換えるとかなんとか
-----------------------------memo------------------------------

2012年06月04日 講義075日目

2012年06月04日
講義075日目
------------------------------1H------------------------------
★最終課題開発
●.htaccessの挙動がコントロールできない
・色々いじるが結局symfonyに飛ばせないのでサブドメインを取得して直接飛ぶことにした
・mod_rewriteの挙動は公開するまでになんとか把握することに
・正規表現も同時に学習しないと
------------------------------2H------------------------------
●.htaccessの挙動への対応
・BASIC認証をかける
・symfonyのプロジェクトはサブドメインで対応
・その他のテストファイルは放置
・wordpressとec-cube、ポートフォリオ(予定地)も順次サブドメインに逃がす
問題→取得できるサブドメインが一個足りないのでどうしたもんか
------------------------------3H------------------------------
●googlemapのapiを使う場合
<!DOCUTYPE PUBLIC>

PUBLICを消去しないと動かない
●smartyで書かれたレシート管理webサービスをsymfonyに移行する
・とりあえずトップページからコピペで、動かないであろう部分の修正
・menuなどのテンプレート部分をsymfony向けに見直すなど
------------------------------4H------------------------------
●レイアウト、設定などの移行作業
・/web/index.php
開発中のデバック有効にする
・開発中の表示部分の見栄えをよくするためのシンボリックリンクを作成(というか丸ごとコピーでも可)
[ユーザ名@サーバ]$ find ./ -name sf
./local/lib/php/data/symfony/web/sf
これをコピー
[ユーザ名@サーバ ~/www/sftest/web]$ cp -a /home/ユーザ名/local/lib/php/data/symfony/web/sf ./sf
------------------------------5H------------------------------
●jqueryのCDN
・リンクを貼る場所に悩む
とりあえず
・cssファイルへのリンク→_head.php
bootstrapとかもCDNあると楽なんだけど、なんか見つけられなかった

・scriptへのリンク→_footer.php
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>

なんかheadに書いたほうが気がするけどfooterでまとめて管理、後でどちらが良いのか調べる
------------------------------6H------------------------------
●モジュールを作る
・zendでつなぐ予定のモジュール→calendar、map、receipt、を作成
早いところ大枠を作って接続、編集、サイトに結果を反映まで行かないと間に合わないかも
カレンダー→google calendar
地図→google map
データシート→google docs
レシート→picasa
を使う予定
・わかりにくかったレシート、データシートメニューの改善

データシートはdocument
・費目だけではなく、タグ的なカラムも設定した方が検索などにもいいんだろうけど
  複数のタグを入力とかに対応するのはどうしよう
-----------------------------memo------------------------------
・明日はとりあえずはバックエンドと外枠の使用を固める
・ユーザの設定ファイルのみをデータベースに保持する
  費目などののユーザによる設定などを実装したい

2012年6月4日月曜日

2012年06月01日 講義074日目

2012年06月01日
講義074日目
------------------------------1H------------------------------
★symfony
●pager
・.pagerをstyle.cssに追加
.pager {
    text-align: center;
}

.pager ul {
    text-align: center;
    height: 25px;
}

.pager li {
    margin: 0 6px;
    display: inline;
    zoom: 7;
}

・pagerの拡張
ヘルパーを
/lib/helper/MyPagerQueryHelper.php
配置

/fornt /default actions.class.php
$this->search_arr = array()
に追加
        $this->search_arr = array(
        //pager機能に持たせるクエリパラメータ

        //実装するページのモジュールとアクション名
        "module" => "default",
        "action" => "index" ,
        //昇順降順情報
        "order" => $this->getRequestParameter("order_by"),

/front /default indexSuccess.php
<?php include_partial("global/pager",
            array("pager" => $pager,
                  "query" => $sf_context->getModuleName().
                             "/".
                             $sf_context->getActionName().
                             "?"
                 )
)?>

<?php include_partial("global/pager",
            array("pager" => $pager,
                  "query" => parameter_to_query(
                                $sf_context->getModuleName(),
                                $sf_context->getActionName(),
                                $search_arr)
                 )
------------------------------2H------------------------------
★symfony
●昇順降順機能の実装
・とりあえずリンクを作る
front /default actions.class.php

<?php  if($search_arr["order_by"] != "asc"):?>
<a href= "./?order_by=asc">created_atをascで並び替える</a>
<?php else:?>
<a href= "./order_by=desc">created_atをdescで並び替える</a>
<?php endif;?>


・クリックしたら出力が逆になる
→MODELの修正
/model CommentPeer.php

        //pagerの昇順降順入れ替えのための条件分岐
        if($search_arr["order_by"] != "asc"){
            $c->addDescendingOrderByColumn(self::CREATED_AT);
        }else{
            $c->addAscendingOrderByColumn(self::CREATED_AT);
        }

・他のパラメータも持ったままにする
→テンプレートの修正


class CommentPeer extends BaseCommentPeer
{
    static function getBbsArticles($search_arr = array(), $page = 1, $perpage = 10){
        $c = new Criteria;

        //$search_arrが存在する場合、検索条件によりadd
        foreach($search_arr as $k =>$v){
            switch($k){
                case "word":
                    if($v != ""){
                        $c->add(self::CONTENT, "%{$v}%", Criteria::LIKE);
                    }
                    break;
                case "category":
                    if($v != ""){
                        $c->add(self::CATEGORY_ID, $v);
                    }
                    break;
                case "date_start":
                case "date_end":
                    if(isset($date_flg)){
                        break;
                    }
                    //一つのカラムに複数の条件をつける際にgetNewCriterion()を使う
                    if($search_arr["date_start"] && $search_arr["date_end"]){
                        $c1 = $c->getNewCriterion(self::CREATED_AT,$search_arr["date_start"], Criteria::GREATER_EQUAL);
                        $c2 = $c->getNewCriterion(self::CREATED_AT,$search_arr["date_end"], Criteria::LESS_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($search_arr["date_start"]){
                        $c->add(self::CREATED_AT,$search_arr["date_start"],Criteria::GREATER_THAN);
                    }elseif($search_arr["date_end"]){
                        $c->add(self::CREATED_AT,$search_arr["date_end"],Criteria::LESS_THAN);
                    }
                    $date_flg = 1;
                    break;
                case "photo":
                    if($v == "y"){
                        $c1 = $c->getNewCriterion(self::PHOTO, "", Criteria::NOT_EQUAL);
                        $c2 = $c->getNewCriterion(self::PHOTO, NULL, Criteria::NOT_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($v == "n"){
                        $c1 = $c->getNewCriterion(self::PHOTO, "");
                        $c2 = $c->getNewCriterion(self::PHOTO, NULL);
                        $c1->addOr($c2);
                        $c->add($c1);
                    }
                    break;
                case "url":
                    if($v == "y"){
                        $c1 = $c->getNewCriterion(self::URL, "", Criteria::NOT_EQUAL);
                        $c2 = $c->getNewCriterion(self::URL, NULL, Criteria::NOT_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($v == "n"){
                        $c1 = $c->getNewCriterion(self::URL,"");
                        $c2 = $c->getNewCriterion(self::URL,NULL);
                        $c1->addOr($c2);
                        $c->add($c1);
                    }
                    break;
            }
        }

        //自身のクラスを参照する場合のみ、「Peer」ではなく「salf」で参照する

        //pagerの昇順降順入れ替えのための条件分岐
        if($search_arr["order_by"] != "asc"){
            $c->addDescendingOrderByColumn(self::CREATED_AT);
        }else{
            $c->addAscendingOrderByColumn(self::CREATED_AT);
        }


        //ページ数とページ位置により、表示する内容を操作するクラス
        $pager = new sfPropelPager("Comment",$perpage);
        $pager->setCriteria($c);
        $pager->setPage($page);
        $pager->init();
        return $pager;

        //↓sfPageFlowを使わない場合
        //return self::doSelect($c);
    }

↓関数を分割してわかりやすく
    static function getBbsArticles($search_arr = array(), $page = 1, $perpage = 10){
        $c = new Criteria;

        //$search_arrが存在する場合、検索条件によりadd
        foreach($search_arr as $k =>$v){
            switch($k){
                case "word":
                    if($v != ""){
                        $c->add(self::CONTENT, "%{$v}%", Criteria::LIKE);
                    }
                    break;
                case "category":
                    if($v != ""){
                        $c->add(self::CATEGORY_ID, $v);
                    }
                    break;
                case "date_start":
                case "date_end":
                    if(isset($date_flg)){
                        break;
                    }
                    //一つのカラムに複数の条件をつける際にgetNewCriterion()を使う
                    if($search_arr["date_start"] && $search_arr["date_end"]){
                        $c1 = $c->getNewCriterion(self::CREATED_AT,$search_arr["date_start"], Criteria::GREATER_EQUAL);
                        $c2 = $c->getNewCriterion(self::CREATED_AT,$search_arr["date_end"], Criteria::LESS_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($search_arr["date_start"]){
                        $c->add(self::CREATED_AT,$search_arr["date_start"],Criteria::GREATER_THAN);
                    }elseif($search_arr["date_end"]){
                        $c->add(self::CREATED_AT,$search_arr["date_end"],Criteria::LESS_THAN);
                    }
                    $date_flg = 1;
                    break;
                case "photo":
                    if($v == "y"){
                        $c1 = $c->getNewCriterion(self::PHOTO, "", Criteria::NOT_EQUAL);
                        $c2 = $c->getNewCriterion(self::PHOTO, NULL, Criteria::NOT_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($v == "n"){
                        $c1 = $c->getNewCriterion(self::PHOTO, "");
                        $c2 = $c->getNewCriterion(self::PHOTO, NULL);
                        $c1->addOr($c2);
                        $c->add($c1);
                    }
                    break;
                case "url":
                    if($v == "y"){
                        $c1 = $c->getNewCriterion(self::URL, "", Criteria::NOT_EQUAL);
                        $c2 = $c->getNewCriterion(self::URL, NULL, Criteria::NOT_EQUAL);
                        $c1->addAnd($c2);
                        $c->add($c1);
                    }elseif($v == "n"){
                        $c1 = $c->getNewCriterion(self::URL,"");
                        $c2 = $c->getNewCriterion(self::URL,NULL);
                        $c1->addOr($c2);
                        $c->add($c1);
                    }
                    break;
            }
        }

        //昇順降順を指定
        $c = self::setOrderByParam($search_arr["order_by"], $c);

        //getPropelPagerObject()のオブジェクトを取得
        $rtn = self::getPropelPagerObject($c, $perpage, $page);
        return $rtn;

        //↓sfPageFlowを使わない場合
        //return self::doSelect($c);
    }

    protected static function setOrderByParam($param, $c){
                //自身のクラスを参照する場合のみ、「Peer」ではなく「salf」で参照する

        //pagerの昇順降順入れ替えのための条件分岐
        if($param != "asc"){
            $c->addDescendingOrderByColumn(self::CREATED_AT);
        }else{
            $c->addAscendingOrderByColumn(self::CREATED_AT);
        }
        return $c;
    }

    protected static function getPropelPagerObject($c, $perpage, $page){
        //ページ数とページ位置により、表示する内容を操作するクラス
        $pager = new sfPropelPager("Comment",$perpage);
        $pager->setCriteria($c);
        $pager->setPage($page);
        $pager->init();
        return $pager;
    }
------------------------------3H------------------------------
★symfony
●pager
・パラメータを取得できるようにする

actions.class.php

$this->search_arr = array(

"order_by" => $this->getRequestParameter("order_by", "desc"),
を追加

        //パラメータの値を書き換える処理
        if($this->search_arr["order_by"] == "desc"){
            $this->search_arr["order_by"] = "asc";
        }else{
            $this->search_arr["order_by"] = "desc";
        }
indexSuccess.php

<?php //pagerでリンクを作るときのパラメータ取得部分を変数に入れですっきりさせた
$query = parameter_to_query($sf_context->getModuleName(), $sf_context->getActionName(), $search_arr)?>

<?php include_partial("global/pager", array("pager" => $pager, "query" => $query))?>
<?php //ifでascかdescを各々出力させていた部分をパラメータの値を省略?>
<a href= "/<?php echo $query?>">created_atを<?php echo $search_arr["order_by"]?>で並び替える</a>
------------------------------4H------------------------------
★symfony
●symfony freezeとsymfony unfreezeでsandboxにする
・symfony freeze
symfonyのライブラリを別の領域にコピーして独立させることができるコマンド
バージョン管理などで使う
☆使うときに/web/sfは消しておく(あるとコマンドが効かない)
・symfony unfreeze
symfonyのバージョンアップなどを反映させるためにfreezeを解除させるコマンド
☆注意点!
・sandbox化した後の権限を正常にする
symfony fix-parms

●開発用symfony環境サーバ→本番用symfony環境サーバ移行の注意点
バージョンに注意
configのサーバのパスなどに注意

開発環境
複数の場所で開発したりする

●開発フロー
テスト環境
データベース、アプリケーションのバージョンを本番環境と同様にして動かす
細かい詰め作業をする
うまくいかなかったら開発環境に戻る

本番環境
実際に稼動させる

●バージョン管理ソフト
Subversionなどのソフトで管理
------------------------------5H------------------------------
★最終課題
centOSかxammpで開発しておき、後でリリース
●サーバ選び
・CGIが使えるかどうか(自分の開発言語、たとえばPHPが使えるかどうか、バージョン情報も確認)
・DBが使えるかどうか
・MYSQLが使えるかどうか
別に他のデータベースを使うんでもいい
・取れるサブドメイン、メールアカウントの数
SEO的に共有だと同サーバの他のサイトにも影響しあう
・SSH接続
無いとputtyとかでつなげない
●制作の条件
なんでもいい
外部に公開するつもりで作る
------------------------------6H------------------------------
★最終課題開発
●.htaccess
/local/lib/php/htdocs/sf.testにリダイレクトする
はずだったが、うまくいかないので
/wwwに直接プロジェクトを作成
・[nishi@localhost web]$ vi .htaccess
Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
  RewriteEngine On

  # uncomment the following line, if you are having trouble
  # getting no_script_name to work
  #RewriteBase /

  # we skip all files with .something
  # comment the following 3 lines to allow periods in routes
  RewriteCond %{REQUEST_URI} \..+$
  RewriteCond %{REQUEST_URI} !\.html$
  RewriteRule .* - [L]

  # we check if the .html version is here (caching)
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller
  RewriteRule ^(backend/.*)$ backend/backend.php [QSA,L]
  RewriteRule ^(.*)$ ./sftest/web/index.php [QSA,L]
</IfModule>

# big crash from our front web controller
ErrorDocument 500 "<h2>Application error</h2>symfony application failed to start properly"

・↑だとうまくいかないので次回に
-----------------------------memo------------------------------