1日目: プロジェクトを始める

はじめに

symfony ~フレームワーク~は~オープンソース~プロジェクトとして3年間以上開発され、すばらしい機能とドキュメントのおかげで今ではもっとも人気のあるフレームワークの1つになりました。

この本は仕様から実装まで段階的に Web アプリケーションを symfony で作る方法を説明します。この本は symfony を学び、これがどのように動くのか理解し、また Web 開発のベストプラクティスも学びたい初心者をターゲットとしてします。

アプリケーションを別のブログエンジンにする選択肢もありました。しかし私たちは実際のプロジェクトで symfony を使うことを望んでいます。ゴールはスタイルと少しの労力でプロフェッショナルなアプリケーションを開発するために使えることを実証することです。

今日はすでにたくさんのやることがあるので別の日のプロジェクトの内容は秘密にしておきます。しかしながら、プロジェクトの名前を教えます: Jobeet です。

この本のそれぞれの章は1時間から2時間かけることを想定しており、最初から最後まで実際の Web サイトのコーディングをすることで symfony を学ぶ機会になります。毎日、新しい機能がアプリケーションに追加され、symfony の Web 開発と同様に新しい symfony の機能を紹介するためにこの開発を利用します。

チャレンジ

チュートリアルの各章は約1時間ほどで終わる程度であり、実際のWebサイトを最初から最後までコーディングすることで symfony を学習します。

1日1時間24日で合計1日になります。これは symfony の基本を学ぶために必要な時間であると私たちは考えています。毎日、新しい機能がアプリケーションに追加され、symfony の Web 開発のベストプラクティスと同時に新しい機能を紹介するためにこの開発プロセスを利用します。

askeet では、21日目は「get-a-symfony-guru-for-a-day」でした。私たちはノープランであり、コミュニティは askeet に追加する要素を提案しなければなりませんでした。21日目はすばらしい成功例であり、コミュニティはアプリケーションに検索エンジンを実装することが必要だと判断しました。そして私たちは実装しました。21日目のチュートリアルは askeet チュートリアルのなかでもっとも人気があります。

Jobeet では、21日目に行われたデザインコンテストの優勝者を祝福しました。優勝したデザインは center{source} によるもので、このチュートリアルのデフォルトのデザインとして使用しています。また、実際の Jobeet の Web サイトでもこのデザインが採用されています。

この本は一味違います

初期のころの PHP 4 を覚えていますか? ベル・エポック(よき時代)でした。PHP は Web 専用でもっとも習得しやすい最初の言語の1つでした。

しかし、Web テクノロジーは早く進化し、Web 開発者は最新のベストプラクティスとツールについてゆくことが必要になりました。 学ぶための最良の方法はブログやチュートリアルや書籍を読むことです。私たちは PHP、Python、Java、Ruby、Perl で書かれたたくさんの資料を読んできましたが、筆者がコードスニペットの例を提供するときにこれらの多くは不十分でした。

おそらく次のような注意書きをご覧になられたことがあるでしょう:

「実際のアプリケーションでは、バリデーションと適切なエラーハンドリングを追加するのを忘れないでください」

「読者の練習のため、セキュリティについては考慮していません」

「もちろんテストの記述は必要になります」

などです。

何ということでしょう。これらは深刻な問題です。これらはコードのもっとも重要な部分です。それなのに読者は置き去りにされます。これらの問題を考慮していないのであれば、サンプルコードは役に立ちませんし、よい出発点として使えません。ひどいとは思いません?セキュリティやバリデーションやエラーハンドリングやテストは2・3の例を挙げると、きちんとコーディングしなければならないからです。

この本では、「テスト、エラーハンドリング、バリデーションコードは後で書きます」、「セキュアなアプリケーションを開発してください」といった文は見ることはいっさいありません。なぜなら symfony はコードそのものであり、企業向けのプロフェッショナルなアプリケーションを開発するためのベストプラクティスおよび手段でもあるからです。symfony は多くのコードを書かずにこれらの面を簡単に実装するために必要なすべてのツールを提供するのでこのような豪華なことができます。

symfony ではバリデーションやエラーハンドリング、セキュリティ、テストは第一級の扱いを受けます。ですので説明にそれほどの時間はかかりません。この点が「日常生活の」プロジェクトとしてフレームワークが使われる多くの理由の1つとなっています。

