いろいろ備忘録

雑記です。

Apacheのリバースプロキシに失敗する

AH00016: Configuration Failed
[Thu Jul 06 22:46:50.368024 2017] [core:notice] [pid 11224] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Thu Jul 06 22:46:50.368903 2017] [suexec:notice] [pid 11224] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Jul 06 22:46:50.395794 2017] [so:warn] [pid 11224] AH01574: module proxy_module is already loaded, skipping
[Thu Jul 06 22:46:50.395819 2017] [so:warn] [pid 11224] AH01574: module proxy_http_module is already loaded, skipping
[Thu Jul 06 22:46:50.395828 2017] [so:warn] [pid 11224] AH01574: module proxy_wstunnel_module is already loaded, skipping
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
[Thu Jul 06 22:46:50.398053 2017] [auth_digest:notice] [pid 11224] AH01757: generating secret for digest authentication ...
[Thu Jul 06 22:46:50.398625 2017] [lbmethod_heartbeat:notice] [pid 11224] AH02282: No slotmem from mod_heartmonitor
[Thu Jul 06 22:46:50.423201 2017] [mpm_prefork:notice] [pid 11224] AH00163: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 PHP/5.4.16 mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
[Thu Jul 06 22:46:50.423234 2017] [core:notice] [pid 11224] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Thu Jul 06 22:46:59.841797 2017] [proxy:error] [pid 11226] (13)Permission denied: AH00957: HTTP: attempt to connect to 127.0.0.1:3000 (localhost) failed

 

SELinuxのせいでした。

CakePHP3でトランザクションの使い方

計算処理を減らすため、中間テーブルと同時に行を挿入しなければならない時など、

トランザクション処理を行いたい場面はよくあります。

そんな時CakePHP3では

 ConnectionManager::get('default')->transactional

というメソッドを使います。

使用例はこちらです。

$result = false;
try {
$result = $connection->transactional(function ( $connection ) use ( $insertOneQuery, $insertTwoQuery ) {
$insertOneQuery->execute();
$insertTwoQuery->execute();
return true;
});
}catch (\PDOException $e) {
}

 

transactional()の引数の無名関数内に実行したい処理を書きます。

 

もし外部の変数を使いたいときはuseで追加してください。

 

無名関数の返り値はtransactional()の返り値になります。

今回はトランザクションが成功したかどうかが必要だったので、無名関数の最後にreturn trueしました。

つまり成功した場合は$resultにtrue,失敗した場合は$resultにfalseが入ります。

PHPStormにコード補完させる in CakePHP3のテンプレート

拡張子ctpで表されるテンプレートファイルはHTMLとPHPが混在するファイルで非常に便利です。

しかし、PHPStormには、テンプレートファイルが何のクラスのインスタンスなのか理解できません。コントローラから$this->set(compact('hoge'))のようにセットされた変数も同様です。

つまりコード補完も効きません。

コード補完を効かせるためには、テンプレートがどのインスタンスなのか等をPHPDocに書いてやる必要があります。

PHPDocで変数の型を補足するのは、 @var クラス 変数名 の書式です。

これをテンプレートファイルの先頭に書きます。

 

<?php
/**
*
* ①対象:テンプレートファイルすべて
* テンプレートはすべてこのインスタンスとなる
* @var \App\View\AppView $this
*
* ②対象:コントローラから変数をセットしているテンプレートすべて
* 変数が存在することを宣言、そして、その型を指定する
* 例1 シンプルな例
* @var String $season
* 例2 配列の場合
* @var \App\Model\Entity\User[][] $users
*
*/
?>

 

参考はここです。

bashalog.c-brains.jp

エンティティのデータを加工して取り出したいとき

仮想プロパティーの生成

アクセサーを定義することによって、現在存在しないフィールド・プロパティーへのアクセスを提供できます。 例えば、users テーブルが first_namelast_name 列を持っていたとして、 フルネームのためのメソッドを作れるということです。

namespace App\Model\Entity;

use Cake\ORM\Entity;

class User extends Entity
{

    protected function _getFullName()
    {
        return $this->_properties['first_name'] . '  ' .
            $this->_properties['last_name'];
    }

}

仮想プロパティーは、エンティティーに存在するかのようにアクセスできます。 プロパティー名は小文字と ”_” を使ってメソッド名を表記します。

echo $user->full_name;

引用元:エンティティー

 

関連のあるテーブルをまとめて持ってくる

アソシエーション - モデル同士を繋ぐ

例えば、
articles(id, title, text, author_id)とauthors(id,name)というテーブルがあるとする。

【記事を取得するとき、筆者の名前もまとめて持ってきたいときのやること】

$this->belongsTo('Authors')->setForeignKey('author_id');をArticlesTableのinitializeに記述する。
なお、setForeignKeyの引数は、外部キーの列名が被参照テーブル名の単数形 + _idのときは省略できる。つまり今回は省略できる。もしarticles(id, title, text,hissha_id)だったら省略できない。

find()->contain(['Authors'])という風に、find()するときまとめたいテーブルや列名を指定する

なお、Authorsテーブルにodenテーブルが関連づいていて、
ついでにodenテーブルも関連付けたいときには、
find()->contain(['Authors','Authors.oden'])とドット区切りでテーブル名を指定する

CakePHP3でfind()した結果を自然な順にソートする

intではなくcharに数字を入れているとき

1

10

~~~~~

19

2

20

とソートされる。

自然順にソートするのは


$answers = $this->TfAns->find()
->where(['TfAns.regnum = ' => $regnum])
->toArray();
$answers = new Collection($answers);
$answers = $answers->sortBy('qesnum',SORT_NATURAL);

MVVMのプロジェクトを読む アクティビティのonCreate()編

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//レイアウトをセットしbindingを得る
binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
// ビューモデルを生成する
// ContextはStringリソースの取得と、モデル(Retrofitインスタンス)の取得に使用する
// リスナ(ビューモデルの通知先)としてこのビュー(アクティビティ)を渡す
mainViewModel = new MainViewModel((Context)this,(MainViewModel.DataListener)this);
// ビュー(レイアウト)とビューモデルの紐付け
binding.setViewModel(mainViewModel);
// このbinding.toolbarやbinding.reposRecyclerViewは
// レイアウトのXMLファイルのビューのIDを参照する
this.setSupportActionBar(binding.toolbar);
this.setupRecyclerView(binding.reposRecyclerView);
}