創造性に関する8つの大切なこと

引用先 http://matome.naver.jp/odai/2137994969983477201

出典「ピクサーのアニメーターが教えてくれた創造性に関する8つの大切なこと : ライフハッカー[日本版]」
(8 Creativity Lessons From a Pixar Animator | Zen Habits Leo Babauta )(原文/訳:佐藤ゆき)

1.「継続は力なり」は真実である
バックス・バニーなどをはじめ『ルーニー・テューンズ』を制作した伝説的なアニメーターであるチャック・ジョーンズ氏の「一枚の良い絵を描けるようになるには、その前に10万枚のへたくそな絵を描かなければならない」という名言も教えてくれました。
最初は得意でないことも、粘り強く努力を重ねれば高いレベルにまで上達できると、彼は話してくれました。

2.アートとは、ある視点から現実を解釈し表現すること
アイデアや絵に対する固定観念を手放すことについても話しました。たとえば、友達と一緒に外出した夜について、自分は「外出して、食事をして、家に帰った」と表現するかもしれませんが、友達は自分が気付かなかったような興味深いことについて、おもしろおかしく語るかもしれません。同じ経験をしていても、人によって解釈も、得るものも異なるのです。

3.他人のアイデアを借りる
ピクサーのアーティストがキャラクターづくりをするとき、1人の意見だけが採用されることはありません。メンバー全員でテーブルを囲み、各々が自分のアイデアを元に描いたスケッチをテーブルの真ん中に置いて共有するのです。
大量のスケッチが生み出されたあとに、そこからベストを選びます。つまりお互いのアイデアを借りながら、表現を高めていくのです。

4.エゴを手放す
すばらしいスケッチが描けたときには、自分の描いたものこそ採用されるべきだと思うでしょう。
自分のスケッチこそが採用されるべきだと考えて、そのために必死になっても、それは選考過程の邪魔になるだけです。
ピクサーのアニメーターはエゴを手放し、プロジェクトの成功を第一に考えなければなりません。それは、どんなクリエイティブなプロジェクトにも共通して言えることだと思います。

5.メンバー全員で目標を共有する
ピクサーではプロジェクトに関わるメンバーは全員協力して、最高の映画をつくるためにベストを尽くし、誇りを持って仕事に従事するという姿勢が求められます。
全メンバーがそのプロジェクトのために選ばれており、全員が自分の制作している作品に真剣に向き合っているのです。そうした姿勢は、完成した作品にも表れています。

6.多くの素晴らしい仕事をしても、最終的に採用されるのはわずか
ピクサーが『メリダとおそろしの森』 を制作した際、最終作品に使用されなかったシーンを全てつなぎ合わせると実際の映画の5倍になるそうです。採用されなかった「ネタ」も大量にあります。
多くの素晴らしい仕事をしても、最終的な形となるのはほんのわずかです。それはつまり、私たちが映画館で観る作品というのは、信じられないほど素晴らしいクオリティの作品であるということです。

7.憧れの存在の近くに身を置く
世界最高レベルの才能を持った憧れの存在が、彼の同僚なのです。
これほどワクワクすることがあるでしょうか。こんな幸せな状況に置かれたら、毎朝ウキウキした気持ちでベッドを飛び出すのではないでしょうか。

8.スタート地点にいる人を応援する
ホックス氏は、今回時間を割いて私たちを案内してくれました。1人のティーンエイジャーがコンピューターアニメーションに興味があるという理由だけで。こんなことは滅多にありません。彼は次のように理由を説明してくれました。
「僕もかつて、今のジャスティンと同じ場所に立っていたことがあります。今の僕が知っていることを伝えられるのは素晴らしいことです。情熱と夢を持つことは、前向きに日々を生きるために大切です

cakePHP(第08部)

目次

  1. 第01部(CakePHP 2.0開発の準備をしよう!)
  2. 第02部(コントローラーを使おう!)
  3. 第03部(ビューを使おう!)
  4. 第04部(フォーム送信とForm Helper)
  5. 第05部(レイアウトを作ろう!)
  6. 第06部(モデルとデータベース)
  7. 第07部(データを検索する)
  8. 第08部(データの追加・更新・削除)
    1. ■データを追加する
    2. ■データを更新する
    3. ■データを削除する
  9. 第09部(bakeによる高速開発)
  10. 第10部(クエリー、マジック検索、AND/OR検索)
  11. 第11部(バリデーションを使おう!)
  12. 第12部(複数Modelの連携)
  13. 第13部(ページネーションを行う)

■データを追加する

前回、データの検索について一通り説明しました。今回は、データの追加や更新、削除といった操作について説明していきましょう。まずは、データの追加からです。

