2011年4月22日金曜日

簡単な求人プロジェクト用のデータベースをsymfonyに設定

まずデータベースとテーブル構造を生成!
  1. とりあえず下記のテーブル構成を図解してみる
  2. config/doctrine/schema.ymlに下記内容を記述(各項目の詳細な説明は下記に記述)
    ※ここで注意しないといけないのが「タブ」は使用できないので注意!
    # config/doctrine/schema.yml
    
    # カテゴリマスターテーブル
    JobeetCategory:
      actAs: { Timestampable: ~ }
      options:
        type: MyISAM
        collate: utf8_unicode_ci
        charset: utf8
      columns:
        name: { type: string(255), notnull: true, unique: true }
    
    # 求人テーブル
    JobeetJob:
      actAs: { Timestampable: ~ }
      options:
        type: MyISAM
        collate: utf8_unicode_ci
        charset: utf8
      columns:
        category_id:  { type: integer,      notnull: true }
        type:         { type: string(255) }
        company:      { type: string(255),  notnull: true }
        logo:         { type: string(255) }
        url:          { type: string(255) }
        position:     { type: string(255),  notnull: true }
        location:     { type: string(255),  notnull: true }
        description:  { type: string(4000), notnull: true }
        how_to_apply: { type: string(4000), notnull: true }
        token:        { type: string(255),  notnull: true, unique: true }
        is_public:    { type: boolean,      notnull: true, default: 1 }
        is_activated: { type: boolean,      notnull: true, default: 0 }
        email:        { type: string(255),  notnull: true }
        expires_at:   { type: timestamp,    notnull: true }
      relations:
        JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }
    
    # アフィリエイトテーブル
    JobeetAffiliate:
      actAs: { Timestampable: ~ }
      options:
        type: MyISAM
        collate: utf8_unicode_ci
        charset: utf8
      columns:
        url:       { type: string(255), notnull: true }
        email:     { type: string(255), notnull: true,            unique: true }
        token:     { type: string(255), notnull: true }
        is_active: { type: boolean,     notnull: true, default: 0 }
      relations:
        JobeetCategories:
          class:        JobeetCategory
          refClass:     JobeetCategoryAffiliate
          local:        affiliate_id
          foreign:      category_id
          foreignAlias: JobeetAffiliates
    
    # アフィリエイトカテゴリコネクタテーブル
    JobeetCategoryAffiliate:
      options:
        type: MyISAM
        collate: utf8_unicode_ci
        charset: utf8
      columns:
        category_id:  { type: integer, primary: true }
        affiliate_id: { type: integer, primary: true }
      relations:
        JobeetCategory:  { onDelete: CASCADE, local: category_id, foreign: id }
        JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }
  3. 次に上記で記述したスキーマをいれるためのデータベースを生成
    ※今回はMySQLでの作成と想定して、rootユーザーにjobeetというデータベースをphpMyAdminからかコマンドからかで作成してください
    ※データベースのオプションとして、照合順序は「utf8_unicode_ci」と想定して話を進めます
  4. それでは早速上記スキーマを使用して実際に流しこんでみる
    1. まずさきほど生成したデータベースを今回のsymfony側に下記コマンドから設定
      1. php symfony configure:database "mysql:host=localhost;dbname=jobeet" root (rootユーザーのパスワード)
      するとまず「config/databases.yml」に設定情報が反映されます
    2. 次に下記コマンドで上記で作成したスキーマ用のモデルを生成
      1. php symfony doctrine:build --model
    3. 次に下記コマンドでSQLファイルを生成
      1. php symfony doctrine:build --sql
      すると「data/sql/schema.sql」が自動生成され、SQLが記述されたファイルが完成!
    4. 次に下記コマンドでSQLファイルからデータベースにスキーマを反映
      1. php symfony doctrine:build --sql
      ※とりあえずズラズラコマンドを書きましたが「php symfony help doctrine:insert-sql」とhelpといれるとそのコマンドのヘルプが参照できるので、勉強がてら見てみようと思います