この本で読むすべてのコードは実際のプロジェクトで使えます。コードのスニペットをコピー&ペーストするもしくはコード全体を流用することを推奨します。

プロジェクト

設計するアプリケーションを別のブログエンジンにすることもできました。しかし私たちは symfony を実用的なプロジェクトとして使うことを望んでいます。symfony がスタイルと少しの労力でプロ仕様のアプリケーションの開発に使えることを実証するのがゴールです。

今日は多くの作業があるので別の日のプロジェクトのコンテンツは秘密にしておきます。でもアプリケーションの名前はもうご存知ですよね?: Jobeetです。

今日は何を?

今日は PHP コードを書きません。しかし1行もコードを書かないにしても新規プロジェクトをブートストラップすることで symfony のようなフレームワークを使うことの利点を理解し始めるでしょう。

この章の目標は開発環境のセットアップと Web ブラウザでアプリケーションのページを表示させることです。これらは symfony のインストールとアプリケーションの作成、Web サーバーの設定も含まれます。

この本は主に symfony フレームワークに焦点を当てるので、PHP 5 とオブジェクト指向のプログラミングのきちんとした知識があることを前提とします。

前提条件

symfony をインストールする前に、すべてのソフトウェアがコンピュータにインストールされ正しく設定されているか確認する必要があります。この章は入念に読み、コンフィギュレーションを確認するために必須のすべての手順に従ってください。将来の時間を節約することになるでしょう。

サードパーティのソフトウェア

最初に、コンピューターに Web 開発にフレンドリな作業環境があることを確認する必要があります。最小要件として、Web サーバー(たとえば Apache)、データベースエンジン (MySQL、PostgreSQL、SQLite、もしくは PDOと互換性のある任意のデータベースエンジン)、とバージョン5.2.4とそれ以降の PHP が必要です。

コマンドラインインターフェイス

symfony フレームワークは多くの作業を自動化するコマンドツールを搭載しています。Unix 系 OS のユーザーであるなら、快適に感じるでしょう。Windows システムを稼働させているのであれば、これもまた立派に動きますが、cmd プロンプトでいくつかコマンドを入力しなければなりません。

Note Unix シェルのコマンドは Windows 環境で重宝します。Windows で targzip もしくは grep のようなツールを使いたいなら、Cygwin をインストールします。冒険好きな人は Microsoft の Windows Services for Unix を試すのもよいでしょう。

~PHP のコンフィギュレーション~

PHP のコンフィギュレーションは OS ごと、Linux ディストリビューションごとでも異なるので、symfony の最小要件を満たすことを確認する必要があります。

最初に、組み込みの phpinfo() 関数を使うかコマンドラインで php -v を実行するかによって少なくとも PHP 5.2.4 がインストールされていることを確認してください。コンフィギュレーションによっては、1つはコマンドラインのために、もう1つは Web のために異なるバージョンの PHP をインストールすることが必要になることにご注意ください。

それから、次の URL から symfony のコンフィギュレーションチェッカースクリプトをダウンロードします:

http://sf-to.org/1.4/check.php

スクリプトは現在の Web 公開ディレクトリのルートのどこかに保存してください。

コマンドラインからコンフィギュレーションチェッカースクリプトを立ち上げます:

$ php check_configuration.php

PHP のコンフィギュレーションに問題がある場合、コマンドの出力は何を修正し、どのように直すのかのためのヒントを示します。

またブラウザからチェッカを実行し見つかる問題を修正します。これは異なる設定をもつ2つの環境に対して異なる php.ini 設定ファイルがあるからです。

NOTE 後で Web 公開のルートディレクトリのチェッカーを削除するのをお忘れなく。

symfony の~インストール~

プロジェクトディレクトリを初期化する

symfony をインストールする前に、最初に Jobeet に関連するファイルをすべて格納するディレクトリを作る必要があります:

$ mkdir -p /home/sfprojects/jobeet
$ cd /home/sfprojects/jobeet

Windows では次のとおりです:

c:\> mkdir c:\development\sfprojects\jobeet
c:\> cd c:\development\sfprojects\jobeet