データの追加は、まずフォームを用意しておき、それを送信して受け取った値を元にModelのインスタンスを作成し、保存する、といった作業になります。ただし、これは実は思ったほど面倒ではありません。

まず、フォームの作成ですが、これはビューの.ctpファイル内に、Form Helperを使って簡単に作成できます。Form Helperについては既に使ってみましたが、Modelのデータを扱うためのフォームは、非常に簡単に作ることができます。また、Form Helperで作成したフォームを受け取るアクションメソッド側の処理も、Modelインスタンスの作成と保存はごく簡単に行えるようになっています。実例を上げてコードを見ていきましょう。

下のリスト欄に、MySampleDataへのデータ追加をするためのaddアクションのソースコードを掲載しておきました。「View」の「MySampleDatas」フォルダ内に「add.ctp」ファイルを作成して「※add.ctp」部分のソースコードを記述してください。また、MySampleDatasControllerクラスに、「※addアクションメソッド」のaddメソッドを追加して下さい。これで、http://…略…/my_sample_datas/addにアクセスすると、フォームが表示されます。フォームに適当に内容を書きこんで送信すれば、そのデータがデータベースに追加されます。

まず、add.ctpのForm Helper利用部分を見てください。ここではMySampleDataモデルのためのフォームを作成するのに、以下のようにしてフォーム生成を行なっていることがわかるでしょう。

echo $this->Form->create(Model名の指定);

これで、そのモデルのデータを扱うための

タグが生成されます。後は、必要な項目は
「$this->Form->input(項目名);」

として記述していき、最後にendで送信ボタン名を指定すれば完了です。実に簡単ですね。

さて、アクションメソッド側の処理を見ましょう。Form HelperのcreateでModel用のフォームを作成した場合、フォームはこのアクション自身に送信される、ということを知っておく必要があります。つまり、addにアクセスして表示されたフォームは、このadd自身に送られるのです。したがって、普通にアクセスしたのか、フォームから送信されたのかをチェックし、フォーム送信でアクセスされた場合はデータを保存する、というように処理を剃る必要があります。

これには、

$this->request->is('post')

を利用します。これは、POST送信されたか否かを調べるメソッドです。通常、そのままページにアクセスした際には「GET」という方式でアクセスを行いますが、Form Helperで生成されたフォームを送信した際には「POST」という方式でアクセスされます。つまり、POST送信されていたなら、フォームから送信されたと考えていいわけです。

では、送信されたフォームのデータからModelを作成し、保存する処理を見てみましょう。これは信じられないくらい簡単です。

$this->Modelクラス->save($this->request->data);

コントローラーでは、

$thisにModelクラスと同名のプロパティが用意され、そこにModelが設定されていました。この「save」を呼び出すと、新しいデータを保存します。引数には、$this->request->dataを指定します。このdataには、送信されたフォームの情報がまとめられています。たったこれだけで、送信したデータをデータベースに保存することができてしまうのです。 

*program list*

※add.ctp

<h1>Add Page</h1>
<p>MySampleData Add Form.</p>
<?php
  echo $this->Form->create('MySampleData');
  echo $this->Form->input('name');
  echo $this->Form->input('mail');
  echo $this->Form->input('tel');
  echo $this->Form->end('Submit');
?>

※addアクションメソッド

  public function add() {
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout",
        "copyright by SYODA-Tuyano. 2011.");
    // post時の処理
    if ($this->request->is('post')) {
      $this->MySampleData->save($this->request->data);
    }
  }

img8-1

———————-

■データを更新する

データの更新は、実は「データの作成」がわかれば理解したも同然です。なぜなら、同じ「save」でデータの更新も行うことができるからです。saveメソッドは、プライマリキーでデータを検索し、まだデータがなければ新たに追加をし、既にそのIDのデータがあればそれを更新します。

ですから、データの更新作業そのものはsaveを呼び出すだけです。ただし、そのためには、更新するデータを何らかの形で渡さなければいけませんし、表示されるフォームにあらかじめ保存されているデータを表示させるなどの処理をしておく必要があります。

下に実際のサンプルを挙げておきました。editアクションとして、edit.ctpファイルを作成し、コントローラーにeditメソッドを追加します。ここでは、編集するデータのID番号を、URLの末尾に、
http://〇〇/edit/番号
という形で記述してアクセスをします。例えば、ID = 1のデータを編集したければ、〇〇/edit/1としてアクセスすると、ID = 1のデータがフォームに設定された状態で画面現れます。ここで内容を編集し、送信すれば、データが更新されます。

ここでは、メソッド内でレイアウト関係の設定をした後、以下のようにしてIDを設定しています。

