2014年09月16日
2014/09/16 プッシュってどんなもの?
アプリ(Android、iOS、Windows)でとりあえず、プッシュしたいので、ちょっと調べ物をしまーす。
「リバースAjax機能はAjax+Javaをもっとやさしくする?」
ここで、あげられているのはJava サーバサイドで必要でDWRと言うフレームワークで何ができるのか?を中心に書かれてますが、プッシュについて書かれている部分が参考になるので、この部分に触れて行きます。
DWSフレームワークではデータをブラウザ側にプッシュする方式として、3方式をサポートしています。
1.ポーリング(Polling)
ブラウザ側から一定間隔でサーバ側にリクエストを投げて、ページが更新されていないかどうか問い合わせる方式です。
2.コメット(Comet)
ブラウザからリクエストを受け取っても、すぐにレスポンスを返しません。サーバは、リクエストを受け取ってもレスポンスを返さず、
ブラウザを待たせます。更新が発生したタイミングでレスポンスを返す方式です。
3.ピギーバック(PiggyBack)
ほかのリクエストのレスポンスに便乗して、サーバ側の更新を返す方式です。
なんとなく、リアルタイムにバシッとプッシュされている感じではないですね。じゃあそれ以外のプッシュ方法はないんかい!
ありますよ。ありますとも。こちらにまとめて書いてあります。なんだ。。。これ見ればわかりやすいじゃないかぁーと思わないでくださいねw
「サーバPUSHざっくりまとめ」
4.SSE(Server Sent Events)
リアルタイム性が、ポーリングより高い。
Cometより再接続の手間がかからない。
サーバ再度の実装が従来の延長でOK!
古いブラウザには非対応
5.WebSocket
HTTPとは別の規格
WebソケットAPIはWebSocketをJSから使うためのAPI
今までのポーリングやロングポーリングではないので、サーバ負荷が少ない
古いブラウザには非対応
こんなところです。なので、WebSocketからが本格的PUSH通知手段なのです。
これ使いたいなぁー。だけどブラウザで対応がどうとか。。。アプリからは厳しいのかぁ?
と調べると、当たり前にできる様子。しかも2011年だよwww
ってことは、最近のアプリ開発本買えば乗ってるっかもしれないですねw
こここんなところに。。。
「AndroidでWebSocket」
「リバースAjax機能はAjax+Javaをもっとやさしくする?」
ここで、あげられているのはJava サーバサイドで必要でDWRと言うフレームワークで何ができるのか?を中心に書かれてますが、プッシュについて書かれている部分が参考になるので、この部分に触れて行きます。
DWSフレームワークではデータをブラウザ側にプッシュする方式として、3方式をサポートしています。
1.ポーリング(Polling)
ブラウザ側から一定間隔でサーバ側にリクエストを投げて、ページが更新されていないかどうか問い合わせる方式です。
2.コメット(Comet)
ブラウザからリクエストを受け取っても、すぐにレスポンスを返しません。サーバは、リクエストを受け取ってもレスポンスを返さず、
ブラウザを待たせます。更新が発生したタイミングでレスポンスを返す方式です。
3.ピギーバック(PiggyBack)
ほかのリクエストのレスポンスに便乗して、サーバ側の更新を返す方式です。
なんとなく、リアルタイムにバシッとプッシュされている感じではないですね。じゃあそれ以外のプッシュ方法はないんかい!
ありますよ。ありますとも。こちらにまとめて書いてあります。なんだ。。。これ見ればわかりやすいじゃないかぁーと思わないでくださいねw
「サーバPUSHざっくりまとめ」
4.SSE(Server Sent Events)
リアルタイム性が、ポーリングより高い。
Cometより再接続の手間がかからない。
サーバ再度の実装が従来の延長でOK!
古いブラウザには非対応
5.WebSocket
HTTPとは別の規格
WebソケットAPIはWebSocketをJSから使うためのAPI
今までのポーリングやロングポーリングではないので、サーバ負荷が少ない
古いブラウザには非対応
こんなところです。なので、WebSocketからが本格的PUSH通知手段なのです。
これ使いたいなぁー。だけどブラウザで対応がどうとか。。。アプリからは厳しいのかぁ?
と調べると、当たり前にできる様子。しかも2011年だよwww
ってことは、最近のアプリ開発本買えば乗ってるっかもしれないですねw
こここんなところに。。。
「AndroidでWebSocket」
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月30日
2014/07/30 vb.net -1- ODP.NETで激しくはまる!
うぇーーーーー最悪です。
なんやしらんけど、請け負った仕事がvb.netでoracleとつなげる手段はイロイロありますが。。。ODBCじゃないんだぁー。。。
今回は、ODP.NETを使用するようです。
詳細は「ODP.NETを使うメリットとは?」を参照してください。
へぇー、しばらくMS(≠モビルスーツ)アレルギーで触っていなかったのですが3年ぶりにvb.net DEATH!
で、クライアントから手順書なるものをいただいたのですが、oracleクライアント入れてから、ODP.NETいれるんだぜぇーとさっくり書いてあります。
その前に、環境説明です。
VMWareで、仮想マシーンをWindows7Proで2台作成し、一台にOracle11GExpress(OraServerとします)を導入します。
もう一台には、VB.NET 2010 Express(Dev)を導入します。
Devには、Oracleクライアントをインストールし、sqlplusでアクセスします。おら!簡単ですよこんなのwww
悪夢のシナリオ1(Oracle11Gにsqlplusで接続できず!)
①通常の接続方法、何も指定しないでいきなりつなげるよ
②「C:[oracleインストールフォルダ]\product\11.2.0\client_1\network\admin\tnsnames.ora」を修正した後にはこのようにアクセスできます。
で、つながるはず筈なのに、つながらない!OraServerで1521ポートがあいてない???
ぇーーーーなにぃー
で、再度OracleExpressをダウンロードして、インストールして、再起動したらOKでした。
でも、ダウンロードしたものが壊れていたわけでもないので、意味がわからないです。
あとで判明したことは、VMWareVSphireで赤い□ボタンで止めると電源断と同じですよ。。。といわれたので、これが原因かぁーということで、ひと段落。
悪夢のシナリオ2(sqlplus強制終了!)
DevにODP.NETをOracleクライアントにうわかぶせでインストールします。
で、sqlplusでアクセスすると。。。アーングリ。。。sqlplus強制終了!ってなんじゃこりゃ!
イロイロなバージョンをダウンロードしてくるけど、だめぇー
最終的に、ODP.NETだけをダウンロードしてインストールすると。。。。
「ODAC 11.2 Release 5 and Oracle Developer Tools for Visual Studio (11.2.0.3.20)」
うごくぜぇー!
何だよ!手順書間違ってるじゃん!(アルアルです。)
ちなみに、Oracleクライアントっていうのは、Oracleインスタントクライアントに改名されたらしいです。
sql Developerがなかったので、個別にダウンロードして解凍し、C:[oracleインストールフォルダ]\product\11.2.0\client_1にフォルダごと突っ込みました。
スタートメニューには表示されないのでショートカットを個別に登録しておくと便利でしょうね。
悪夢のシナリオ3(VB.NETでtools」が。。。)
VB.NET 2010 Express版では、ODP.NET経由でoracleへの接続は確認しましたが。。。
いうまでもなく、「VB.NET Express Edition has not sported ○○○Tools. but ...use to connect ... ODP.NET...」これって
便利ツールはつけないけど、oracleへはつなげるぜ!って書いてあるんですけど。。。。残念!!!!
トコトンハマッタ三日間でした。
なんやしらんけど、請け負った仕事がvb.netでoracleとつなげる手段はイロイロありますが。。。ODBCじゃないんだぁー。。。
今回は、ODP.NETを使用するようです。
詳細は「ODP.NETを使うメリットとは?」を参照してください。
へぇー、しばらくMS(≠モビルスーツ)アレルギーで触っていなかったのですが3年ぶりにvb.net DEATH!
で、クライアントから手順書なるものをいただいたのですが、oracleクライアント入れてから、ODP.NETいれるんだぜぇーとさっくり書いてあります。
その前に、環境説明です。
VMWareで、仮想マシーンをWindows7Proで2台作成し、一台にOracle11GExpress(OraServerとします)を導入します。
もう一台には、VB.NET 2010 Express(Dev)を導入します。
Devには、Oracleクライアントをインストールし、sqlplusでアクセスします。おら!簡単ですよこんなのwww
悪夢のシナリオ1(Oracle11Gにsqlplusで接続できず!)
①通常の接続方法、何も指定しないでいきなりつなげるよ
②「C:[oracleインストールフォルダ]\product\11.2.0\client_1\network\admin\tnsnames.ora」を修正した後にはこのようにアクセスできます。
DEV1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xxx.xxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = XE)
)
)
①
sqlplus ユーザ名/パスワード@//192.168.xxx.xxx/xe
②
sqlplus ユーザ名/パスワード@DEV1
で、つながるはず筈なのに、つながらない!OraServerで1521ポートがあいてない???
ぇーーーーなにぃー
で、再度OracleExpressをダウンロードして、インストールして、再起動したらOKでした。
でも、ダウンロードしたものが壊れていたわけでもないので、意味がわからないです。
あとで判明したことは、VMWareVSphireで赤い□ボタンで止めると電源断と同じですよ。。。といわれたので、これが原因かぁーということで、ひと段落。
悪夢のシナリオ2(sqlplus強制終了!)
DevにODP.NETをOracleクライアントにうわかぶせでインストールします。
で、sqlplusでアクセスすると。。。アーングリ。。。sqlplus強制終了!ってなんじゃこりゃ!
イロイロなバージョンをダウンロードしてくるけど、だめぇー
最終的に、ODP.NETだけをダウンロードしてインストールすると。。。。
「ODAC 11.2 Release 5 and Oracle Developer Tools for Visual Studio (11.2.0.3.20)」
うごくぜぇー!
何だよ!手順書間違ってるじゃん!(アルアルです。)
ちなみに、Oracleクライアントっていうのは、Oracleインスタントクライアントに改名されたらしいです。
sql Developerがなかったので、個別にダウンロードして解凍し、C:[oracleインストールフォルダ]\product\11.2.0\client_1にフォルダごと突っ込みました。
スタートメニューには表示されないのでショートカットを個別に登録しておくと便利でしょうね。
悪夢のシナリオ3(VB.NETでtools」が。。。)
VB.NET 2010 Express版では、ODP.NET経由でoracleへの接続は確認しましたが。。。
いうまでもなく、「VB.NET Express Edition has not sported ○○○Tools. but ...use to connect ... ODP.NET...」これって
便利ツールはつけないけど、oracleへはつなげるぜ!って書いてあるんですけど。。。。残念!!!!
トコトンハマッタ三日間でした。
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月23日
2014/07/23 CakePHP2 -6- Time型で時刻だけ表示したい どこをいじればいいの。。。
今回は、タイトル通りにMysqlのデータ型Timeの時、bakeしてできたindex.ctpでは年月日時分午前午後と表示されますけど、時刻だけ24時間表記で15分単位で指定したんですよ!って話です。
何ですか。そんな話ですか。。。って事なんですが、ネット検索しないと分からないですwww
1.Tableを生成
2.View(MVC)add.cptを修正
①表示用ラベルを指定する:'datetime', 'label' => 'Start',
②日付フォーマット表示しない用に指定する(’YMD’と指定すると年月日が表示される):'dateFormat' => '',
③AM/PMではなく24時間表記にする:'timeFormat' => '24',
⑤表示感覚を15分に指定する:'interval' => 15
3.こんな表示されます。
ドロップダウンしているところは長すぎて無理でしたw