NOTE: Windows ユーザーの方は symfony の新しいプロジェクトをスペースが含まれないパスでセットアップすることをおすすめします。My Documents より下の場所を含めて Documents and Settings ディレクトリを使うのは避けるべきです。

-

TIP symfony のプロジェクトディレクトリを Web 公開のルートディレクトリで作るのであれば、Web サーバーのコンフィギュレーションを修正する必要はありません。もちろん、運用環境では、Web サーバーのコンフィギュレーションのセクションで説明したように、サーバーのコンフィギュレーションを修正する必要があります。

symfony のバージョンを選ぶ

では、symfony をインストールします。symfony フレームワークにはいくつかの安定バージョンがあるので、symfony の公式サイトのインストールの手引きのページを読んでインストールしたいバージョンを選ぶ必要があります。

この本では symfony 1.3 もしくは symfony 1.4 をインストールすることを想定しています。

symfony のインストール位置を選ぶ

symfony をグローバルで利用できるようにインストールする、もしくはそれぞれのプロジェクトごとに組み込むことができます。それぞれのプロジェクトは全体的に独立しているので後者がおすすめです。ローカルでアップグレードすればインストールした symfony が意図せずにいくつかのプロジェクトを壊すことはありません。これは異なるバージョンの symfony で複数のプロジェクトを持ち、これらを1つづ適切にアップグレードできることを意味します。

ベストプラクティスとして、多くの人が symfony フレームワークをプロジェクトの lib/vendor ディレクトリにインストールします。ですので、最初にこのディレクトリを作ります:

$ mkdir -p lib/vendor

symfony をインストールする

アーカイブからインストールする

symfony をインストールするもっとも簡単な方法は symfony の Web サイトからバージョンを選んだバージョンのアーカイブをダウンロードすることです。選んだバージョン、たとえば symfony 1.4 のインストールページに移動します。

"Source Download" のセクションの下で、.tgz もしくは .zip フォーマットのアーカイブが見つかります。アーカイブをダウンロードし、新たに作られた lib/vendor/ ディレクトリの下に置き、展開し、ディレクトリの名前を symfony に変更します:

$ cd lib/vendor
$ tar zxpf symfony-1.4.0.tgz
$ mv symfony-1.4.0 symfony
$ rm symfony-1.4.0.tgz

Windows 環境では zip symfony に変更すると、c:\dev\sfprojects\jobeet\lib\vendor\symfony のような構造になります。

Subversion からインストールする (推奨)

Subversion を使うのであれば、プロジェクトの lib/vendor/ ディレクトリに組み込むために svn:externals を使うのがよいです:

$ svn pe svn:externals lib/vendor/

NOTE プロジェクトを新しい Subversion リポジトリにインポートする方法はこの章の最後で説明します。

すべての作業がうまくいっているのであれば、このコマンドは Subversion の外部ソースを設定する機会を提供する好みのエディタを走らせます。

TIP Windows では、コンソールを使わずにすべての作業ができる TortoiseSVN のようなツールを使うことができます。

慎重に利用するのであれば、プロジェクトを特定のリリースに結びつけます (Subversion のタグ):

symfony http://svn.symfony-project.com/tags/RELEASE_1_4_0

新しいリリースが公開されるときに(symfony の公式ブログでアナウンスされるたびに)、URL を新しいバージョンに変更する必要があります。

開発最先端のルートを使いたいのであれば、1.4ブランチを使います:

symfony http://svn.symfony-project.com/branches/1.4/

ブランチを使えばプロジェクトは svn update を使うことによる自動的なバグ修正の恩恵を得られます。

インストールの検証

symfony がインストールされたので、symfony のバージョンを表示する symfony コマンドラインを使ってすべてが動くのかチェックします (大文字の V であることに注意):

$ cd ../..
$ php lib/vendor/symfony/data/bin/symfony -V

Windows では:

c:\> cd ..\..
c:\> php lib\vendor\symfony\data\bin\symfony -V

-V オプションは symfony のインストールディレクトリへのパス、config/ProjectConfiguration.class.php も表示します。

symfony へのパスが絶対パスである場合 (上記の手引きに従って入ればデフォルトではありません)、次のようなよりよいポータビリティのために変更します:

