pg_dumpallで出力されてたEUC_JPのデータベースをUTF-8にしてpsqlを使ってリストアする

環境

$ sw_vers
ProductName:    macOS
ProductVersion: 12.0.1
BuildVersion:   21A559

$ nkf --version
Network Kanji Filter Version 2.1.5 (2018-12-15)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2018, The nkf Project.

ファイルエンコーディング変更

nkf -E -w --overwrite [pg_dumpallファイル]

EUC_JPをUTF-8に置換

vimなどで

g/EUC-JP/s//UTF-8/gc

リストアする

psql < pg_dumpallファイル

余談

pg_restoreとpsqlとの違いがわからなかったが、pg_restoreはアーカイブファイルからリストアリストで利用するらしい

https://www.postgresql.jp/document/9.2/html/app-pgrestore.html

PHPでログイン時にセッションIDの変更

まずは単純にログインをする

<?php

session_start();

echo 'セッションID: ' . session_id() . "\n";

if (!isLogin()) {
    echo "Start to login\n";
    login();
} else {
    echo "already logged in\n";
}

echo 'セッションID: ' . session_id() . "\n";

function login()
{
    $_SESSION['login'] = true;
}

/**
 * @return bool
 */
function isLogin()
{
    return (bool) $_SESSION['login'];
}

1回目のアクセス

セッションID: ka0a429ht11vq1ehbkom3fek2n
Start to login
セッションID: ka0a429ht11vq1ehbkom3fek2n

2回目の以降のアクセス

セッションID: ka0a429ht11vq1ehbkom3fek2n
already logged in
セッションID: ka0a429ht11vq1ehbkom3fek2n

となり、ログインができるがセッションIDは変更されない

ログイン時にセッションIDを変更する

<?php

session_start();

echo 'セッションID: ' . session_id() . "\n";

if (!isLogin()) {
    echo "Start to login\n";
    login();
} else {
    echo "already logged in\n";
}

echo 'セッションID: ' . session_id() . "\n";

function login()
{
    session_regenerate_id(true);

    $_SESSION['login'] = true;
}

/**
 * @return bool
 */
function isLogin()
{
    return (bool) $_SESSION['login'];
}

1回目のアクセス

セッションID: 5ae9gjof2qhdhh7gcduqbpugn8
Start to login
セッションID: vul4fl9t26cq0uhpq0it4fq4sh

2回目の以降のアクセス

セッションID: ka0a429ht11vq1ehbkom3fek2n
already logged in
セッションID: ka0a429ht11vq1ehbkom3fek2n

となり、ログイン前にセッションIDが変更されている

セッションをDBに保存するタイプでログイン時にセッションIDを変更する

セッション保存ようのテーブルを作成する

CREATE TABLE `session_storage` (
  `session_id` varchar(255) NOT NULL,
  `session_data` longtext NOT NULL,
  `session_time` bigint(20) NOT NULL,
  PRIMARY KEY (`session_id`)
);
<?php

define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', 'password');

class MySessionHandler implements SessionHandlerInterface
{
    /**
     * @var PDO
     */
    protected $db;

    /**
     * @return bool|void
     */
    public function close()
    {
        $this->db = null;

        return true;
    }

    /**
     * @param string $session_id
     * @return bool
     */
    public function destroy($session_id)
    {
        $sql = 'DELETE FROM session_storage WHERE session_id = ?';
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([$session_id]);
    }

    /**
     * @param int $maxlifetime
     * @return bool
     */
    public function gc($maxlifetime)
    {
        $sql = 'DELETE FROM session_storage WHERE session_time < ?';
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([(time() - $maxlifetime)]);
    }

    /**
     * @param string $save_path
     * @param string $name
     * @return bool
     */
    public function open($save_path, $name)
    {
        $db = new PDO('mysql:host=' . DB_HOST . '; dbname=' . DB_NAME, DB_USER, DB_PASS);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        if (!$db) {
            die('DB接続失敗');
        }
        $this->db = $db;

        return true;
    }

    /**
     * @param string $session_id
     * @return string
     */
    public function read($session_id)
    {
        $session_data = '';

        $sql = ' SELECT';
        $sql .= '   session_data';
        $sql .= ' FROM';
        $sql .= '   session_storage';
        $sql .= ' WHERE';
        $sql .= '   session_id = ?';
        $sql .= '   AND session_time > ? ';

        $stmt = $this->db->prepare($sql);
        $stmt->execute([$session_id, time() - ini_get('session.gc_maxlifetime')]);

        if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $session_data = $row['session_data'];
        }

        return $session_data;
    }

    /**
     * @param string $session_id
     * @param string $session_data
     * @return bool
     */
    public function write($session_id, $session_data)
    {
        $sql = 'SELECT * FROM session_storage WHERE session_id = ?';
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$session_id]);

        if ($stmt->fetch(PDO::FETCH_ASSOC)) {
            $sql = 'UPDATE session_storage SET session_data = ?, session_time = ? WHERE session_id = ?';
            $stmt = $this->db->prepare($sql);
            return $stmt->execute([$session_data, time(), $session_id]);
        }

        $sql = 'INSERT INTO session_storage (session_id, session_data, session_time) ';
        $sql .= ' VALUES (?, ?, ?)';
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([$session_id, $session_data, time()]);
    }
}

$session_handler = new MySessionHandler();
session_set_save_handler($session_handler, true);

session_start();

echo 'セッションID: ' . session_id() . "\n";

if (!isLogin()) {
    echo "Start to login\n";
    login();
} else {
    echo "already logged in\n";
}

echo 'セッションID: ' . session_id() . "\n";

function login()
{
    session_regenerate_id(true);

    $_SESSION['login'] = true;
}

/**
 * @return bool
 */
function isLogin()
{
    return (bool)$_SESSION['login'];
}

1回目のアクセス

セッションID: qo99kgbopvijf1v5aj9bhkssr5
Start to login
セッションID: meo8ef2kuplvs3m6mf6p5g0ks4

2回目の以降のアクセス

セッションID: meo8ef2kuplvs3m6mf6p5g0ks4
already logged in
セッションID: meo8ef2kuplvs3m6mf6p5g0ks4

CentOS7にPostgreSQLをインストール

PostgreSQLをインストールと初期設定と起動

# yum install postgresql-server
# psql --version
# postgresql-setup initdb
# systemctl enable postgresql.service
# systemctl start postgresql.service

md5認証に統一

まずはパスワードの変更

# su postgres -c 'psql --username=postgres'
postgres=# postgres=# ALTER USER postgres with encrypted password 'パスワード'
postgres=# \q 

md5認証に統一

# vim /var/lib/pgsql/data/pg_hba.conf
#local   all             all                                     peer
local   all             all                                     md5
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

postgresql を再起動

systemctl restart postgresql.service

データベース作成

# createdb sample -U postgres

さくらインターネットのVPSを契約したらまず最初にやること

OS は CentOS7 を契約しました

まずは「yum update」

yum update

ユーザーを作成してrootでのSSHログインを禁止

ログインするためのユーザーとついでにグループを作成

groupadd -g 10000 developer
useradd -u 20000 tsmsogn -g 10000
passwd tsmsogn

rootログインできないようにして、sshdを再起動

vim /etc/ssh/sshd_conf
# PermitRootLogin no
service sshd restart

CakePHP3、Return-Pathが効かないときの対応方法

特定の条件下では Email->setReturnPath() で設定した Return-Path が効かないようだ

今回は、local の sendmail を使っていて、この現象に遭遇

$email->getTransport()->setConfig(['additionalParameters' => '-f admin@example.com']);

して回避

そういえば、CakePHP2 のときも、この現象あったな