何ですか。そんな話ですか。。。って事なんですが、ネット検索しないと分からないですwww
1.Tableを生成
CREATE TABLE IF NOT EXISTS `m_business_hour` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`start` time NOT NULL COMMENT '予約開始時間',
`end` time NOT NULL COMMENT '予約終了時間',
`created` datetime NOT NULL COMMENT '作成日',
`modified` datetime NOT NULL COMMENT '更新日',
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2.View(MVC)add.cptを修正
①表示用ラベルを指定する:'datetime', 'label' => 'Start',
②日付フォーマット表示しない用に指定する(’YMD’と指定すると年月日が表示される):'dateFormat' => '',
③AM/PMではなく24時間表記にする:'timeFormat' => '24',
⑤表示感覚を15分に指定する:'interval' => 15
~前略~
// echo $this->Form->input('start');
// echo $this->Form->input('end');
echo $this->Form->input('start', array('type' => 'datetime', 'label' => 'Start', 'dateFormat' => '', 'timeFormat' => '24', 'monthNames' => false, 'empty' => false, 'interval' => 15);
echo $this->Form->input('end', array('type' => 'datetime', 'label' => 'End', 'dateFormat' => '', 'timeFormat' => '24', 'monthNames' => false, 'empty' => false, 'interval' => 15);
~後略~
3.こんな表示されます。
ドロップダウンしているところは長すぎて無理でしたw

●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月23日
2014/07/22 CakePHP2 -5- VIew(DB)とMVCマスタ情報表示 どこをいじればいいの。。。
Viewと書くと、MVCのViewなのか?DBのViewなのか???となってしまいますが、今回はDBのViewを使い、View(MVC)に表示するには。。。という事です。
なんで、いまさら。。。と思うかも知れませんが、シチュエーションを説明させていただきます。
ドロップダウンの表示方法は「」で説明しました。これは再分類だけでした。しかも、m_institution(施設マスタ)とm_institution_kind_l(施設大分類マスタ)の関連を一撃で表示するための方法を書いています。
しかし、今度は、m_in_charge(担当者マスタ)の新規登録時にm_institution(施設マスタ)を指定したいのですが、分類まで含めた形でコンボボックスを表示したいです。$virtualFieldsも試したのですが、、、indexは表示されるけど、addでは。。。とか、、、あーーーーってなってきたので、やめました。
そんな場合に、View(DB)を使ってModel(MVC)を用意すると、簡単に書けてしまいます。
1.View(DB)作成
2.Model(MVC)作成
モデルの作成しますが。。。bakeしたら怒られましたので、適当にこぴって作りましたw
(validateは入力時のバリデートなのでいらないでしょうw)
3.add.ctpの編集
入力フィールドをコンボボックスにします。さらに表示内容は、施設名(大分類,中分類,小分類)で表示します。
①は、ただの入力フィールド
②は、コンボボックスです。
4.コンボボックスの確認
こんな感じになりましたw
なんで、いまさら。。。と思うかも知れませんが、シチュエーションを説明させていただきます。
ドロップダウンの表示方法は「」で説明しました。これは再分類だけでした。しかも、m_institution(施設マスタ)とm_institution_kind_l(施設大分類マスタ)の関連を一撃で表示するための方法を書いています。
しかし、今度は、m_in_charge(担当者マスタ)の新規登録時にm_institution(施設マスタ)を指定したいのですが、分類まで含めた形でコンボボックスを表示したいです。$virtualFieldsも試したのですが、、、indexは表示されるけど、addでは。。。とか、、、あーーーーってなってきたので、やめました。
そんな場合に、View(DB)を使ってModel(MVC)を用意すると、簡単に書けてしまいます。
1.View(DB)作成
CREATE VIEW `v_institution_full_name` AS
select
`m_institution`.`id` AS `id`,
concat( `m_institution`.`name`,'(',
`m_institution_kind_l`.`name`,',',
`m_institution_kind_m`.`name`,',',
`m_institution_kind_n`.`name`,')') AS `name`
from (((`m_institution` join `m_institution_kind_l`) join `m_institution_kind_m`) join `m_institution_kind_n`)
where
((`m_institution`.`institution_kind_l_cd` = `m_institution_kind_l`.`cd`)
and (`m_institution`.`institution_kind_m_cd` = `m_institution_kind_m`.`cd`)
and (`m_institution`.`institution_kind_n_cd` = `m_institution_kind_n`.`cd`));
2.Model(MVC)作成
モデルの作成しますが。。。bakeしたら怒られましたので、適当にこぴって作りましたw
(validateは入力時のバリデートなのでいらないでしょうw)
App::uses('AppModel', 'Model');
/**
* VInstitutionFullName Model
*
*/
class VInstitutionFullName extends AppModel {
/**
* Use table
*
* @var mixed False or table name
*/
public $useTable = 'v_institution_full_name';
/**
* Primary key field
*
* @var string
*/
public $primaryKey = 'id';
/**
* Validation rules
*
* @var array
*/
public $validate = array(
'id' => array(
'numeric' => array(
'rule' => array('numeric'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'name' => array(
'notEmpty' => array(
'rule' => array('notEmpty'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
);
}
3.add.ctpの編集
入力フィールドをコンボボックスにします。さらに表示内容は、施設名(大分類,中分類,小分類)で表示します。
①は、ただの入力フィールド
②は、コンボボックスです。
<div class="mInCharges form">
<?php echo $this->Form->create('MInCharge'); ?>
<fieldset>
<legend><?php echo __('Add M In Charge'); ?></legend>
<?php
//①
//echo $this->Form->input('institution_id');
//②
echo $this->Form->input( 'institution_id', array(
'type' => 'select',
'options' => $selectMInstitutionFullName
));
echo $this->Form->input('nickname');
echo $this->Form->input('first_name');
echo $this->Form->input('last_name');
echo $this->Form->input('email');
?>
</fieldset>
~後略~
4.コンボボックスの確認
こんな感じになりましたw

●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月20日
2014/07/15 CakePHP2 -4- MVCマスタ情報表示 どこをいじればいいの。。。
以前、「2014/07/09 CakePHP2をインストールと自動生成」で、自動生成について触れました。
今回は、DBは正規化するものですが、正規化するとDBが細かくなります。◎◎コードを別テーブルにしたり、繰り返し項目も別テーブルにしないと、後で膨大な重複データを精査する作業に死にそうになるので、最初が肝心です。
で、目的をはっきりさせると、大分類をコンボボックスで選ぶってだけです。
こんなん、cake使わなければ、秒殺なのにぃ~と思いますよねw
ですが、まぁーcakeを覚えるために。。。
ちなみに、やり方はイロイロあるようですが、最も理想的と思われる方法で行います。
1.DB作成
これで、DBはできました。
では、bakeします。
抜粋したので、DBでエラー出たらごめんなさいねwww
2.Controllerを編集する
ここが重要です。私のインストールしたフォルダ構成だと、C:\pleiades\xampp\htdocs\yoyaku\app\Controller\MInstitutionsController.php
を修正します。
こんな感じで、マスタに登録した情報のドロップダウンリストが表示されますw

今回はこのあたりで。。。
今回は、DBは正規化するものですが、正規化するとDBが細かくなります。◎◎コードを別テーブルにしたり、繰り返し項目も別テーブルにしないと、後で膨大な重複データを精査する作業に死にそうになるので、最初が肝心です。
で、目的をはっきりさせると、大分類をコンボボックスで選ぶってだけです。
こんなん、cake使わなければ、秒殺なのにぃ~と思いますよねw
ですが、まぁーcakeを覚えるために。。。
ちなみに、やり方はイロイロあるようですが、最も理想的と思われる方法で行います。
1.DB作成
--施設DB
CREATE TABLE IF NOT EXISTS `m_institution` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '施設id',
`institution_kind_l_cd` char(9) NOT NULL COMMENT '施設大分類コード3桁',
`name` varchar(90) NOT NULL COMMENT '施設名',
`created` datetime NOT NULL COMMENT '作成日',
`modified` datetime NOT NULL COMMENT '更新日',
PRIMARY KEY (`id`,`institution_kind_l_cd`),
KEY `institution_kind_l_cd` (`institution_kind_l_cd`),
KEY `institution_kind_m_cd` (`institution_kind_m_cd`),
KEY `institution_kind_n_cd` (`institution_kind_n_cd`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='施設マスタ' AUTO_INCREMENT=1 ;
--大分類
CREATE TABLE IF NOT EXISTS `m_institution_kind_l` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '施設種類id',
`cd` char(9) NOT NULL COMMENT '施設大分類コード3桁',
`name` varchar(60) NOT NULL COMMENT '施設大分類名',
`created` datetime NOT NULL COMMENT '作成日',
`modified` datetime NOT NULL COMMENT '更新日',
PRIMARY KEY (`id`),
UNIQUE KEY `cd` (`cd`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='施設大分類マスタ' AUTO_INCREMENT=1;
--外部キー指定
ALTER TABLE `m_institution`
ADD CONSTRAINT `m_institution_ibfk_1` FOREIGN KEY (`institution_kind_l_cd`) REFERENCES `m_institution_kind_l` (`cd`);
これで、DBはできました。
では、bakeします。
cd c:\pleiades\xampp\htdocs\yoyaku\app
.\Console\cake bake all テーブル名
抜粋したので、DBでエラー出たらごめんなさいねwww
2.Controllerを編集する
ここが重要です。私のインストールしたフォルダ構成だと、C:\pleiades\xampp\htdocs\yoyaku\app\Controller\MInstitutionsController.php
を修正します。
App::uses('AppController', 'Controller');
//追加するクラスを追加します。
App::uses('MInstitutionKindL', 'Model');
/**
* MInstitutions Controller
*
* @property MInstitution $MInstitution
* @property PaginatorComponent $Paginator
*/
class MInstitutionsController extends AppController {
/**
* Components
*
* @var array
*/
public $components = array('Paginator');
/**
* 関連DB
* @var unknown
*/
//このメソッド毎追加します。このメソッドはディスパッチされたときに必ず呼び出されるので、
//たとえば、~後略~で省略されているadd,view,index,delete毎にひつようなら、そこで①から5行を追加する必要があります。
/**
* 一番最初に呼ばれるらしい。(オーバーライド)
* @see Controller::startupProcess()
*/
public function startupProcess(){
parent::startupProcess();
//①Javaだとおこられますよね。クラス名と変数名を同じ名前にするとか。。。
$MInstitutionKindL = new MInstitutionKindL();
$result = $MInstitutionKindL->find('list');
//② 'selectMInstitutionKindL'の名前で、検索結果を設定します。この設定値は、Viewでも使用できます。
$this->set( 'selectMInstitutionKindL', $MInstitutionKindL->find( 'list', array(
'fields' => array( 'cd', 'name') //既存のフィールド
)));
}
/**
* index method
*
* @return void
*/
public function index() {
$this->MInstitution->recursive = 0;
$this->set('mInstitutions', $this->Paginator->paginate());
}
~後略~
}
Controllerでsetした。selectMInstitutionKindLを使用します。①をコメントアウトして、②を追加します。これで、コンボボックスで選択可能です。
~前略~
//①
// echo $this->Form->input('institution_kind_l_cd');
//②
echo $this->Form->input( 'institution_kind_l_cd', array(
'type' => 'select',
'options' => $selectMInstitutionKindL
));
~後略~
こんな感じで、マスタに登録した情報のドロップダウンリストが表示されますw

今回はこのあたりで。。。
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月18日
2014/07/18 悪いのは誰?ベネッセ情報漏洩
ネタモトは、「<ベネッセ流出>SEを逮捕…秘密複製容疑、1年で1億件」です。
幾度となく、報道されるベネッセホールディングスの原田泳幸会長兼社長の会見ですが、原田泳幸がベネッセHDの会長兼社長に就任したのは、6月下旬の株主総会後の予定だった事から、7月からなのでしょう。
彼にしてみれば、とんだ災難ですが、それも自分の責任として謝罪するあたり、さすがです。私があの立場なら、「俺悪くないし!」が滲み出てしまいそうです。
この事件で少し考えなければならないのは、情報漏洩事件のパターンですが、報道の仕方に問題はあるものの一般の方の認識は「ずさんな個人情報管理と体制に問題がある」という認識でしょう。
2012年のデータではありますが、情報漏洩のパターンは以下のようになっています。
(情報ソースは先日参加した某セキュリティイベントのカンファレンスにて配布された資料を基にしています。)
一般の方は、「情報漏洩」→「5.サーバ攻撃」→「ずさんな管理」と感じがちです。しかし、実際は情報漏洩事件の7%しか存在しないわけです。
今回の案件の内容を少し整理しましょう。(委託するという事はお金を払っているという事です)
1.「ベネッセ」社は、個人情報管理を「シンフォーム」社に情報管理を委託していました。
2.「シンフォーム」社は「ベネッセ」社のグループ企業です。
3.「シンフォーム」社はDB管理(情報管理)を「派遣会社A」社に委託していました。
4.DB管理担当者は「派遣会社A」社に所属するシステムエンジニア(SE)、松崎正臣容疑者です。
「ベネッセ」→「シンフォーム」→「派遣会社A」→「松崎正臣容疑者」
「派遣会社A」社がベネッセのグループ企業であるかどうかは不明ですが、「松崎正臣容疑者」が所属しているのは「派遣会社A」社です。かれは、サーバ攻撃したわけでもなく、単純に個人情報を「自分で作成した電子文書をUSBメモリにコピーするように」コピーできてしまったわけです。
推測ですが、個人情報にアクセスできる端末(PC)は「シンフォーム」社にあるので、端末(PC)やネットワークのセキュリティは「シンフォーム」社が管理すべきです。簡単にUSBメモリにコピーできてしまってのはセキュリティに問題はあるでしょう。
「松崎正臣容疑者」がセキュリティホールに気付いた段階で「シンフォーム」社に報告すれば良かったのです。しかし、それはしませんでした。
もちろん情報漏洩をした「松崎正臣容疑者」の所属する「派遣会社A」社の管理責任は大きいでしょう。しかし、「派遣会社A」社は会社名も不明です。本来、お金の流れから考えると「派遣会社A」社代表と、「松崎正臣容疑者」の契約違反は重大なので謝罪べきは、この2者です。
報道を見る限り、「ベネッセ」社の情報管理がずさんだったとして、ひたすら「ベネッセ」社をたたいていますが、少しお門違いな気もします。
そして私たちIT企業は、前述の「5.サーバ攻撃 7%」の外部から攻撃に対して最大限の努力をしつつも、内部犯行にも対応しなければなりません。日本人の良識は何処へ言ってしまったのでしょうか?
そして、マスコミの知識不足、間違った解釈は、改められる事もなく、垂れ流されるのでしょうか?
幾度となく、報道されるベネッセホールディングスの原田泳幸会長兼社長の会見ですが、原田泳幸がベネッセHDの会長兼社長に就任したのは、6月下旬の株主総会後の予定だった事から、7月からなのでしょう。
彼にしてみれば、とんだ災難ですが、それも自分の責任として謝罪するあたり、さすがです。私があの立場なら、「俺悪くないし!」が滲み出てしまいそうです。
この事件で少し考えなければならないのは、情報漏洩事件のパターンですが、報道の仕方に問題はあるものの一般の方の認識は「ずさんな個人情報管理と体制に問題がある」という認識でしょう。
2012年のデータではありますが、情報漏洩のパターンは以下のようになっています。
(情報ソースは先日参加した某セキュリティイベントのカンファレンスにて配布された資料を基にしています。)
驚くべきは、情報漏洩の発生原因のパーセンテージです。
1.内部反抗 34%
2.データ取扱外注先 19%
3.悪意を持った社員 16%
4.システムの欠陥 11%
5.サーバ攻撃 7%
6.情報共有化時の操作ミス 6%
7.物理的にデータ意掃除の漏洩 5%
8.その他 2%
一般の方は、「情報漏洩」→「5.サーバ攻撃」→「ずさんな管理」と感じがちです。しかし、実際は情報漏洩事件の7%しか存在しないわけです。
今回の案件の内容を少し整理しましょう。(委託するという事はお金を払っているという事です)
1.「ベネッセ」社は、個人情報管理を「シンフォーム」社に情報管理を委託していました。
2.「シンフォーム」社は「ベネッセ」社のグループ企業です。
3.「シンフォーム」社はDB管理(情報管理)を「派遣会社A」社に委託していました。
4.DB管理担当者は「派遣会社A」社に所属するシステムエンジニア(SE)、松崎正臣容疑者です。
「ベネッセ」→「シンフォーム」→「派遣会社A」→「松崎正臣容疑者」
「派遣会社A」社がベネッセのグループ企業であるかどうかは不明ですが、「松崎正臣容疑者」が所属しているのは「派遣会社A」社です。かれは、サーバ攻撃したわけでもなく、単純に個人情報を「自分で作成した電子文書をUSBメモリにコピーするように」コピーできてしまったわけです。
推測ですが、個人情報にアクセスできる端末(PC)は「シンフォーム」社にあるので、端末(PC)やネットワークのセキュリティは「シンフォーム」社が管理すべきです。簡単にUSBメモリにコピーできてしまってのはセキュリティに問題はあるでしょう。
「松崎正臣容疑者」がセキュリティホールに気付いた段階で「シンフォーム」社に報告すれば良かったのです。しかし、それはしませんでした。
もちろん情報漏洩をした「松崎正臣容疑者」の所属する「派遣会社A」社の管理責任は大きいでしょう。しかし、「派遣会社A」社は会社名も不明です。本来、お金の流れから考えると「派遣会社A」社代表と、「松崎正臣容疑者」の契約違反は重大なので謝罪べきは、この2者です。
報道を見る限り、「ベネッセ」社の情報管理がずさんだったとして、ひたすら「ベネッセ」社をたたいていますが、少しお門違いな気もします。
そして私たちIT企業は、前述の「5.サーバ攻撃 7%」の外部から攻撃に対して最大限の努力をしつつも、内部犯行にも対応しなければなりません。日本人の良識は何処へ言ってしまったのでしょうか?
そして、マスコミの知識不足、間違った解釈は、改められる事もなく、垂れ流されるのでしょうか?
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月13日
2014/07/13 CakePHP2 -3-国際化どこをいじればいいの。。。
国際化?CakePHP2ではbake(自動生成)すると英語なので、国際化とか言いながら日本語化なんですけどねw
以前のBlog「2014/07/11 CakePHP2 -2-Model&Viewどこをいじればいいの。。。」で作成したViewを修正しなければならないの?
と、思いますよね?
そんなことしなくても大丈夫です。
CakePHP2では、一撃で対応できる仕組みが用意されています。期待させすぎは良くないので、日本語はイチイチ手入力しないといけないんですけどねw
①で場所移動
②で国際化対応するアプリケーションのフォルダを指定し、国際化ファイルをc:\pleiades\xampp\htdocs\cakephp2\app\Localeに出力をます。
cd c:\pleiades\xampp\htdocs\cakephp2\app\Console ・・・①
.\cake i18n -app c:\pleiades\xampp\htdocs\cakephp2\app\ ・・・②
詳細に関しましては「CakePHP2を使用して多言語化」を参照してください。
上のコマンドを実行すると、下記のフォルダ内にファイルが追加されます。
c:\pleiades\xampp\htdocs\cakephp2\app\Locale
│ cake.pot
│ cake_console.pot
│ cake_dev.pot
│ default.pot
│
├─eng
│ └─LC_MESSAGES
│ default.po
│ empty
│
└─LC_TIME
cake.pot
太字のフォルダを作成し、Local直下ののdefault.potをdefault.poとしてコピーします。
c:\pleiades\xampp\htdocs\cakephp2\app\Locale.
│ cake.pot
│ cake_console.pot
│ cake_dev.pot
│ default.pot
│
├─eng
│ └─LC_MESSAGES
│ default.po
│ empty
│
├─jpn
│ └─LC_MESSAGES
│ default.po
│ empty
│
└─LC_TIME
cake.pot
jpn\LC_MESSAGES内のdefault.poの分かりそうな部分に日本語で修正を加えます。
~前略~
#: /View/Posts/add.ctp:11
#: /View/Posts/edit.ctp:12
#: View/Helper/FormHelper.php:1894
#: View/Scaffolds/form.ctp:23
msgid "Submit"
msgstr "確定"
#: /View/Posts/add.ctp:14
#: /View/Posts/edit.ctp:15
#: /View/Posts/index.ctp:12;48
#: /View/Posts/view.ctp:37
#: View/Scaffolds/form.ctp:27
#: View/Scaffolds/index.ctp:26;77
#: View/Scaffolds/view.ctp:49
msgid "Actions"
msgstr "操作"
#: /View/Posts/add.ctp:17
#: /View/Posts/edit.ctp:19
#: /View/Posts/view.ctp:41
msgid "List Posts"
msgstr "Post 一覧"
#: /View/Posts/edit.ctp:4
#: /View/Posts/view.ctp:39
msgid "Edit Post"
msgstr ""
#: /View/Posts/edit.ctp:18
#: /View/Posts/index.ctp:27
#: View/Scaffolds/form.ctp:31
#: View/Scaffolds/index.ctp:51
#: View/Scaffolds/view.ctp:175
msgid "Delete"
msgstr "削除"
~後略~
こんな感じですね。
フォルダ名を間違わなければ、表示されます。

今日は、このあたりで。。。
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月11日
2014/07/11 CakePHP2 -2-Model&Viewどこをいじればいいの。。。
今日は、「2014/07/10 CakePHP2 Controller-1-どこをいじればいいの。。。」に続きModelとViewを追ってみました。
CakePHP2!最高です。もう、触らなくていいですwww
そんなわけにも行かず。。。
調査すると、もうModel部分は触らなくてもいいかぁーって感じです。
なにやら、DBさえ作成してしまえば、動的にTable構造を読み込んで、全てのフィールドを取得する仕組みのようです。
問題は第2正規化とかすると、マスタは別テーブルに。。。繰り返し項目も別テーブルに。。。にしなければいけないです。
まぁーその方が、あとあとメンテしやすいんですけど。。。
まぁーまぁーとりあえず、上の件に関しては、後回しにして、とりあえずModelに関しての調査は、これ以上手を突っ込んでも。。。深みにはまりますから、Viewについて話を進めます。
Viewは、めっちゃ簡単です!これで勝手に追加してくれます。
WebRoot C:\pleiades\xampp\htdocs\
Cake用 cakephp2\app\
View用 View\
アプリ用 Posts
こんな感じですね。
このフォルダの中には以下のファイルが入っています。
add.ctp
edit.ctp
index.ctp
view.ctp
今日はこんな感じで終了です。
CakePHP2!最高です。もう、触らなくていいですwww
そんなわけにも行かず。。。
調査すると、もうModel部分は触らなくてもいいかぁーって感じです。
なにやら、DBさえ作成してしまえば、動的にTable構造を読み込んで、全てのフィールドを取得する仕組みのようです。
問題は第2正規化とかすると、マスタは別テーブルに。。。繰り返し項目も別テーブルに。。。にしなければいけないです。
まぁーその方が、あとあとメンテしやすいんですけど。。。
まぁーまぁーとりあえず、上の件に関しては、後回しにして、とりあえずModelに関しての調査は、これ以上手を突っ込んでも。。。深みにはまりますから、Viewについて話を進めます。
Viewは、めっちゃ簡単です!これで勝手に追加してくれます。
WebRoot C:\pleiades\xampp\htdocs\
Cake用 cakephp2\app\
View用 View\
アプリ用 Posts
こんな感じですね。
このフォルダの中には以下のファイルが入っています。
テーブル定義に太字を追加します。
CREATE TABLE `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`title` varchar(50) NOT NULL,
`body` text NOT NULL,
`status` int(11) NOT NULL DEFAULT '0',
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
add.ctp
テーブル定義に太字を追加します。
<div class="posts form">
<?php echo $this->Form->create('Post'); ?>
<fieldset>
<legend><?php echo __('Add Post'); ?></legend>
<?php
echo $this->Form->input('title');
echo $this->Form->input('body');
echo $this->Form->input('status');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Html->link(__('List Posts'), array('action' => 'index')); ?></li>
</ul>
</div>
edit.ctp
テーブル定義に太字を追加します。
<div class="posts form">
<?php echo $this->Form->create('Post'); ?>
<fieldset>
<legend><?php echo __('Edit Post'); ?></legend>
<?php
echo $this->Form->input('id');
echo $this->Form->input('title');
echo $this->Form->input('body');
echo $this->Form->input('status');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $this->Form->value('Post.id')), array(), __('Are you sure you want to delete # %s?', $this->Form->value('Post.id'))); ?></li>
<li><?php echo $this->Html->link(__('List Posts'), array('action' => 'index')); ?></li>
</ul>
</div>
index.ctp
テーブル定義に太字を追加します。
<div class="posts index">
<h2><?php echo __('Posts'); ?></h2>
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th><?php echo $this->Paginator->sort('id'); ?></th>
<th><?php echo $this->Paginator->sort('title'); ?></th>
<th><?php echo $this->Paginator->sort('body'); ?></th>
<th><?php echo $this->Paginator->sort('status'); ?></th>
<th><?php echo $this->Paginator->sort('created'); ?></th>
<th><?php echo $this->Paginator->sort('modified'); ?></th>
<th class="actions"><?php echo __('Actions'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo h($post['Post']['id']); ?> </td>
<td><?php echo h($post['Post']['title']); ?> </td>
<td><?php echo h($post['Post']['body']); ?> </td>
<td><?php echo h($post['Post']['status']); ?> </td>
<td><?php echo h($post['Post']['created']); ?> </td>
<td><?php echo h($post['Post']['modified']); ?> </td>
<td class="actions">
<?php echo $this->Html->link(__('View'), array('action' => 'view', $post['Post']['id'])); ?>
<?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $post['Post']['id'])); ?>
<?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $post['Post']['id']), array(), __('Are you sure you want to delete # %s?', $post['Post']['id'])); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<p>
<?php
echo $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
));
?> </p>
<div class="paging">
<?php
echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => ''));
echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
?>
</div>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Html->link(__('New Post'), array('action' => 'add')); ?></li>
</ul>
</div>
view.ctp
テーブル定義に太字を追加します。
<div class="posts view">
<h2><?php echo __('Post'); ?></h2>
<dl>
<dt><?php echo __('Id'); ?></dt>
<dd>
<?php echo h($post['Post']['id']); ?>
</dd>
<dt><?php echo __('Title'); ?></dt>
<dd>
<?php echo h($post['Post']['title']); ?>
</dd>
<dt><?php echo __('Body'); ?></dt>
<dd>
<?php echo h($post['Post']['body']); ?>
</dd>
<dt><?php echo __('Status'); ?></dt>
<dd>
<?php echo h($post['Post']['status']); ?>
</dd>
<dt><?php echo __('Created'); ?></dt>
<dd>
<?php echo h($post['Post']['created']); ?>
</dd>
<dt><?php echo __('Modified'); ?></dt>
<dd>
<?php echo h($post['Post']['modified']); ?>
</dd>
</dl>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Html->link(__('Edit Post'), array('action' => 'edit', $post['Post']['id'])); ?> </li>
<li><?php echo $this->Form->postLink(__('Delete Post'), array('action' => 'delete', $post['Post']['id']), array(), __('Are you sure you want to delete # %s?', $post['Post']['id'])); ?> </li>
<li><?php echo $this->Html->link(__('List Posts'), array('action' => 'index')); ?> </li>
<li><?php echo $this->Html->link(__('New Post'), array('action' => 'add')); ?> </li>
</ul>
</div>
今日はこんな感じで終了です。
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月11日
2014/07/10 CakePHP2 -1-Controllerどこをいじればいいの。。。
Cake使えば、コーディングしなくてもいいや!とか甘いと思いながらも、そのハニーポッドに手を突っ込んでしまっているわけですが。。。
そんな事はないわけです。
そもそも、なんてフレームワークとか使うの?って話は、コーディングしたくないからwwwですよ。
その割には、内部のソースコードとか見ないといけないので、逆につらいときもありますけど。。。
「2014/07/09 CakePHP2をインストールと自動生成」(前回)bakeして、自動生成しました。
その、生成したファイルをどの様に編集すれば、いいのかわかりませんので、思い通りに修正する事ができませんw
Model-View-Controller(MVC)について話を進めていきます。分からない方は「MVCとは」を参照してください。
1.Controllerについて
まずは、触らなければならない対象のファイルの場所です。
C:\pleiades\xampp\htdocs\cakephp2 ←CakePHP2インストールフォルダ
\app\Controller ←コントローラの場所
\PostsController.php ←アプリケーション名Controller.php
URLを指定する時は
原則:http://ドメイン/CakePHPのディレクトリ/アプリケーション/アクション
例:http://localhost/cakephp2/アプリケーション/アクション
と指定します。この時「New Post(アプリケーション名)」ボタンをクリックすると、
http://localhost/cakephp2/posts/add
にアクセスします。addがメソッド(アクション名)なわけですね。
このファイル(ここでは、PostsController.php)の中身を見ると、以下のメソッド(Action)があります。
分かるところは、コメント書いておきます。
ここで分かるところは、データの準備までを各メソッド(アクション)で行うのかな?
変段基準は、edlitとaddのメソッドの違いで、addは初回のデータの準備の必要ですからねw
今回はコントローラに関しての調査で終了しちゃいましたw
----------------------------
追加
----------------------------
追記します。
コントローラで使用されるメソッド
render()メソッド
指定されたView(*.cpt)を読み込んで画面を表示します。
アクションメソッド内でrender()を実行しない場合、アクション名Action名と同名のViewを表示します。
set()メソッド
ControllerからViewにデータを受け渡す場合に使用します。
Modelから取得した情報をset()メソッドを使い値をセットした後、Viewにrender()で画面に表示します。
redirect()メソッド
指定たURLに移動します。
flash()メソッド
redirect()に似ているが、redirectする前に指定したメッセージを表示してからredirectします。
ただし、デバッグが有効の場合は、メッセージをクリックする事でredirectします。
setFlash()メソッド
$this->Session->setFlash()メソッドを使用すれば、転送先のページでメッセージが表示します。
そんな事はないわけです。
そもそも、なんてフレームワークとか使うの?って話は、コーディングしたくないからwwwですよ。
その割には、内部のソースコードとか見ないといけないので、逆につらいときもありますけど。。。
「2014/07/09 CakePHP2をインストールと自動生成」(前回)bakeして、自動生成しました。
その、生成したファイルをどの様に編集すれば、いいのかわかりませんので、思い通りに修正する事ができませんw
Model-View-Controller(MVC)について話を進めていきます。分からない方は「MVCとは」を参照してください。
1.Controllerについて
まずは、触らなければならない対象のファイルの場所です。
C:\pleiades\xampp\htdocs\cakephp2 ←CakePHP2インストールフォルダ
\app\Controller ←コントローラの場所
\PostsController.php ←アプリケーション名Controller.php
URLを指定する時は
原則:http://ドメイン/CakePHPのディレクトリ/アプリケーション/アクション
例:http://localhost/cakephp2/アプリケーション/アクション
と指定します。この時「New Post(アプリケーション名)」ボタンをクリックすると、
http://localhost/cakephp2/posts/add
にアクセスします。addがメソッド(アクション名)なわけですね。
このファイル(ここでは、PostsController.php)の中身を見ると、以下のメソッド(Action)があります。
分かるところは、コメント書いておきます。
ここで分かるところは、データの準備までを各メソッド(アクション)で行うのかな?
変段基準は、edlitとaddのメソッドの違いで、addは初回のデータの準備の必要ですからねw
public function index() {
$this->Post->recursive = 0;
//posts・・・この名前で検索結果を設定する。
//$this->Paginator->paginate()・・・array形式で検索結果を取得する。条件を指定するならここ。
$this->set('posts', $this->Paginator->paginate());
}
public function view($id = null) {
if (!$this->Post->exists($id)) {
throw new NotFoundException(__('Invalid post'));
}
//$idにはプライマリキーを指定されているので、1件抽出する。
$options = array('conditions' => array('Post.' . $this->Post->primaryKey => $id));
//postに検索結果を代入する
$this->set('post', $this->Post->find('first', $options));
}
public function add() {
//???
if ($this->request->is('post')) {
//???
$this->Post->create();
//リクエストデータを取得し、DBにインサートする
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(__('The post has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The post could not be saved. Please, try again.'));
}
}
}
public function edit($id = null) {
//データがなければエラー
if (!$this->Post->exists($id)) {
throw new NotFoundException(__('Invalid post'));
}
//???
if ($this->request->is(array('post', 'put'))) {
//DBに保存
if ($this->Post->save($this->request->data)) {
//update
$this->Session->setFlash(__('The post has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The post could not be saved. Please, try again.'));
}
} else {
//DBよりデータ取得し、表示する
$options = array('conditions' => array('Post.' . $this->Post->primaryKey => $id));
$this->request->data = $this->Post->find('first', $options);
}
}
public function delete($id = null) {
$this->Post->id = $id;
if (!$this->Post->exists()) {
throw new NotFoundException(__('Invalid post'));
}
$this->request->allowMethod('post', 'delete');
if ($this->Post->delete()) {
$this->Session->setFlash(__('The post has been deleted.'));
} else {
$this->Session->setFlash(__('The post could not be deleted. Please, try again.'));
}
return $this->redirect(array('action' => 'index'));
}
今回はコントローラに関しての調査で終了しちゃいましたw
----------------------------
追加
----------------------------
追記します。
コントローラで使用されるメソッド
render()メソッド
指定されたView(*.cpt)を読み込んで画面を表示します。
アクションメソッド内でrender()を実行しない場合、アクション名Action名と同名のViewを表示します。
例1) index.cptをします。
$this->render();
例2) URL直接指定
$this->render("http://cakephp.org/");
例3) 指定のアプリ/Viewを指定し、移動
$this->render(
array(
"controller" => "posts",
"action" => "index"
));
set()メソッド
ControllerからViewにデータを受け渡す場合に使用します。
Modelから取得した情報をset()メソッドを使い値をセットした後、Viewにrender()で画面に表示します。
例1) 単独値を設定
$color = "pink";
$this->set("color", $color);
例2) 連想配列を展開してViewに渡す方法(はじめに連想配列を指定した場合は展開される)
$data = array(
"city" => "Nagoya",
"maker" => array("HONDA", "YAMAHA", "SUZUKI")
);
$this->set($data);
redirect()メソッド
指定たURLに移動します。
例1) 絶対パス指定
$this->redirect("http://cakephp.org/");
例2) ・・・/posts/indexにredirect
$this->redirect(
array(
"controller" => "posts",
"action" => "index"
));
flash()メソッド
redirect()に似ているが、redirectする前に指定したメッセージを表示してからredirectします。
ただし、デバッグが有効の場合は、メッセージをクリックする事でredirectします。
例1) 絶対パス指定
$this->flash("http://cakephp.org/");
例2) 10秒後にredirect
$this->flash(
array(
"controller" => "posts",
"action" => "index"
),
10
);
setFlash()メソッド
$this->Session->setFlash()メソッドを使用すれば、転送先のページでメッセージが表示します。
例1) 転送先のページでメッセージ表示
$this->Settion->setFlash("入力を受け付けました。");
$this->redirect(
array(
"controller" => "posts",
"action" => "index"
));
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。

2014年07月10日
2014/07/10 禁煙外来

禁煙派・喫煙派ブログトーナメント
1.たぼこ吸いますか?
現時点で、喫煙はしていません。
2.禁煙に挑戦中ですか?
禁煙には挑戦中といえば、そうですね。2013/11に禁煙しました。
3.たばこの煙が苦手ですか?
タバコの煙は苦手ですし、においも好きじゃないです。
4.毎日どの位吸ってますか?
どれくらい吸っていたか?というと、3日で2箱位ですね。
禁煙武勇伝(ダサッw)
一度目の禁煙は、単純に体に良くないと思ったので、最後の一箱を吸い終えて、やめました。何の苦労もなかったです。
3年後くらいに、再度喫煙する事になりました。イラついたからですけど。。。
二度目の禁煙は、単純にモトクロスにめっちゃはまって、速く走りたい!がモチベーションです。盆休みに三重県の山の中に一週間こもり禁煙成功しました。ここは、コースからタバコに自販機まで車で20分くらいかかるので、買に行くのがめんどくさくなるって奴ですwこれもまた、3年後くらいに、、再度喫煙する事になりました。イラついたからですけど。。。
三度目の禁煙は、単純にムエタイにめっちゃはまったからです。強くなりたい!がモチベーションです。普通にジムに通い始めて、たばこなんて吸ってたら絶対勝てそうにないなぁーと思いやめました。これもまた、3年後くらいに、、再度喫煙する事になりました。イラついたからですけど。。。
四度目の喫煙は、最後の禁煙になります。タバコの金額も上がったし、、、特に理由がなくやめました。理由もなくやめるのは相当しんどいですが、病院へ行って、薬をもらいやめました。
禁煙外来は、2週間に一回×2、その後に1ヶ月×2で三ヶ月コースでやめられます。
禁煙外来に初めて通うと、いつから禁煙しますか?ときかれます。
薬になれるために弱めの薬を飲みます。この間は吸っても吸わなくても良い期間です。はじめの一週間です。
なので、いきなり禁煙ってわけじゃないんです。この一週間に僕は二箱すいました。
薬になれて、翌週からは強めの薬に変えると、まったく吸わなくても良くなりました。
チャンピクスという薬でしたが、タバコ自体がいやになる薬のようです。
2度目、3度目の禁煙と比べれば、かなり楽にやめられます。
そして、こんな簡単にやめられるなんて、びっくりしました。病院に行って良かったです。
●倒れるだけで腹筋ワンダーコアでおなじみの商品です。
