このブログについて

Posted by muchag | 未分類 | 2007-03-01 (木) 2:33:38

このブログは、爺による「備忘録」です。
言葉の使い方をはじめ、間違っていることも多々あるかもしれません。
あくまでも「備忘録」ですので、これのブログを見て「怒っちゃやーよ!」

自己責任にて閲覧してくださいね
未分類 | 2007-03-01 (木) 2:33:38 |

フラッシュ

Posted by muchag | CakePHP 3.x | 2018-05-24 (木) 18:34:12


公式:Flash
公式:フラッシュ

【環境】
CakePHP: 3.5.11
php: 7.1.5
概要

FlashComponent にてメッセージをセッションへ格納し
FlashHelper にて、セッションから取り出したメッセージをテンプレートへ出力する。

書式
設定

コントローラ内で、下記のように指定。


$this->Flash->set('This is a message');
出力

テンプレート内で、下記のように指定。


echo $this->Flash->render();

と、公式に書いてあるけど、こんなことを書かなくても出力される。。。
なぜ~。

別名

ちなみに、FlashComponent にてセッションキーを変更した場合は
下記のように独自キーを指定する。


echo $this->Flash->render('other');
エレメント

テンプレートへ出力する際にはエレメントを利用する。

デフォルトのファイルは、下記3種。

/src/Template/Element/Flash/default.ctp
/src/Template/Element/Flash/error.ctp
/src/Template/Element/Flash/success.ctp

※/vendor/cakephp/cakephp/src の方ではなく /app/src の方

FlashComponent

$this->Flash->set('This is a message');
$this->Flash->success('This is a message');
$this->Flash->greatSuccess('This is a message');

上から順番に、下記エレメントを利用して出力される。

/src/Template/Element/Flash/default.ctp
/src/Template/Element/Flash/success.ctp
/src/Template/Element/Flash/great_success.ctp

つまり、メソッド名とエレメント名が連動しており
その名称は独自につけることが可能。

プレフィクス

公式:Flash ルーティングのプレフィックスとフラッシュメッセージ
プレフィクスを利用している場合は、
下記を用意することで、プレフィクス別に設定可能。

/plugins/MyVendor/MyPlugin/src/Template/Prefix/Element/Flash/success.ctp
カスタマイズ
/plugins/MyVendor/MyPlugin/src/Template/Element/Flash/success.ctp

こちらを配置して、中身を書き換えることでカスタマイズできそう。

テーマ

公式:Flash フラッシュメッセージとテーマ
FlashHelper では、テーマを設定できるみたい?

読んでもピンとはこないけど、
時間がある時に試そう。

FlashComponent
オプション
/vendor/cakephp/cakephp/src/Controller/Component/FlashComponent.php

protected $_defaultConfig = [
    'key' => 'flash',
    'element' => 'default',
    'params' => [],
    'clear' => false,
    'duplicate' => true
];

公式で「下記の通りです」と3種並べられている割には、
あちこち見ると増えていく。。。

key デフォルトは ‘flash’。セッション内の ‘Flash’ キー配下の配列キー。
duplicate
clear このキーは bool 値を期待しており、 現在のスタックの全てのメッセージを消去し、新しいものを始めることができます。
element デフォルトは null ですが、 __call() マジックメソッドの使用時には、 自動的に設定されます。表示に使用されるエレメント名。
escape false に設定すると、フラッシュメッセージ中に HTML を出力することができます。
plugin プラグインから指定したエレメントを取得する。
params キーバリューの任意の配列です。エレメントの中で変数として利用する配列。

// コントローラーの中で
$this->Flash->success('The user has been saved', [
    'key' => 'positive',
    'params' => [
        'name' => $user->name,
        'email' => $user->email
    ]
]);
CakePHP 3.x | 2018-05-24 (木) 18:34:12 |

クッキー

Posted by muchag | CakePHP 3.x | 2018-05-23 (水) 0:46:41


公式:クッキー

【環境】
CakePHP: 3.5.11
php: 7.1.5
はじめに

バージョン 3.5.0 で撤廃: クッキーは、 ServerRequest で利用できます。
クッキー をご覧ください。
クッキーの暗号化は クッキー暗号化ミドルウェア をご覧ください。