[php]
// config/ProjectConfiguration.class.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

この方法では、プロジェクトディレクトリをあなたのマシンもしくは別のマシンの任意の場所に移動させても、きちんと動きます。

TIP このコマンドラインツールができることに興味があれば、利用可能なオプションとタスクの一覧を表示する symfony を打ち込んでください:

$ php lib/vendor/symfony/data/bin/symfony

Windows では:

c:\> php lib\vendor\symfony\data\bin\symfony

symfony コマンドラインツールは開発者の最良の友です。これはキャッシュのクリア、コードの生成などの日々の活動の生産性を高めるたくさんのユーティリティを提供します。

プロジェクトのセットアップ

symfony では、同じデータモデルを共有する~アプリケーション~~プロジェクト~に再分類されます。たいていのプロジェクトでは、2つの異なるアプリケーション: ~frontend|フロントエンド~ と ~backend|バックエンド~ を用意します。

プロジェクトの作成

sfprojects/jobeet ディレクトリから、実際の symfony プロジェクトを作る generate:project タスクを実行します:

$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet $ php lib/vendor/symfony/data/bin/symfony generate:project jobeet --orm=Propel

Windows では:

c:> php lib\vendor\symfony\data\bin\symfony generate:project jobeet c:> php lib\vendor\symfony\data\bin\symfony generate:project jobeet --orm=Propel

generate:project タスクは symfony プロジェクトに必要なディレクトリとファイルのデフォルト構造を生成します:

| ディレクトリ | 説明 | ------------ | ------------------------------------------------ | apps/ | プロジェクトのすべてのアプリケーションを格納する | cache/ | フレームワークによってキャッシュされるファイル | config/ | プロジェクトの設定ファイル | lib/ | プロジェクトのライブラリとクラス | log/ | フレームワークのログファイル | plugins/ | インストールされたプラグイン | test/ | ユニットテストと機能テストのファイル | web/ | Web 公開ルートディレクトリ (下記を参照)

NOTE なぜ symfony はたくさんのファイルを生成するのでしょうか?フルスタックフレームワークを使う主な利点の1つは開発作業を標準化することです。symfony のファイルとディレクトリのデフォルト構造のおかげで、ある程度の知識がある開発者は symfony プロジェクトのメンテナンスを引き継ぎできます。ほんの数分で、引き継ぎの人はコードに飛び込むことが可能で、バグを修正し新しい機能を追加します。

タスクを実行するときに入力しなければならない文字数を短くするために generate:project タスクは symfony のショートカットを Jobeet プロジェクトのルートディレクトリに作りました。

これからは、symfony プログラムへのフルパスの代わりにショートカットの symfony を使います。

アプリケーションの作成

今度は generate:app タスクを実行して frontend アプリケーションを生成します。

$ symfony generate:app frontend

TIP symfony ファイルが実行可能なので、Unix のユーザーはすべての php symfony./symfony に置き換えできます。Windows では symfony.bat ファイルをプロジェクトにコピーして php symfony の代わりに symfony コマンドが使えます:

c:\> copy lib\vendor\symfony\data\bin\symfony.bat .

プロジェクト生成と同じように、generate:app タスクはアプリケーションに必要なディレクトリを apps/frontend/ ディレクトリ以下で生成します。

| ディレクトリ | 説明 | -------------- | ------------------------------------ | config/ | アプリケーションの設定ファイル | lib/ | アプリケーションのライブラリとクラス | modules/ | アプリケーションのコード (MVC) | templates/ | グローバルテンプレートファイル

SIDEBAR セキュリティ

デフォルトでは、generate:app タスクはで見つかるもっとも広く知られている2つの脆弱性からアプリケーションをセキュアにします。これで symfony は私たちに代わって自動的に ~セキュリティ~ を配慮します。

~XSS~ 攻撃を防ぐために、出力エスケーピングが有効になり; ~CSRF~ 攻撃を防ぐために、CSRF 用のランダムな秘密の文字列が生成されました。

もちろん、次のオプションのおかげでこれらの設定を調整できます:

  • --escaping-strategy: 出力エスケーピングを有効もしくは無効にする
  • --csrf-secret: フォームのセッショントークンを有功にする