$this->MySampleData->id = $id;

これにより、MySampleDataには指定のIDのデータが設定されます。このままフォームを送信されていなかったならば、以下のようにしてModelクラスに指定のデータを読み込み、それをrequestのdataに設定します。

$this->request->data =
    $this->MySampleData->read(null, $id);

requestのdataには、既に説明したようにフォームのデータが保管されています。ここに、Modelから読み込んだデータを設定することで、画面に出力されたフォームに所定の値があらかじめ表示されるようになります。

saveの際には、フォーム送信されたかをifでチェックして処理するのですが、これは以下のように変わっています。

if ($this->request->is('post')

 $this->request->is('put'))
requestに”post”があるかどうかだけでなく、requestに”put”が存在したかどうかをチェックしています。これにより更新時のデータ保存がきちんと機能するようになります。

*program list*

※edit.ctp

<h1>Edit Page</h1>
<p>MySampleData Edit Form.</p>
<?php
  echo $this->Form->create('MySampleData');
  echo $this->Form->input('id');
  echo $this->Form->input('name');
  echo $this->Form->input('mail');
  echo $this->Form->input('tel');
  echo $this->Form->end('Submit');
?>

※editメソッド

  public function edit($id) {
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout",
        "copyright by SYODA-Tuyano. 2011.");
    // post時の処理
    $this->MySampleData->id = $id;
    if ($this->request->is('post') || $this->request->is('put')) {
      $this->MySampleData->save($this->request->data);
      $this->redirect(array('action' => 'index'));
    } else {
      $this->request->data =
          $this->MySampleData->read(null, $id);
    }
  }

img8-2

———————

■データを削除する

データの削除も、基本的な考え方はeditと同様です。IDを指定してアクセスすると、そのデータが表示されます。そのまま送信すると、そのIDのデータがテーブルから削除される、という具合です。

データの削除は、Modelクラスの「delete」で行うことができます。これは以下のような形で呼び出します。

$this->Modelクラス->delete( 削除するID , 真偽値 );

第1引数に、削除するデータのIDを指定します。第2引数は、関連するデータを削除するかを示す真偽値です(これはデータのリレーションを行うようになると意味がわかります。今は深く考えなくてOKです)。

この基本的な構造から考えれば、削除の仕組みはデータの更新に似ていることがわかるでしょう。実際の例として、下にサンプルを掲載しておきました。これは「del」アクションとして削除の機能を追加してあります。

ここでは、アクセス時に削除するIDをパラメータとして渡すようにしてあります。「〜/my_sample_datas/del/番号」という形で、最後に削除するID番号をつけてアクセスしてみてください。そのIDの名前がフォームに表示されます。これを確認し、削除して良ければそのままフォームを送信します。これでそのデータが削除されます。

ここでは、データの更新と同様、POST送信された場合に削除の処理をしています。この処理部分は、以下の1行だけです。

$this->MySampleData->delete($this->
    request->data('MySampleData.id'));
deleteの引数に、$this->request->data('MySampleData.id')というようなものが指定されていますね。これで、送信されたフォームからIDの値が取得できます。Form Helperを使ってModel利用のフォームを生成すると、このようにdata('MySampleData.id')というように「モデル名.項目名」という形で送信されたフォームのデータが取得できます。後は、deleteで削除するだけです。

この他に、findと同様に条件を指定してデータを削除するメソッドも用意されています。以下のようなものです。

$this->Modelクラス->deleteAll( 条件設定 , 真偽値 );

第1引数には、削除する項目の検索条件を設定します。つまり、findと同じように条件を指定してデータを検索し、見つかったものをすべて削除する、というわけです。検索条件の設定は、基本的にfindと同じです。

ただし、これはデータがいくつ見つかってもすべてまとめて削除してしまうので、扱いは注意しましょう。扱いを間違えると、誤って大事なデータをごっそり削除してしまう危険がありますから。

*program list*

※del.ctp

<h1>Edit Page</h1>
<p>MySampleData Delete Form.</p>
<?php
  echo $this->Form->create('MySampleData');
  echo $this->Form->input('id');
  echo $this->Form->input('name');
  echo $this->Form->end('Submit');
?>
※delメソッド

  public function del($id) {
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout",
        "copyright by SYODA-Tuyano. 2011.");
    $this->MySampleData->id = $id;
    // post時の処理
    if ($this->request->is('post') || $this->request->is('put')) {
      $this->MySampleData->delete($this->request->
          data('MySampleData.id'));
    } else {
      $this->request->data =
          $this->MySampleData->read(null, $id);
    }
  }

img8-3
————————–

1 / 212