公式:クッキー

とのことなので、CookieComponent はサヨナラ~。

ただし、
Qiita:CakePHP3.5でCookieComponentが非推奨になり、Cookieの読み書きに苦労した話(2018-03-28)
にも書いてある通り、
クッキーを利用する=クッキー暗号化ミドルウェアを利用しなければならない
ではない。

概要

3.4.x までの CookieComponent に代わって
3.5.x では、クッキーコレクション というのを利用する?

ん~よくわからないけど、あれこれ試した結果
今のところはクッキーコレクションを利用しなくてもクッキーを利用できた。

利用
Cookie オブジェクト
/vendor/cakephp/cakephp/src/Http/Cookie/Cookie.php

public function __construct(
    $name,
    $value = '',
    $expiresAt = null,
    $path = '',
    $domain = '',
    $secure = false,
    $httpOnly = false
)
取得

$cookieValue = $this->request->getCookie('HOGE');
設定

$cookie = new Cookie(
    'HOGE',                     // name(名前)
    'hogehoge',                 // value(値)
    new DateTime('+30 day'),	// expiresAt(期限)
    '/',                        // path(パス)
    'example.com',              // domain(ドメイン名)
    false,                      // secure
    true                        // httpOnly
);

$this->response = $this->response->withCookie($cookie);
削除

$this->response = $this->response->withExpiredCookie('HOGE');
CakePHP 3.x | 2018-05-23 (水) 0:46:41 |

nvm

Posted by muchag | node.js | 2018-05-20 (日) 13:09:41

【環境】
nvm: 0.33.11
VirtualBox グラフィカルユーザーインターフェース: 5.1.24 r117012 (Qt5.6.2)
CentOS: 7.3.1611
インストール

GitHub:creationix/nvm:README.md Installation


curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12819  100 12819    0     0  14898      0 --:--:-- --:--:-- --:--:-- 14905
=> Downloading nvm from git to '/root/.nvm'
=> Cloning into '/root/.nvm'...
remote: Counting objects: 267, done.
remote: Compressing objects: 100% (242/242), done.
remote: Total 267 (delta 31), reused 86 (delta 15), pack-reused 0
Receiving objects: 100% (267/267), 119.46 KiB | 153.00 KiB/s, done.
Resolving deltas: 100% (31/31), done.
=> Compressing and cleaning up git repository

=> Appending nvm source string to /root/.bashrc
=> Appending bash_completion source string to /root/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

バージョンアップがあるので、毎回ここを見ること。

環境変数に登録

source ~/.bash_profile
手動登録

HORNET:CentOS6にnode.jsの最新バージョン(v8.4.0)をインストール nvmでインストール(2017-08-22)

情報確認

nvm -v

Node Version Manager

Note:  refers to any version-like string nvm understands. This includes:
  - full or partial version numbers, starting with an optional "v" (0.10, v0.1.2, v1)
  - default (built-in) aliases: node, stable, unstable, iojs, system
  - custom aliases you define with `nvm alias foo`

 Any options that produce colorized output should respect the `--no-colors` option.