初期データを設定
※空テーブルが初期値というのはプロジェクト上では考えにくいので、まずマスター関係などの初期値を設定できるというためにも、この項目を取り上げます
  1. まず初期データINSERT用のカテゴリマスター用のフィクスチャファイルを作成(data/fixtures/categories.yml)し、下記コマンドを記述
    ※このファイルはUTF-8文字コードで保存してないと、INSERT時点で文字化けするので注意!!
    # data/fixtures/categories.yml
    
    # カテゴリマスターテーブル
    JobeetCategory:
      manager:
        name: マネージャ
      supervision:
        name: 監視
      administrator:
        name: 管理
      design:
        name: デザイナ
  2. 次に求人テーブル用のフィクスチャファイルを作成(data/fixtures/jobs.yml)し、下記コマンドを記述
    ※このファイルはUTF-8文字コードで保存してないと、INSERT時点で文字化けするので注意!!
    # data/fixtures/jobs.yml
    
    # 求人テーブル
    JobeetJob:
      omusubishiawase_com:
        JobeetCategory: manager
        type:           完全勤務
        company:        ●○株式会社
        logo:           0001.gif
        url:            http://0001.com/
        position:       WEBプロモーション運営staff
        location:       〒999-9999 東京都○○区■□町4-8-9
        description:  |
            ○○○○○○○○○○○○○○○○○○。
            ○○○○○○○○○○○○○○○○○○○○○○。
            ○○○○○○○○○○○○○○○○○○○。
            【○○○○○○○○○○○○○】
            ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○。
            【○○】
            ○○○○○○○○○○○○○○○○○○○○。
            ○○○○○○○○○○○○○○○○○○○○。
        how_to_apply: |
            ○○○○○○○○○○○○○○○○○○○
            ○○○○○○○○○○○○○○○○○○○○○○○○○○○○
        is_public:      true
        is_activated:   true
        token:          0001_com
        email:          info@0001.com
        expires_at:     '2011-4-22'
    
      can_jp_com:
        JobeetCategory:  supervision
        type:            日中勤務
        company:         株式会社○○○○ ○○○○○○○事業部
        logo:            0002.gif
        url:             http://0002.com/
        position:        ネット運営
        location:        東京都○○区○○○○2-6-1 ○○○○ビル85F
        description:  |
            【○○○○○○○○○○○○】
            (1)
            ○○○○○○○○○○○○○○○○○○
            ○○○○○○○○○○○○○○○○○☆
            ◆○○○○○○○○○○!!
            ◆○○○○○○○○○○○○○○○○○○○○○○○!!
            (2)
            ○○○○○○○○○○○○○○○
            ○○○○○○○○○○○○○○○○○○
            (3)○○○/○○○
            ○○○○○○○○○○○○○○○○○○
            ○○○○○○○○○○○○○○○○○○○○○○○○○○○
        how_to_apply: |
            ◎○○○○○○○○○○○○○○○○!!
            ◎○○○○○○○○○○○○○○○○○○
            ◎○○○○○○○○○○○○○○○○○○○
            ◎(1)○○○○○○○○○○○○○○○○○○○○○○
        is_public:      true
        is_activated:   true
        token:          0002_com
        email:          info@0002.com
        expires_at:     '2011-4-22'
    ※画像ファイルを要するので「web/uploads/jobs/」ディレクトリに上記同名の画像ファイルを保存しておくこと
    ※長文や改行が含むデータは「|」を利用すると識別される
    ※複数のモデルはフィクスチャファイルをわけなくても生成できるが、モデルごとに分けることで識別しやすくあるので、今回はモデルごとにフィクスチャファイルをわけることにする
  3. 下記コマンドで今作成した各フィクスチャファイルを元に、実際に各モデルにデータを挿入してみる
    1. php symfony doctrine:data-load
    ※上記コマンド以外に下記コマンドを実行すると、すべてのテーブルを再作成することが可能
    1. php symfony doctrine:build --all --and-load

