CentOS7上のpostfixからgmailを使ってメールを送信

面倒な割には手順が一箇所にまとまってないので、ここに記載します。

rpmのインストール

テストと認証に必要なrpmを入れます:

sudo yum install -y mailx cyrus-sasl-plain

gmailの2段階認証の有効可

Sign in - Google Accounts

gmailのアプリパスワードの作成

postfixからgoogleに対して認証する際、いつものgmailパスワードではなく、 postfix用の「アプリパスワード」なるものを作成します:

Sign in - Google Accounts

f:id:thebaker:20171125121547p:plain

「アプリ」はメール、「端末を選択」はCentOS7とかホスト名とかを記述します。 すると16桁のパスワードが発行されるのでメモしておきます。

postfixの設定変更

/etc/postfix/main.cfを開き、次を追記します:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
smtp_sasl_mechanism_filter = plain

パスワードファイルの作成

sudo vi /etc/postfix/saslpass

中は次のように記載します:

[smtp.gmail.com]:587 ユーザ名@gmail.com:16桁のパスワード

そして次を実行します:

sudo chown root:root /etc/postfix/saslpass
sudo chmod 600 /etc/postfix/saslpass
sudo postmap /etc/postfix/saslpass
sudo systemctl restart postfix

最後にテストです:

echo "hoge" | mail -s "test email" メールアドレス@gmail.com

CakePHP3:テーブルとかフォームでログを使いたい(Call to undefined method ::log() )

コントローラ、コンポーネント、ビュー、ヘルパーでは、次の記述でログを書き出せます:

$this->log("ほげほげ",LOG_DEBUG);

では、テーブルやフォームで同様のことを行うにはどうすればいいでしょうか? 選択肢は2つあります:

一回だけ使いたい場合:

\Cake\Log\Log::debug("ほげほげ");

複数回使いたい場合:

use Cake\Log\LogTrait;

class ContactForm extends Form
{
    use LogTrait;

    public function add
    {
        $this->log("ほげほげ",LOG_DEBUG);
    }
}

CakePHP3:3.5で増えた正規表現のバリデータ

CakePHP3.5から、バリデータが増えて正規表現を使いやすくなりました:

protected function _buildValidator(Validator $validator)
{
    return $validator->add('name', 'length',  
                         [ 'rule'    => ['minLength', 10],
                           'message' => '10文字以上で入力してください'
                         ])
                     ->add('email', 'format', 
                         [ 'rule'    => 'email',
                           'message' => 'メールアドレスの形式が間違っています'
                         ])
                     ->regex('option', '/^[1-3]$/', 
                             '1から3の間の値を選択してください', 'create');
}

CakePHP3:条件付きでallowEmptyにしたい場合

パスワードの入力欄と確認欄は「パスワードを変更しない場合は空欄でよい」というケースがあると思います。 これはallowEmptyにコールバック関数を指定することで実現可能です:

$validator
    ->allowEmpty('confirm_password', function ($context) {
        return empty($context['data']['password']);
});

上記の例では「パスワード欄が空の場合は、パスワード確認欄も空で良い」というバリデーションになります。

ソース:

バリデーション - 3.x

中国のEV事情にびっくり

ソースは本日の読売新聞から。

中国って、EVの販売台数がすでに日本・米国・ドイツより多いのね:

f:id:thebaker:20171124094204j:plain

EVだけでなく、普通の乗用車の販売台数も桁違いに多い:

f:id:thebaker:20171124094230j:plain

火力発電に頼っているので、同じEVを走らせても日本よりCO2の排出が多い、と:

f:id:thebaker:20171124094303j:plain

今後は、ベンツ・BMWのように確固たるブランドを築くか、EV関連で真似出来ない技術に 突出してないと日本の自動車会社は厳しいかもしれません。

そしてこれからか国内専用車はどんどんなくなっていきそうですね。

CakePHP3:認証失敗のエラーメッセージを動的に変更する

Authコンポーネントを設定するときに、認証失敗時のエラーを次のように定義します:

$this->loadComponent('Auth', [
        'authorize'      => [ 'Controller'],
        'authenticate'   => [ 'Form' => [ 'fields' => ['username' => 'email', 'password' => 'password' ] ] ],
        'loginRedirect'  => [ 'controller' => 'Blogs' , 'action' => 'index' ],
        'logoutRedirect' => [ 'controller' => 'Users', 'action' => 'login' ],
        'loginAction'    => '/users/login',
        'authError'      => 'Login required'
]);

authErrorをコントローラで変更したい場合はこうします:

if($user['role'] === 'admin'){
    return true;
}else{
    $this->Auth->config('authError','The page you accessed cannot be found');
    return false;
}

こちらに記載がありますが、なかなか見つけづらいんですよねw:

Authentication - 3.x

法人税率を下げると、法人税の税収はどうなるのか?

法人税率を下げると、法人税税収は下がるみたいですね:

f:id:thebaker:20171117184843p:plain

ただ法人税所得税+消費税のセットでみると、税収の下落はなんとか食い止めることができているみたいです:

f:id:thebaker:20171117185008p:plain

どちらのグラフも景気がどうであったかの補正を加えるといいかもしれません。

ソース:

www.mof.go.jp

www.mof.go.jp