Usage:
  nvm --help                                Show this message
  nvm --version                             Print out the installed version of nvm
  nvm install [-s]                 Download and install a , [-s] from source. Uses .nvmrc if available
    --reinstall-packages-from=     When installing, reinstall packages installed in 
    --lts                                   When installing, only select from LTS (long-term support) versions
    --lts=                        When installing, only select from versions for a specific LTS line
    --skip-default-packages                 When installing, skip the default-packages file if it exists
    --latest-npm                            After installing, attempt to upgrade to the latest working npm on the given node version
  nvm uninstall                    Uninstall a version
  nvm uninstall --lts                       Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.
  nvm uninstall --lts=            Uninstall using automatic alias for provided LTS line, if available.
  nvm use [--silent]               Modify PATH to use . Uses .nvmrc if available
    --lts                                   Uses automatic LTS (long-term support) alias `lts/*`, if available.
    --lts=                        Uses automatic alias for provided LTS line, if available.
  nvm exec [--silent]  [] Run  on . Uses .nvmrc if available
    --lts                                   Uses automatic LTS (long-term support) alias `lts/*`, if available.
    --lts=                        Uses automatic alias for provided LTS line, if available.
  nvm run [--silent]  []     Run `node` on  with  as arguments. Uses .nvmrc if available
    --lts                                   Uses automatic LTS (long-term support) alias `lts/*`, if available.
    --lts=                        Uses automatic alias for provided LTS line, if available.
  nvm current                               Display currently activated version
  nvm ls                                    List installed versions
  nvm ls                           List versions matching a given 
  nvm ls-remote                             List remote versions available for install
    --lts                                   When listing, only show LTS (long-term support) versions
  nvm ls-remote                    List remote versions available for install, matching a given 
    --lts                                   When listing, only show LTS (long-term support) versions
    --lts=                        When listing, only show versions for a specific LTS line
  nvm version                      Resolve the given description to a single local version
  nvm version-remote               Resolve the given description to a single remote version
    --lts                                   When listing, only select from LTS (long-term support) versions
    --lts=                        When listing, only select from versions for a specific LTS line
  nvm deactivate                            Undo effects of `nvm` on current shell
  nvm alias []                     Show all aliases beginning with 
  nvm alias                  Set an alias named  pointing to 
  nvm unalias                         Deletes the alias named 
  nvm install-latest-npm                    Attempt to upgrade to the latest working `npm` on the current node version
  nvm reinstall-packages           Reinstall global `npm` packages contained in  to current version
  nvm unload                                Unload `nvm` from shell
  nvm which [current | ]           Display path to installed node version. Uses .nvmrc if available
  nvm cache dir                             Display path to the cache directory for nvm
  nvm cache clear                           Empty cache directory for nvm

Example:
  nvm install 8.0.0                     Install a specific version number
  nvm use 8.0                           Use the latest available 8.0.x release
  nvm run 6.10.3 app.js                 Run app.js using node 6.10.3
  nvm exec 4.8.3 node app.js            Run `node app.js` with the PATH pointing to node 4.8.3
  nvm alias default 8.1.0               Set default node version on a shell
  nvm alias default node                Always default to the latest available node version on a shell