XSS もしくは CSRFに関して何も知らなければ、これらの脆弱性について学ぶ時間を割いてください。

ディレクトリ構造の権限

新しく作られたプロジェクトにアクセスする前に、Web サーバーが cache/log/ ディレクトリに書き込みできるよう、これらのディレクトリに適切な書き込み権限を設定する必要があります:

$ chmod 777 cache/ log/

SIDEBAR SCM ツールを使う方のための豆知識

symfony はプロジェクトの2つのディレクトリ、 cache/log/ のみに書き込みします。これらのディレクトリの内容は SCM によって無視されます (たとえば Subversion を使う場合 svn:ignore プロパティを編集する)。

~Webサーバー~のコンフィギュレーション:好ましくないやり方

プロジェクトを Web サーバーの Web 公開ルートディレクトリのどこかで作成したのであれば。すでに Web ブラウザでプロジェクトにアクセスできます。

もちろん設定ファイルを編集しないので、迅速なセットアップができますが、config/database.yml にブラウザから直接アクセスできるので手抜きの悪い結果を見ることになります。Web サイトが symfony で開発されたことをユーザーが知っていたら、たくさんのデリケートなファイルにアクセスが可能となってしまします。

*運用サーバーでこのセットアップ方法は絶対に実行してはなりません。 *次の節を読んで Web サーバーの適切な設定方法を学んでください。

Web サーバーのセットアップ:セキュアな方法

Web 開発のよい習慣はスタイルシート、JavaScript、もしくは画像のような Web ブラウザがアクセスする必要のあるファイルだけを ~Web 公開ルートディレクトリ~の下に設置することです。デフォルトでは、symfony プロジェクトの web サブディレクトリにこれらのファイルを保存することをおすすめします。

このディレクトリを見てみると、Web ~アセット~ (css/images/) と2つのフロントコントローラファイル用のサブディレクトリが見つかります。フロントコントローラは Web 公開のルートディレクトリの下に必要な唯一の PHP ファイルです。ほかのすべての PHP ファイルはブラウザから隠すことが可能で、~セキュリティ~に関してよいアイデアです。

Web サーバーのコンフィギュレーション

世界中から新しいプロジェクトにアクセスできるように ~Apache~ のコンフィギュレーションを変更しましょう。

httpd.conf 設定ファイルを見つけて開き次のコンフィギュレーションを最後の行を追加します:

# Be sure to only have this line once in your configuration
NameVirtualHost 127.0.0.1:8080

# This is the configuration for your project
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/sfprojects/jobeet/web"
  DirectoryIndex index.php
  <Directory "/home/sfprojects/jobeet/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
  <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

NOTE /sf ~エイリアス|エイリアス (Apache)~ は~デフォルトの symfony ページ~と ~Web デバッグツールバー~を適切に表示するために必要な画像と JavaScript のファイルにアクセスできるようにします。

~Windows~ では、Alias の行を次のようなものに置き換える必要があります:

Alias /sf "c:\dev\sfprojects\jobeet\lib\vendor\symfony\data\web\sf"

/home/sfprojects/jobeet/web は次のものに置き換えられます:

c:\dev\sfprojects\jobeet\web

この設定によって Apache はマシンのポート番号8080をリスニングするようになるので、Web サイトは次の URL からアクセスできるようになります:

http://~localhost~:8080/

8080以外の好きな番号に変更できますが、管理者権限を必要としない1024よりも大きな番号が望ましいです。

SIDEBAR ~ドメイン名~を設定する

マシンの管理者であるなら、新しいプロジェクトを始めるたびに新しいポート番号を追加する代わりに~バーチャルホスト~をセットアップするほうがよいです。ポート番号を選ぶ代わりに Listen ステートメントを追加し、ドメイン名を選び ServerName ステートメントを追加します:

# This is the configuration for Jobeet
<VirtualHost 127.0.0.1:80>
  ServerName jobeet.localhost
  <!-- same configuration as before -->
</VirtualHost>

ドメイン名の jobeet.localhost はローカルで宣言されなければなりません。Linux システムを稼働させているのであれば、/etc/hosts ファイルで行わなければなりません。Windows XP を稼働させているのであれば、このファイルは C:\WINDOWS\system32\drivers\etc\ ディレクトリのなかで見つかります。