各モデルのモジュールを自動生成してみる
  1. 下記コマンドからモデルを生成するプラグインを導入
    1. php symfony doctrine:build-forms
  2. 下記コマンドを実行して、モデルの自動生成を行う
    1. php symfony doctrine:generate-module --with-show --non-verbose-templates frontend job JobeetJob
    ※すると「apps/frontend/modules/job/」ディレクトリが生成され、各モジュールが自動生成されます
    ※各ディレクトリ詳細
    ディレクトリ 説明
    actions/ モジュールのアクション
    templates/ モジュールのテンプレート
    ※各アクション詳細
    アクションの名前 説明
    index テーブルのレコードを表示する
    show 任意のレコード用のフィールドと値を表示する
    new 新しいレコードを作成するフォームを表示する
    create 新しいレコードを作成する
    edit 既存のレコードを編集するフォームを表示する
    update ユーザーが投稿した値に応じてレコードを更新する
    delete 渡されたレコードをテーブルから削除する
  3. ブラウザで「http://(symfonyドメイン)/frontend_dev.php/job」から自動生成したモジュールを確認

symfony1.4をubuntu10.10のxampp環境にインストールしてみる

まんまsymfonyのサポートチュートリアルドキュメント通りですが
自分なりにまとめてみました!
前回のsymfony1.2よりは読みやすなってます

なにはともあれxampp環境にbinファイル(実行ファイル)を環境パスに設定する
  1. 下記コマンドを実行して、環境設定パスに追記
    1. export PATH=$PATH:/opt/lampp/bin
  2. とりあえず本当に追加されたか下記コマンドから確認
    1. export
    「declare -x PATH=.........」という項目に「/opt/lampp/bin」というパスがあれば追加OK!
    これでいちいち「/opt/lampp/bin/php」なんていうパス指定をしなくても、「php」だけのコマンドでxampp内のbinのphpを実行できるようになる
  3. 早速Pearのバージョンを確認してみようと思うので、下記コマンドを実行
    1. pear -V
次にPEARのバージョンを最新に更新
  1. 下記コマンドを実行して、PEARを最新版に更新
    1. pear upgrade PEAR
とりあえず下準備は終わったので、次にsymfonyの最新版をPEARコマンドからインストール
  1. 下記コマンドを実行して、PEARにまず「symfony」チャンネルを追加する
    1. pear channel-discover pear.symfony-project.com
    ちなみに下記コマンドで現在PEARに追加されたチャンネルのリストがズラっと表示される
    1. pear list -a
    ※こんな感じのが最後の方にあるので、それが今回追加したチャンネルということ
    Installed packages, channel pear.symfony-project.com:
    =====================================================
    Package Version State
    symfony 1.4.11  stable

    Installed packages, channel pecl.php.net:
    =========================================
  2. 下記コマンドで「symfony」をインストール
    1. pear install symfony/symfony
    ※ちなみに今インストールしたチャンネルのアンインストールコマンドは下記コマンド
    pear uninstall symfony/symfony
では早速新規プロジェクトを生成
  1. まずプロジェクトを保存するプロジェクトディレクトリを生成して、その生成したディレクトリ内に移動
    1. mkdir jobeet
    2. cd jobeet
    ※ここから下記コマンドはあくまでプロジェクトディレクトリ内のルートディレクトリ上にいることでの想定でのコマンドとなるので、最後のディレクトリ移動は忘れないように!
  2. 次にプロジェクトディレクトリ内にsymfony初期構成を設定
    1. php /opt/lampp/bin/symfony generate:project jobeet
    そうすると下記ディレクトリが自動的に生成
    ディレクトリ 説明
    apps/ プロジェクトのすべてのアプリケーションを格納する
    cache/ フレームワークによってキャッシュされるファイル
    config/ プロジェクトの設定ファイル
    lib/ プロジェクトのライブラリとクラス
    log/ フレームワークのログファイル
    plugins/ インストールされたプラグイン
    test/ ユニットテストと機能テストのファイル
    web/ Web 公開ルートディレクトリ
  3. とりあえず今回は公開ディレクトリのみシンボリックリンク対応してみる
    1. ln -s (jobeetディレクトリパス)/web (設定したい公開ディレクトリルート)/htdocs
    ※本当はApache側の設定で公開ディレクトリ設定を行ったり、物理的にsymfonyディレクトリを移動して公開用とバックエンドと切り分けることが、セキュリティ的にもよいが、今回はこれでいくことで!
  4. つぎにアプリケーション環境を生成
    1. symfony generate:app frontend
    すると下記のようにアプリケーションディレクトリが生成される
    ディレクトリ 説明
    config/ アプリケーションの設定ファイル
    lib/ アプリケーションのライブラリとクラス
    modules/ アプリケーションのコード (MVC)
    templates/ グローバルテンプレートファイル
  5. では早速「http://(symfony設定環境用のドメイン)/index.php」でページが表示されるかブラウザからみてみる!