Note:
  to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`)
利用
バージョン確認

nvm --version
インストール可能な node.js のバージョン取得

nvm ls-remote
node.js インストール

// 安定版
nvm install stable
Downloading and installing node v10.1.0...
Downloading https://nodejs.org/dist/v10.1.0/node-v10.1.0-linux-x64.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v10.1.0 (npm v5.6.0)
Creating default alias: default -> stable (-> v10.1.0)

// バージョン指定
nvm install 8.0.0
npm
アップデート

npm update -g
/root/.nvm/versions/node/v10.1.0/bin/npm -> /root/.nvm/versions/node/v10.1.0/lib/node_modules/npm/bin/npm-cli.js
/root/.nvm/versions/node/v10.1.0/bin/npx -> /root/.nvm/versions/node/v10.1.0/lib/node_modules/npm/bin/npx-cli.js
+ npm@5.10.0
added 129 packages, removed 42 packages and updated 112 packages in 6.968s
[root@localhost sf_slim]# npm -v
5.10.0
参考サイト

Qiita:【俺用メモ】 CentOS6にNode.jsをインストールする nvmでインストールする場合(2018-02-10)
→インストール以外の使い方も載っている

ProgramMemo:CentOSにNode.jsをインストールする(2017-10-12)
→環境変数に登録する方法を参考にさせていただいた

node.js | 2018-05-20 (日) 13:09:41 |

インストール

Posted by muchag | VirtualBox | 2018-05-20 (日) 10:51:05


公式:nodejs.org

【環境】
node.js: 10.1.0
VirtualBox グラフィカルユーザーインターフェース: 5.1.24 r117012 (Qt5.6.2)
CentOS: 7.3.1611
インストール

方法は色々あるみたい。

標準コマンド

公式:Installing Node.js via package manager Enterprise Linux and Fedora


curl -sL https://rpm.nodesource.com/setup_8.x | bash -

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -

yum -y install nodejs

// ビルドツールのインストール(オプション)
yum install gcc-c++ make

CentOS は、こちらのタイプになるみたい。
Supported CentOS versions:

  • CentOS 5 (32-bit and 64-bit)
  • CentOS 6 (32-bit and 64-bit)
  • CentOS 7 (64-bit)
失敗する?

Qiita:CentOS 7.3でyum install nodejsが失敗するので回避する(2017-08-29)
こんな記事も見かけた。

バージョン管理ツール
nvm

Node Version Manager。
ということで、こちらにしてみる。
nvm

nodebrew

Qiita:node.jsのインストール方法(2017-09-25)

その他

nodeenv, nodist というのもあるらしい。
みかづきブログ その3:フロントエンドエンジニアがさくらVPS で Ubuntu + Nginx + Node.jsの環境を整えるまでの道のり – その2 – nodebrew、Node.js、npmの導入 😎(2017-04-12)

VirtualBox | 2018-05-20 (日) 10:51:05 |

データの削除

Posted by muchag | CakePHP 3.x | 2018-05-19 (土) 19:17:57


公式:データの削除

【環境】
CakePHP: 3.5.11
php: 7.1.5
一括削除

deleteAll メソッドに条件を渡す。


$this->deleteAll(['id' => 1]);
CakePHP 3.x | 2018-05-19 (土) 19:17:57 |

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column …

Posted by muchag | MySQL | 2018-05-19 (土) 19:09:04

【環境】
MySQL: 5.7.18
経緯

GROUP BY を用いたら、下記エラーが出た。

Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘dbnam.tablename.columnname’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因

Google 先生に質問すると、一杯出てきた。。。
MySQL 5.7 から仕様変更になったのが原因だそうな。

sql_mode=only_full_group_by
この部分。

my.cnf のデフォルトで sql_mode に only_full_group_by が追加されたため
GROUP BY を用いたときは、一意である値しか SELECT できなくなったとのこと。

解決策1

my.cnf の sql_mode から only_full_group_by を外してしまえば、5.6 までと同じように動作するとのこと。

解決策2
  • GROUP BY で指定したカラム
  • 集約関数を利用しているカラム
  • 全て同値であるカラム(?)

これらについては、SELECT できるので
それだけを指定する。

参考サイト

Qiita:脱!ゆるふわMySQL(2015-12-16)

MySQL | 2018-05-19 (土) 19:09:04 |

コマンド実行

Posted by muchag | PHP | 2018-05-18 (金) 23:53:31

php からサーバコマンドを実行する方法。

公式:execsystem

概要

php からサーバコマンドを実行するには
exec と system の2つの関数が用意されている。

二者の違いは、出力を返すか返さないかみたいだけど
引数指定次第でどちらも出力を返すみたいなので
結果的には、同じ働きなのかしらね~。

書式
exec

string exec ( string $command [, array &$output [, int &$return_var ]] )

第1引数:コマンド文字列
第2引数:出力格納用変数。省略可。省略すると出力を受け取れない
第3引数:コマンド実行結果ステータス格納用変数。省略可。省略するとステータスを受け取れない

system

string system ( string $command [, int &$return_var ] )

第1引数:コマンド文字列
第2引数:コマンド実行結果ステータス格納用変数。省略可。省略するとステータスを受け取れない

非同期処理

どちらもコマンド文字列に「 > /dev/null &」と付記してやることで、非同期に処理を実行できる。

注意:

プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、
プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。
そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

どうやら、上記付記内容は、出力をリダイレクトさせるものらしい。

参考サイト

SAMURAI:【PHP入門】外部コマンドの実行(exec)とコマンドライン実行の方法(2017-10-16)

PHP | 2018-05-18 (金) 23:53:31 |

ロギング

Posted by muchag | CakePHP 3.x | 2018-05-15 (火) 16:46:56


公式:ロギング

【環境】
CakePHP: 3.5.11
php: 7.1.5
レベル

公式:ロギング レベルを使う

Emergency システムは使用出来ません
Alert 今すぐ行動する必要がある
Critical 致命的な状態
Error エラー状態
Warning 警告状態
Notice 正常であるが、重大な状態
Info インフォメーションメッセージ
Debug デバッグレベルメッセージ
CakePHP 3.x | 2018-05-15 (火) 16:46:56 |

コンポーネント

Posted by muchag | CakePHP 3.x | 2018-05-06 (日) 19:31:23


公式:コンポーネント

【環境】
CakePHP: 3.5.11
php: 7.1.5
概要

複数のコントローラ内で利用する共通処理置き場。

トレイトと似た感じだけど、ちょと違う。。。らしい。

トレイトの危険性

あちこちでトレイトの利用を抑制する記事を見かける。

今までに理解したところで、直感的にわかりやすいのは
トレイトに処理を書くと

  • トレイトを量産している内に、メソッド(アクション)名が衝突する
  • public でメソッドを定義すると、アクションとして稼働してしまう

確かに危険。。。

読込

コンポーネントの読込には、下記のような制限があるとのこと。

方法 Controller  Component Shell
loadComponent OK NG NG
フィールド宣言 OK OK NG
インスタンス化 OK OK OK

Qiita:CakePhp3のComponentの使い方まとめ コンポーネントを読み込む(2017-04-21)

そか~それならいつもインスタンス化する癖をつけておけば
混同しないですみそう。

loadComponent の利点がわかると使い分けする気になるかも。

インスタンス化

早速インスタンス化してみた。ら、

Too few arguments to function Cake\Controller\Component::__construct(), 0 passed in /media/sf_slim/plugins/Akportal/src/Controller/Traits/PerformersTrait.php on line 82 and at least 1 expected

と、怒られたw

/vendor/cakephp/cakephp/src/Controller/Component.php

public function __construct(ComponentRegistry $registry, array $config = [])

ほーほー、なるほど、コンポーネントのコンストラクタには
第1引数に、必ず ComponentRegistry を渡さないといけないのね。


$component = new ScrapingComponent(new ComponentRegistry());

これで無事に成功。

設定

上記コンストラクタを見ると、第2引数が array $config となっている。

初期設定をインスタンス化時に渡すことができる、と。

公式:コンポーネント コンポーネントの設定


$this->loadComponent('Auth', [
    'authorize' => 'Controller',
    'loginAction' => ['controller' => 'Users', 'action' => 'login']
]);
$this->loadComponent('Cookie', ['expires' => '1 day']);

こんな風に、連想配列で渡せばよいみたい。


$this->Auth->config('authorize', ['controller']);
$this->Auth->config('loginAction', ['controller' => 'Users', 'action' => 'login']);

$this->Cookie->config('name', 'CookieMonster');

後から設定する場合は、こんな感じ。

CakePHP 3.x | 2018-05-06 (日) 19:31:23 |

ルーティング

Posted by muchag | CakePHP 3.x | 2018-05-03 (木) 16:04:18


公式:ルーティング

【環境】
CakePHP: 3.5.11
php: 7.1.5
概要

URL と処理のマッピング。

記述場所
アプリ全体
/config/routes.php
プラグイン
/plugins/MyVendor/MyPlugin/config/routes.php
メソッド
/vendor/cakephp/cakephp/src/Routing/Router.php

基本、static メソッドなので、Router:: で呼び出す。

今のところ、connect と scope の違いがよくわかっていない。

connect

public static function connect($route, $defaults = [], $options = [])
plugin

プラグインルーティングを実現。


public static function plugin($name, $options = [], $callback = null)
prefix

プレフィクスルーティングを実現。
プレフィックスルーティング

scope

public static function scope($path, $params = [], $callback = null)
url

public static function url($url = null, $full = false)
引数
検査

$routes->connect(
    '/articles/:id',
    ['controller' => 'Articles', 'action' => 'view'],
)
->setPatterns(['id' => '\d+'])
->setPass(['id']);

// 3.5 より前はオプション配列を使用
$routes->connect(
    '/articles/:id',
    ['controller' => 'Articles', 'action' => 'view'],
    ['id' => '\d+', 'pass' => ['id']]
);
参考サイト

SlideShare:極める routes.php(2009-05-24)
→CakePHP2 の記述だけど、考え方はとてもわかりやすい

CakePHP 3.x | 2018-05-03 (木) 16:04:18 |
次ページへ »