SlideShare a Scribd company logo
1 of 33
CakePHPでお小遣い帳を
つくってみよう
株式会社ジュライ 溝江
@tmizoe
対象者
• CakePHPのbakeを使ったことがある人
バージョン
• CakePHP 2.8.7
最初の目標
• 日時、用途、入金、出金のCRUDができること
DB設計
カラム名 データ型 Null 備考
id int x
created datetime x
modified datetime x
date datetime x 仕訳が発生した日時
usage_id int x 用途。usagesテーブル
deposit int o 入金
payment int o 出金
journals
カラム名 データ型 Null 備考
id int x
created datetime x
modified datetime x
name Varchar(255) x 用途
usages
Bakeの準備
• Cakeダウンロード
https://github.com/cakephp/cakephp/archive/2.8.7.zip
• Webサーバのhtdocs下に展開
• PHPと(Cake)/app/ConsoleへのPATHを確認
• シェル(コマンドプロンプト)でcake bake
残高を表示する(1)
• 残高 = 直前の残高 ー いまの仕訳の増減値
• 残高を保存していない場合、残高を求めるたびにすべての仕訳
レコードにアクセスする必要がある。よって残高を保存してお
いたほうが良さそう。
カラム名 データ型 Null 備考
id int x
created datetime x
modified datetime x
date datetime x 仕訳が発生した日時
usage_id int x 用途。usagesテーブル
deposit int o 入金
payment int o 出金
balance int o 残高
journals
(New!)
残高を表示する(2)
• DBを変更したら、MVCすべてbakeしなおす
• 課題:残高を毎回、ユーザが計算して入力す
る?
→ 計算間違える、面倒
よって自動計算すべき
• いつ計算するか?
仕訳の追加・編集の時
残高を表示する(3)
• Viewで残高を入力できないように変更する
• View/Journal/add.ctp
• View/Journal/edit.ctp
echo $this->Form->input(‘balance’); // 削除
echo $this->Form->input(‘balance’); // 削除
残高を表示する(4)
• Controllerで残高を計算し、Modelに渡す
• まずは、新しい仕訳は必ず日付も新しいものになるという前提にする。既存
の仕訳の間に入ってしまうと、他のレコードの残高も書き換える必要がある
ため、それはあとでやる。
• Controller/JournalsController.php
• add() と edit() を変更
• 直前の仕訳を探し、そのときの残高を獲得。直前の仕訳が存在しない場合、直前の残高
はゼロ。
• (この項続く)
日付 入金 出金 残高
1/1 1000 1000
1/3 200 800
1/2 に新しい仕訳を入れ
る場合は、1/3の残高を
書き換える必要がある
→あとでやる
残高を表示する(5)
• 直前の仕訳を探す:Model/Journal.php に新しいメソッドを追加
/*
* $this(JournalModel)のレコードを日付が新しい順に並べ、そ
の最初のレコードにおける、balanceカラムのデータを返す
*/
public function getLastBalance(){
$lastCreated = $this->find('first', array(
'order' => array('date' => 'desc')
));
return $lastCreated['Journal']['balance'];
}
残高を表示する(6)
• getLastBalance()をController/JournalsController.phpのaddメソッ
ドから呼び出す
public function add() {
if ($this->request->is('post')) {
$this->Journal->create();
$lastBalance = $this->Journal->getLastBalance();
$newBalance = $lastBalance
+ $this->request->data['Journal']['deposit']
- $this->request->data['Journal']['payment'];
$this->request->data['Journal']['balance'] = $newBalance;
if ($this->Journal->save($this->request->data)) {
$this->Flash->success(__('The journal has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Flash->error(__('The journal could not be saved. Please, try again.'));
}
}
$usages = $this->Journal->Usage->find('list');
$this->set(compact('usages'));
}
追加
残高を表示する(7)
• getLastBalance()をController/JournalsController.phpのaddメソッ
ドから呼び出す
直前の残高: $this->Journal->getLastBalance();
入力された入金額:$this->request->data[‘Journal’][‘deposit’]
入力された出金額:$this->request->data['Journal']['payment'];
過去の日付でのレコード追加に対応(1)
作業の流れ
1. 新レコードの日付より古い仕訳の中で、最も新しい残
高を求める(この例の場合は1/1の残高)
2. 新レコードの残高を求め、追加する
3. 新レコードより新しい日付の仕訳のすべてについて、
残高を更新する
日付 入金 出金 残高
1/1 1000 1000
1/3 200 800
1/2 に新しい仕訳を入れ
る場合は、1/3の残高を
書き換える必要がある
過去の日付でのレコード追加に対応(2)
新レコードの日付より古い仕訳の中で、最も新
しい仕訳の残高を求める
どこにコードを書く? → モデル
さっきのgetLastBalance()を改良して、引数に日付をもらえるよう
にする
引数で指定された日付より古い仕訳を探す
public function getPreviousBalance($date){
$dateString = $date['year'] . '-' . $date['month'] . '-' .$date['day']
. ' ' . $date['hour'] . ':' . $date['min'];
$previous = $this->find('first', array(
'conditions' => array('date < ' => $dateString),
'order' => array('date' => 'desc')
));
$this->log('getPreviousBalance:' . $previous['Journal'], 'debug');
return $previous['Journal']['balance'];
}
もらった日付をSQLの形式に加工
その日付より古いものを検索
$this->Journal
過去の日付でのレコード追加に対応(3)
新レコードの残高を求め、追加する
Controller/JournalsController.php
getLastBalance()をgetPreviousBalance()に置き換える。
ついでに、戻り値を入れる変数も $previousBalance にしておく。
getLastBalance()はもう使わないかも。
$previousBalance = $this->Journal->getPreviousBalance(
$this->request->data['Journal']['date']
);
$newBalance = $previousBalance
+ $this->request->data['Journal']['deposit']
- $this->request->data['Journal']['payment'];
過去の日付でのレコード追加に対応(4)
新レコードより新しい日付の仕訳のすべてについて、
残高を更新する(1)
• いつやるの? 新レコードの追加が成功したあと
Controller/JournalsController.php の次のブロックの中
• 更新に必要な情報:新しいレコードの日付
… save()実行時の結果として残っている。これを変数に保存してお
くため上記のブロックを少し変更
$resultにいろいろ入っているので$this->log()で確認しておくこと。
if ($this->Journal->save($this->request->data)) {
}
$result = $this->Journal->save($this->request->data);
if ($result) {
}
過去の日付でのレコード追加に対応(5)
新レコードより新しい日付の仕訳のすべてについて、
残高を更新する(2)
• モデルに新メソッド追加:
1. $dateと等しいか新しい日付のレコードを探す。
2. 日付が古い順にそれぞれ、残高を計算し、1.の連想配列を書き換える
3. DBに保存する: モデルのsaveAll() メソッドを実行
public function updateNewBalance($date){}
過去の日付でのレコード追加に対応(5)
新レコードより新しい日付の仕訳のすべてについて、
残高を更新する(3)
Public function updateNewBalance($date){
$newJournals = $this->find(‘all’, array(
‘conditions’ => array(‘date >= ‘ => $date),
‘order’ => array(‘date’ => ‘asc’)
));
if(count($newJournals) == 0){
$this->log('not need to update:', 'debug');
return false;
}
for($i = 1; $i < count($newJournals); $i++){
$journal = $newJournals[$i]['Journal'];
$balance = $newJournals[$i-1]['Journal']['balance'] + $journal['deposit'] - $journal['payment'];
$newJournals[$i]['Journal']['balance'] = $balance;
}
$result = $this->saveAll($newJournals);
return $result;
}
1. 引数の日付より新しい仕訳をす
べて獲得し、古い順に並べたうえ
で $newJournalsに入れる
結果がゼロであ
れば何もせずに
return
2. 日付が古い順にそれぞれ、残高を
計算し、1.の連想配列を書き換える
3. すべてDBに保存。
saveAll()を使うときは、$newJournals配列の
データ形式を正しく維持すること。
完成品
https://github.com/mizoe/cakephp_expenses
Editのときも関連レコードを更新する(1)
• Editのとき: JournalモデルのupdateNewBalance($date)を実行する。
add()と同じsaveの処理があるので、該当部分を書き換える
• addのときと異なり、日付が書き換えられる可能性がある
• 既存のレコードより新しい日付になったとき
→既存のレコードより新しい日付の残高をすべて更新
• 既存のレコードより古い日付になったとき
→編集後の日付より新しい日付の残高をすべて更新
… 既存レコードの日付と、編集後の日付を比較し、古いほうを
updateNewBalanceに与えれば解決!
$result = $this->Journal->save($this->request->data);
if ($result) {
$this->Journal->updateNewBalance($result[‘Journal’][‘date’]);
$this->Flash->success(__('The journal has been saved.'));
(以下略)
public function edit($id = null) {
if (!$this->Journal->exists($id)) {
throw new NotFoundException(__(‘Invalid journal’));
}
if ($this->request->is(array(‘post’, ‘put’))) {
// get the date before edit
$previousBalance = $this->Journal->getPreviousBalance(
$this->request->data[‘Journal’][‘date’]
);
$newBalance = $previousBalance
+ $this->request->data[‘Journal’][‘deposit’]
- $this->request->data[‘Journal’][‘payment’];
$this->request->data[‘Journal’][‘balance’] = $newBalance;
$result = $this->Journal->update($this->request->data);
if ($result) {
Editのときも関連レコードを更新する(2)
JournalsController.php
以下略
直前の残高
更新後の残高
save()の代わりに、新しいメソッド
update()をモデルにつくる
この処理もモデルに
移動したほうが良い。
add()でも同じ処理が
あるから。また、
DBに強く関連する
処理だから。
Editのときも関連レコードを更新する(3)
Model/Journals.php
直前の残高
更新後の残高
save()の代わりに、新しいメソッド
update()をモデルにつくる
public function update($data){
$date = $data['Journal']['date'];
$requestDate = $date['year'] . '-' . $date['month'] . '-' .$date['day']
. ' ' . $date['hour'] . ':' . $date['min'];
$currentJournal = $this->find('first', array(
'conditions' => array('Journal.id = ' => $data['Journal']['id'])
));
$dateToUpdate = $currentJournal['Journal']['date'];
if(strtotime($currentJournal['Journal']['date']) > strtotime($requestDate) ){
$dateToUpdate = $requestDate;
}
$result = $this->save($data);
if($result == false){
return false;
}
$result = $this->updateNewBalance($dateToUpdate);
return $result;
}
日付を比較しやすいよ
うに加工(もっといい
やり方があるかも)
編集前のJournalを
探す。編集前の日
付を調べるため。
編集前の日付 編集の前後の日付を比
較し、古いほうを採用
編集対象の
Journalを保存
失敗したらfalse
該当するレコードの
残高を一括更新
Deleteのときも関連レコードを更新する(1)
• Deleteのとき: $resultには日付が入っていない… oh..
• updateNewBalance()の引数にIDを追加して、そこから調べよう!
• IDから日付を割り出す
updateNewBalance($date, $id = null)
にしておけば、既存のコードを再利用できる
• $idが指定されたとき:日付を割り出して$dateとみなす
Deleteのときも関連レコードを更新する(2)
• JournalsController.php
public function delete($id = null) {
$this->Journal->id = $id;
if (!$this->Journal->exists()) {
throw new NotFoundException(__('Invalid journal'));
}
$this->request->allowMethod('post', 'delete');
$result = $this->Journal->deleteAndUpdate($id); delete()の代わりに
deleteAndUpdate()
↑今から作る
public function deleteAndUpdate($id){
$result = $this->updateNewBalance(null, $id);
if($result == false){
return false;
}
$this->id = $id;
$result = $this->delete();
return $result;
}
Deleteのときも関連レコードを更新する(3)
• Model/Journal.php
updateNewBalanceを呼ぶ。
Modelの中から呼ぶので
$this->Journal->updateNewBalance
ではなく
$this->updateNewBalance
失敗したらfalse
通常のdelete処理
Deleteのときも関連レコードを更新する(4)
• Model/Journal.php
public function updateNewBalance($date, $id = null){
$balanceBeforeUpdate = 0;
if($id){
$currentJournal = $this->find('first', array(
'conditions' => array('Journal.id = ' => $id)
));
if(count($currentJournal) == 0){
return false;
}
$date = $currentJournal['Journal']['date'];
$balanceBeforeUpdate = $currentJournal['Journal']['balance']
- $currentJournal['Journal']['deposit'] + $currentJournal['Journal']['payment'];
}
$newJournals = $this->find('all', array(
'conditions' => array('date >= ' => $date),
'order' => array('date' => 'asc')
));
(続く)
更新前
の残高
Idが指定さ
れていたら
そのidのJournal
を取ってくる
失敗したらfalse 仕訳の日付
その仕訳の直前
における残高
その仕訳より新しい
仕訳のすべてを獲得
(既出と変更なし)
if(count($newJournals) == 0){
return false;
}
for($i = 1; $i < count($newJournals); $i++){
if($id == null || $i != 1){
$balanceBeforeUpdate = $newJournals[$i-1]['Journal']['balance'];
}
$journal = $newJournals[$i]['Journal'];
$balance = $balanceBeforeUpdate + $journal['deposit'] - $journal['payment'];
$newJournals[$i]['Journal']['balance'] = $balance;
}
return $this->saveAll($newJournals);
}
(続き) 失敗したらfalse 該当するレコードの残
高を更新
Deleteのときに対応するためのブ
ロック。Idが指定されているとき、
かつ$iが1の時だけは、以前計算し
た残高を用いる。それ以外の場合
は$i-1の残高を用いる
Viewを更新して見やすくしよう(1)
• id, created, modified は要らない
• 標準状態でdateカラムの順に並べたい
• メニュー項目をカスタムしたい
Viewを更新して見やすくしよう(2)
id, created, modified は要らない
• View/Journal/index.ctp
次の6行を削除
<th><?php echo $this->Paginator->sort('id'); ?></th>
<th><?php echo $this->Paginator->sort('created'); ?></th>
<th><?php echo $this->Paginator->sort('modified'); ?></th>
(中略)
<td><?php echo h($journal['Journal']['id']); ?>&nbsp;</td>
<td><?php echo h($journal['Journal']['created']); ?>&nbsp;</td>
<td><?php echo h($journal['Journal']['modified']); ?>&nbsp;</td>
Viewを更新して見やすくしよう(3)
標準状態でdateカラムの順に並べたい
• Viewかなと思いきや、Controllerを変更したほうが簡単
Controller/JournalsController.php
Pagenatorコンポーネントの呼び出しオプションの変更。
並べ替え順を Journalモデルのdateカラム、昇順とする。
public $components = array('Paginator' => array(
'order' => array('Journal.date' => 'asc')
), 'Session', 'Flash');
Viewを更新して見やすくしよう(4)
メニュー項目をカスタムしたい
• View/Journal/index.ctp
<th><?php echo $this->Paginator->sort('date', '日付'); ?></th>
sortの第2引数を追加。
この文字列が表示される
<h2><?php echo __('お小遣い帳'); ?></h2>
__(‘xxx’)は、そのまま表示される
完成!

More Related Content

What's hot

WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようWordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようNaoki Matsuda
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディングAkihiro Okuno
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoTsuyoshi Yamamoto
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104Satoshi Suzuki
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEtsuji Nakai
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門Yu Iwama
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~Akabane Hiroyuki
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話infinite_loop
 
20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmark20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmarkToshi Harada
 
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104Satoshi Suzuki
 
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Satoshi Suzuki
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発Shinzo SAITO
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことdcubeio
 

What's hot (20)

Teclab3
Teclab3Teclab3
Teclab3
 
Ci tutorial
Ci tutorialCi tutorial
Ci tutorial
 
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようWordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディング
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmark20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmark
 
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
 

Similar to CakePHP でお小遣い帳をつくってみよう

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜ericsagnes
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理keki3
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみたTakahiro Hidaka
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623Miho Ishida
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5Nishida Kansuke
 
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2Masashi Shinbara
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiTomohiro Kumagai
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)AyakaNishiyama
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題Makoto Setoh
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100ichikaway
 

Similar to CakePHP でお小遣い帳をつくってみよう (20)

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Web 02
Web 02Web 02
Web 02
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
 
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
 
System2
System2System2
System2
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansai
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100
 

More from Tomo Mizoe

PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門Tomo Mizoe
 
Git入門 (Windows)
Git入門 (Windows)Git入門 (Windows)
Git入門 (Windows)Tomo Mizoe
 
Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期Tomo Mizoe
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5Tomo Mizoe
 
Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31Tomo Mizoe
 
MCP and Microsoft University
MCP and Microsoft UniversityMCP and Microsoft University
MCP and Microsoft UniversityTomo Mizoe
 

More from Tomo Mizoe (6)

PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門
 
Git入門 (Windows)
Git入門 (Windows)Git入門 (Windows)
Git入門 (Windows)
 
Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5
 
Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31
 
MCP and Microsoft University
MCP and Microsoft UniversityMCP and Microsoft University
MCP and Microsoft University
 

Recently uploaded

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (10)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

CakePHP でお小遣い帳をつくってみよう