次の行を追加します:

127.0.0.1         jobeet.localhost

新しい設定をテストする

Apache を再起動し、ブラウザを開き http://localhost:8080/index.php/ もしくは http://jobeet.localhost/index.php/ を入力することで新しいアプリケーションにアクセスできるか確認します。どちらの URL になるのかは以前の節で選んだ設定によります。

初期ページ

NOTE: Apache の ~mod_rewrite|mod_rewrite (Apache)~ モジュールをインストールした場合、URL の index.php/ 部分を取り除くことができます。これは web/~.htaccess|.htaccess (Apache)~ ファイルで設定される書き換えルールのおかげで可能です。

開発環境のアプリケーションにもアクセスしてみることにします。次の URL を入力します:

http://jobeet.localhost/frontend_dev.php/

~Web デバッグツールバー~は右上コーナーに表示され、小さなアイコンが含まれていればsf/エイリアスの設定が正しいことがわかります。

Web デバッグツールバー

Web デバッグツールバーは 開発環境のすべてのページに存在し異なるタブにクリックすれば多くの情報: 現在のアプリケーションの設定、現在のリクエストのログ、データベースエンジンで実行された SQL 文、メモリ情報、時間の情報が得られます。

NOTE Windows 環境の IIS サーバーで symfony を動かしたい場合セットアップ方法が少し異なります。関連チュートリアルで設定する方法がわかります。

~Subversion~

Web アプリケーションを開発するときにバージョン管理ツールを利用するのはよい習慣です。バージョン管理ツールを利用することで次のことが可能になります:

  • 安心して作業する
  • 変更によって何かが壊れたときに以前のバージョンに差し戻す
  • プロジェクトで複数の人が効率的に作業できる
  • 連続するすべてのバージョンのアプリケーションを入手できる

この節では、Subversion の使い方を説明します。別のソースコード管理ツールを利用しているのであれば、私たちが Subversion について説明することを適用するのは簡単でしょう。

Subversion サーバーへの権限があり HTTP を通してアクセスできることを前提とします。

TIP 自由に使える Subversion サーバーがなければ、無料の Google Code を借りるかより多くの選択肢を探すために Google 検索エンジンで「free subversion repository」を入力して検索します。

最初に、リポジトリサーバーで jobeet プロジェクト用のリポジトリを作ります:

$ svnadmin create /path/to/repository

マシンの上で、ディレクトリの基本構造を作ります:

$ svn mkdir -m "created default directory structure" \
file:///path/to/repository/trunk \
file:///path/to/repository/tags \
file:///path/to/repository/branches

そして空の trunk/ ディレクトリをチェックアウトします:

$ cd /home/sfprojects/jobeet
$ svn co file:///path/to/repository/trunk/ .

それから、cache/log/ ディレクトリをリポジトリに置きたくないのでこれらの内容を削除します。

$ rm -rf cache/* log/*

Web サーバーが書き込みできるように、cache/log/ ディレクトリに適切なレベルの書き込み権限をかならず設定してください:

$ chmod 777 cache/ log/

すべてのファイルとディレクトリをインポートします:

$ svn add *

cache//log ディレクトリに設定されたファイルをコミットしたくないので、無視リストを指定する必要があります:

$ svn propedit svn:ignore cache

SVN 用に設定されたデフォルトのテキストエディタが起動します。Subversion はこのディレクトリのすべての内容を無視しなければなりません:

*

保存して終了します。終わりました。

log/ ディレクトリ用に手順を繰り返します:

$ svn propedit svn:ignore log

そして次のコマンドを入力します:

*

最後に、これらの変更をレポジトリにコミットします:

$ svn import -m "made the initial import" .
  ➥ file:///path/to/repository/trunk

TIP ~Windows~ ユーザーは Subvresion のレポジトリを管理するためにすばらしい TortoiseSVN クライアントを利用できます。

それではまた明日

はい、今日はここまでです!symfony についてまだ何も話していませんが、確固とした開発環境をセットアップし、Web 開発のベストプラクティスを話し、コーディングを始める準備ができています。

明日は、アプリケーションが何を行うのかを明らかにし Jobeet のために実装する必要のある要件を話します。

ORM