という感じで設定完了です
次は早速プロジェクトを作ってみることにしまっす!

参考サイト
http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/01

    2011年4月19日火曜日

    symfony1.2のファイル構造

    参考サイト:
    http://develop.ddo.jp/symfony/book/jp/1.0/file_structure.html

    ルートツリー構造
    apps/
    :アプリケーションファイルを保存
      fo/
      bo/
    batch/
    :コマンドラインやバッチプロセスを走らせるためのスケジュールを呼び出すためのPHPファイルを保存
    cache/
    :プロジェクトのキャッシュファイルを保存
    config/
    :一般的なプロジェクトの設定ファイルを格納
    data/
    :プロジェクトのデータファイル(データベーススキーマやテーブル作成のSQLファイルやもし必要であれば SQLite データベース自身)を保存
      sql/
    doc/
    :プロジェクトのドキュメントを保存
      api/
    lib/
    :外部クラスやライブラリのためにとっておかれ、ここにアプリケーションを通して共有する必要があるコードを保存
      model/
      :プロジェクトのオブジェクトのオブジェクトモデルを保存
    log/
    :アプリケーション、SQLなどプロジェクト全体にかかわるログファイルが保存
    test/
    :プロジェクトのテストワーク用のファイルを保存
    web/
    :Web公開ディレクトリファイルを保存
      css/
      images/
      js/
      uploads/

    アプリケーション構造
    config/
    :アプリケーションレベルの環境設定値が保存
    i18n/
    :グローバル対応ファイルを保存
    lib/
    :アプリケーションレベルに特化したクラスやライブラリを保存
    modules/
    :アプリケーションの特徴を保持したモジュールファイルを保存
    templates/
    :アプリケーション用のグローバルテンプレートを保存
      layout.php
      error.php
      error.txt

    モジュール構造
    actions/
      actions.class.php
      :全てのアクションを保存してあるファイル
    config/
    :ローカルパラメータをもつカスタム設定ファイルを保存
    lib/
    :モジュールに特化したクラスやライブラリを保存
    templates/
    :モジュールのためのカスタムテンプレートを保存
      indexSuccess.php
    validate/
    :フォームのバリデーション用の専用ファイルを保存

    ウェブ構造
    css/
    :CSSファイルを保存
    js/
    :JSファイルを保存
    images/
    :画像ファイルを保存
    uploads/
    :ユーザーによってアップロードされたファイルを保存

    symfony1.2をxampp for linux環境にPEARからインストールしてみる(ubuntu10.10)

    Pearの初期設定
    参考サイト:
    http://yakinikunotare.boo.jp/orebase/index.php?PHP%2FPEAR
    1. xampp for linux内の実行ファイルディレクトリを環境設定に追加
      # export PATH=$PATH:/opt/lampp/bin
      ※/etc/rc.localファイルに上記設定値を追記しておけば起動のタイミングで自動設定可能

      実際に環境設定値が反映されているか下記コマンドから確認
      # pear -V
    2. PEAR自体のバージョンアップ
      # pear upgrade PEAR

      各Pearインストール確認コマンド
      • インストール済みパッケージの表示( pearチャンネルのみなら )
        # pear list
      • インストール済みパッケージの表示( 全チャンネルなら )
        # pear list -a
      • インストールできるパッケージの一覧表示
        # pear list-all
      • アンインストール
        チャンネルとパッケージをスラッシュで繋いで指定
        # pear uninstall チャンネル名/パッケージ名
        ※チャンネル名を省略した場合はpearパッケージから検索される
    symfonyをPEARからインストール
    参考サイト:
    http://yakinikunotare.boo.jp/orebase/index.php?PHP%2Fsymfony%2F%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB#x3885003
    1. PEARへsymfonyチャンネルの追加
      # pear channel-discover pear.symfony-project.com
    2. symfonyのインストール
      # pear install symfony/symfony-1.2.9
      ※1.3系以上だと新規プロジェクトを作成した際に「」とエラーが表示される。1.3系からかなり仕様が変更されたことと、文献が少ないためにやむを得ず1.2.9系でセットアップを行う
      ※ちなみに1.2.9系と指定しないで、最新インストールを行った場合は下記コマンドでアンインストール可能
      # pear uninstall symfony/symfony
    新規プロジェクトを設定
    参考サイト:
    http://develop.ddo.jp/symfony/book/jp/1.0/project_creation.html
    1. プロジェクト用のディレクトリを作成
      # mkdir (プロジェクトディレクトリ)/myproject
    2. 初期基本ファイルと初期ライブラリをプロジェクト用のディレクトリに生成
      # symfony init-project myproject
      ※下記ディレクトリが生成されている
      apps/
      batch/
      cache/
      config/
      data/
      doc/
      lib/
      log/
      plugins/
      test/
      web/
    3. アプリケーションを初期化
      # symfony init-app myapp
      ※下記ディレクトリが生成されている
      apps/
        myapp/
          config/
          i18n/
          lib/
          modules/
          templates/
    4. Apache側の設定で追記するもの
      Alias /sf /$sf_symfony_data_dir/web/sf 
    5. モジュールのセットアップ
      # symfony init-module myapp mymodule
    6. 動作確認
      URL:http://myapp.example.com/index.php/mymodule
      ※独自ビューの作成
      1. myproject/apps/myapp/modules/mymodule/actions/actions.class.php
        上記ファイルの「$this->forward('default', 'module');」をコメントアウト
      2. myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php
        上記ファイルに「Heollo」と記述
      3. http://myapp.example.com/index.php/mymoduleから動作確認

        2011年2月18日金曜日

        VirtualBoxのゲストOS(Win, Ubuntu)に割り当てたディスク容量を増やす

        参考サイト
        http://blog.brainhearts-next.com/2010/01/virtualboxos.html
        http://ankyo.blog.so-net.ne.jp/2011-02-20

        ubuntuの場合のパーティション変更
        https://wiki.ubuntulinux.jp/UbuntuTips/Install/ResizePartitionSize

        参考になりました!

        2011年2月6日日曜日

        ゲストOSがubuntuの場合のvdiファイルの最適化コマンド

        1. ゲストOS上で下記コマンドを実行
          dd if=/dev/zero of=zero bs=4M; rm zero
        2. ホストOS上で下記コマンドを実行
          (VirtualBoxフォルダ)/VBoxManage modifyhd (最適化vdiファイル) --compact
        12GBちかくのが5GBに・・・・
        ゲストOS上でファイル消しても断片してるってわけね・・・・

        共有フォルダをゲストOS上でマウントするコマンド

        mount -t vboxsf (共有フォルダ名称) (マウント先フォルダ)
        マウントフォルダを削除すると当然マウント元のファイルも削除される・・・
        はまったww

        仮想ディスクのコピーコマンド

        (VirtualBoxディレクトリ)/VBoxManage clonevdi コピーされる.vdi コピー先.vdi
        物理コピーではコピーはできないんだって…