いろいろ備忘録

雑記です。

TableとEntityが別れている理由

ブログチュートリアル - パート2

 

CakePHP のモデルクラスのファイルは、 Table オブジェクトと Entity オブジェクトに分離して 存在します。

 なぜわざわざ分けたのかとググる

Why did cakephp v3 split the Model into Table and Entity? What are the advantages? - Quora

私たちは"ORM"を改良したいと思って分割しました。

以前は、次のようなコードを書いていました。

#$userに一行入れている
$ user = $ this-> User-> find( 'first');
#画面に出力
echo $ user ['User'] ['name'];


これは多くの場合「うまくいく」ものですが、これらの状況で良くないです。

- データベースの外で結果セットを変更する(書式設定などの場合)

- 同じクラスのテーブルと行の両方を指定する必要がある。
先程の例のuser ['User'] ['name']のことです。

- データ検証の悪夢。

- CakePHPが内部で何のデータをどのように処理し、何を返り値とするのか、という点でのAPIの一貫性の無さ。

 

より良いか悪いかに関わらず、古いORMを捨てて、維持しやすく、開発しやすいものにアップグレードする必要があったため、テーブル/エンティティの分割が必要でした。

 

分割したことの利点

- 結果セットの実行時変更を行うことができます。
あなたのエンティティにメソッドを追加するだけで、結果を望む方法で返すことができます。これは、エンティティを管理するためにCompositeパターンを使用できることを意味します。

- データ検証が美しくなります。
データがオブジェクトに入る前の段階で検証でき、それからエンティティへ分割する時にもオブジェクトの状態を検証できます。

- プログラムがデータをどのように扱っているか理解することが簡単になります。
あなたはエンティティをオブジェクトとして、また、連想配列としても使えます。オブジェクトは他のオブジェクトを包含するデータをもつことができますが、配列のキーが何であるかを推測する必要もなく、そのネストされたデータを推測する必要もありません。

- テーブルとエンティティのインタフェースを個別に反復処理できます。今までModelクラスの内部構造を簡単に変更することはできませんでしたが、今では(理論的には)変更することができます。

- 先程書いたコードはもっと美しくなります。

$ user = $ this-> Users-> find( 'first');
echo $ user-> name;

 

らしい。(ほぼGoogle翻訳

PHPStormにcomposer.pharを設定 in Windows

Composerをインストールしていてコマンドプロンプトで使用出来ている場合、

where composerとコマンドプロンプトで打てば

composer.pharが存在するディレクトリが分かります。

 

こんな感じです。

C:\Users\ユーザー名>where composer
C:\ProgramData\ComposerSetup\bin\composer
C:\ProgramData\ComposerSetup\bin\composer.bat

pimpleの$cとは

 

$container['domain.transfer.newsletter'] = function($c) {

}

の$cは$containerの略で、コンテナ自身(this)らしい。

d.hatena.ne.jp

 

Note that $c will be passed an instance of the container, so we can reference other defined keys as we please; each defined parameter or object is available in the closure through the $c variable. 

PHP Master | Dependency Injection with Pimple


$cにはコンテナのインスタンスが渡されるので、他の定義されたキーが参照できます。定義されている各パラメータやオブジェクトは、$c変数を介することでクロージャ内で使用できます。(Google翻訳)

 

以下備忘録 :

・pimpleはゲッタ,セッタではなくArrayAccessインタフェースを実装しているので連想配列のように値を取得できる

・現行バージョンは2

 

pimple2 では、

$container['a'] = function($c) { return new B(); } と書くと
生成したインスタンスをキャッシュし、二度目も同じインスタンスを返す。
つまりシングルトンが出来るらしい。

呼び出しのたびにインスタンスを生成したい場合は、
$container['b'] = $container->factory(function($c) { return new B();});と書く。

iakio.hatenablog.com

PHPStormでのCakePHPにてDetect PSR-0 namespace rootsが出た時

CakePHP3のブックマークチュートリアルのUserモデルをPHPStormで編集していると

Detect PSR-0 namespace roots: Do you want to configure namespace roots? It can be done automatically or manually at Settings | Directories.

という警告が右下に出た。

\Cake\I18n\Timeなどがどこを指すのか分からないらしい。

 

解決策

編集時に単一のファイルを読み込むのではなく、

/bookmarker
    /bin
    /config
    /logs
    /plugins
    /src
    /tests
    /tmp
    /vendor
    /webroot
    .editorconfig
    .gitignore
    .htaccess
    .travis.yml
    composer.json
    index.php
    phpunit.xml.dist
    README.md

のbookmarkerフォルダを読み込んで、右下に件のダイアログが出たらautomaticallyをクリックすること。

どうしても単一のファイルを読み込みたいときは手動でフォルダを指定しなければならないっぽい。

OpenCVで画像の透明なピクセルの割合を調べる

完全に透明の部分しか渡せません。

Python 2.7.10

 

# -*- coding:utf-8 -*-
import cv2

#アルファチャネルを読み込むためにcv2.IMREAD_UNCHANGEDを渡す
image = cv2.imread('exa.png',cv2.IMREAD_UNCHANGED)
#countNonZeroは1チャネルの画像しか渡せないので、アルファチャネルのみ取り出す
transparentArray = cv2.split(image)[3]
# == transparentArray = image[:,:,3]
imageLen = image.shape[0] * image.shape[1]
#透明はアルファチャンネルが0の部分
alphaLen = imageLen - cv2.countNonZero(transparentArray)

print float(alphaLen) / imageLen

 

今回は必要でないので試していませんが、アルファチャネルが10以下など、完全に透明でない場合は

np.where(np.logical_and(a<=10))

のようにするかもしれません。