前の記事が2年前だった、、、。
リアルにCakePHP3のサイトをいくつか(3つかな)作っていてこちらに手が回りませんでした。
整理のためにCakePHPのバージョンを3.8.2アップして続きを書きます。

認証メソッドを追加する

先に認証コンポーネントで以下の設定をしました。

認証時にAdminテーブルを検索する時に findAuth メソッドを使用する。

このための実装は次のようになります。Model\Entity\Admin.php追加します。

public function findAuth(\Cake\ORM\Query $query, array $options)
{
$query
->select(['id', 'admin_cd', 'admin_name','password','role'])
->where(['Admin.delete_flg' => 0
]);

return $query;
}

パスワードはハッシュ化してから保存する必要があります。
対象は Model\Entity\Admin.php で定義の部分に次を追加します。

use Cake\Auth\DefaultPasswordHasher;

ハッシュ化部分には次を追加します。

protected function _setPassword($value)
{
if (strlen($value)) {
$hasher = new DefaultPasswordHasher();

return $hasher->hash($value);
}
}

これで準備は完了していますが、/admin/admin にアクセスするとはじかれちゃいますよ。はて、管理者はどうやって登録するんだ?

最初の管理者を登録するために、 Controller\Admin\AdminController.php に次のコードを追加します。

public function beforeFilter(\Cake\Event\Event $event) {
parent::beforeFilter($event);
$this->Auth->allow('add');
}

これで /admin/admin/add にアクセス出来て管理者が追加できるようになります。追加した管理者でログインできたらめでたしめでたし。
(※ 最初の管理者を追加したらこのコードは削除してください。)

とりあえず今回は終了。後は何を書こうか。

またまたお仕事のお話。

macOS Serverの提供内容が大幅縮小

Macをメインでお使いのお客様。社内のサーバーもmacOS Serverをお使いでファイルサーバー、チャット、共有カレンダー、そしてWikiを活用されておりました。ところが、青天の霹靂、AppleがmacOS Serverの機能を大幅に縮小するとのこと。さてどうしたものかと検討と代替を進めました。

いろいろ使って終了に備える

こんな感じ↓で進めましたが、困ったのがWikiでした。

  • ファイルサーバー
     → ファイル共有で対応
  • チャット
     → 在席状況を文書で共有することで対応
  • 共有カレンダー
     → カレンダーデータを別の共有カレンダーに移行して対応

Appleの文書によると、Wikiのデータはツールでエクスポートできるらしいのですが、どうもコマンドが文書通りに働きません。お客様はAppleの有料サポートを契約されておられるので確認したところ、macOS ServerのバージョンをWikiが使える最後のバージョンまで上げる必要があり、さらにそのためには事前にOSのバージョンアップも行わなければならない、とのこと。

バージョンアップでひと悶着

念のため当該Macの複製をご用意いただいて、なかなかの時間をかけてOSのバージョンを上げましたが、Apple Store には旧バージョンのmacOS Server が出てきません。さらにサポートで確認すると、旧のmacOS Server を購入したアカウントで無ければならないとのこと。そのアカウントは以前サポートしてくれていた方のもので、さて今さらわかるのかと思ったら、意外とすんなりわかって無事AppleStoreに再ログイン、でもダウンロード出来ない。サポートの方の言葉を思い出して、現状のServerアプリを圧縮、退避してから削除すると無事にダウンロード、アップデートが完了しました。

エクスポート出来た!、でもちょっと残念

早速文書の通りにエクスポートしてみたのですが、結局こんな感じになってしまってなんだか残念な結末になってしまいました。

  • HTML形式では文書の構造が思ったより変わってしまう
  • WordPress形式では本文が文字化けしてしまう

まぁ、過去の資産がゼロにならないでけでもよかったね、くらいでしょうか。情報共有は必要なので、何か別の方法を考えなければいけなさそうです。

とある案件で大きめファイルのアップロードを実装しました。
手元の開発環境(Windows+XAMPP)では問題なく150MB越えのファイルをアップロードできたのに、検証環境ではエラーになるますがとのご連絡。
試してみたところ、以下のメッセージが確認できました。

Request Entity Too Large
The requested resource
/xxxxx/xxxxx/xxxxx/xxxxx
does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.

Google先生に訊いたり、Webサーバのエラーログを確認したところApacheのModSecurityで128MBの制限が掛かっているようでした。
レンタルサーバではいかんともしがたい(と思う)ので、代替策で解決の方向です。(ちなみにサーバはエックスサーバーのプランX10。)
PHPなどの設定では問題が無いはずなのにエラーになる場合にチェックする時の備忘録として。

Office365を使ってて、Macでアカウント認証が出来なくなったときの備忘録。
こちらのサイトを参考にライセンス削除をしてから再認証したら問題解決しました。
https://support.office.com/ja-jp/article/office-2016-for-mac-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E8%AA%8D%E8%A8%BC%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%82%A8%E3%83%A9%E3%83%BC-0xd000000c-da865931-4658-4829-ba2d-8133390c6d25

近所の富士そばでお昼を食べていたら、いつものように演歌が流れているだけじゃなく、
富士そばにまつわる本が紹介されてたので読んでみました。


タイプの違う本だけど、面白かったです。

いろいろと工夫が続けられていて、確かに前より美味しくなってる気がします。

たった今、丹 会長が「知恵泉(NHK)」に出てるので思い出してメモ。
(読み終わった本をタイトルごと忘れていってしまう悲しさよ。)

かつて週刊モーニングで連載されていた「蒼天航路」が好きでした。

そんな話が出てくるのかと思って借りて読んでみたら、その通りで満足。
歴史の見方って、小説や演劇、テレビドラマや映画に影響を受けて変わるものですよね。

さて、サクサク進めましょう。

ログインを実装する

管理画面用の AppController.php に認証コンポーネントを設定しました。その結果 /admin/ アクセスしようとすると /admin/admin/login に遷移するようになりましたので、早速ログインを実装してきます。

こちらもチュートリアルの記事が参考になります。AdminController.php にloginメソッドを追加します。

public function login(){
    if ($this->request->is('post')) {
        $admin = $this->Auth->identify();
        if ($admin) {
            $this->Auth->setUser($admin);
            return $this->redirect($this->Auth->redirectUrl());
         }
         $this->Flash->error('管理者IDかパスワードが不正です。');
    }
}

loginテンプレートを作成します。Template/Admin/Admin/login.ctp を作成して、こんな感じでフォームを作ります。

<h1>管理者ログイン</h1>
<?= $this->Form->create() ?>
<?= $this->Form->control('admin_cd') ?>
<?= $this->Form->control('password') ?>
<?= $this->Form->button('Login') ?>
<?= $this->Form->end() ?>

ログインした後のことを考えて、 home メソッドとテンプレートも作りましょう。

AdminController.phpに以下を追加します。

public function home(){

}

Template/Admin/Admin/home.ctp を作ります。中身は適当に。

ログアウトも必要ですね。logoutメソッドも作りましょう。AdminController.phpに以下を追加します。

public function logout() {
$this->Flash->success('ログアウトしました');
return $this->redirect($this->Auth->logout());
}

1,000文字超えてしまったので、続きはまた次回。

だいぶ間があいてしまいました。
が、バージョン3.5もリリースされたことなので、そちらを使って管理画面の構築を続けていきます。
CakePHPのアプリケーションが作成されていて、DBの設定とPrefixルーティングが済んだ状態の想定です。

adminテーブルを作る

まずはテーブル「admin」を作ります。
最近はバージョン管理システムでスキーマの変更も管理できるように、PHPスクリプトでテーブルを作ったりすることも出来るようですが、レトロエンジニアな私はDDLで作ります。こんな感じ。

--
-- テーブルの構造 `admin`
--

CREATE TABLE `admin` (
`id` int(11) NOT NULL,
`admin_cd` varchar(255) CHARACTER SET utf8 NOT NULL,
`admin_name` varchar(64) CHARACTER SET utf8 NOT NULL,
`password` varchar(255) NOT NULL,
`role` char(1) NOT NULL DEFAULT '0',
`delete_flg` char(1) NOT NULL DEFAULT '0',
`create_user` int(10) NOT NULL,
`modified_user` int(10) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `admin`
--
ALTER TABLE `admin`
ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `admin`
--
ALTER TABLE `admin`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

いずれ管理者ごとに権限を制御をするかもしれないので、一般的そうな項目に「role」を付け加えておきました。

モデルとテンプレートをbakeする

テーブルが出来たら、そう、bakeしてモデルとテンプレートを作ります。

bin\cake bake model admin
bin\cake bake template --prefix admin admin

–prefix を忘れずに。(はい、私は忘れました_| ̄|○。)

再度 /admin/Admin にアクセスしてみましょう。
こんな風に表示されたらOKです。

これで下準備が終了。

管理者ログインを作成して、認証を設定する

管理者用のログイン処理、認証コンポーネントを設定していきます。
CakePHP3 で一般ユーザにログインを追加する方法は、チュートリアルのこちらに詳しく記載があります。
ここで考えなきゃいけないのが、作りたいのが「管理者」用のログインであるということです。
すなわち、一般ユーザとは分ける必要があります。
結論を言うと、以下のように設定していきます。

  • /admin/ 用の AppController.php を追加する。
  • 追加した AppController.php に管理者に認証コンポーネントを設定する。
  • AdminController.php の継承元を追加した AppController.php に変更する。

/admin/ 用のAppController.php は元々あるAppController.php をコピーして作り、namespace 部分を次のように変更します。
namespace App\Controller\Admin;
チュートリアルを参照しながら、Authコンポーネントを設定します。具体的には initialize メソッドを次のようにします。
public function initialize()
{
    parent::initialize();

    $this->loadComponent('RequestHandler');
    $this->loadComponent('Flash');

    $this->loadComponent('Auth',[
        'authenticate' => [
            'Form' => [
                'userModel' => 'Admin',
                 'fields' => [
'username' => 'admin_cd',
'password' => 'password'
],
              'finder' => 'auth',
            ]
        ],
        'loginAction' => [
'controller' => 'Admin',
'action' => 'login'
],

        'loginRedirect' => [
             'controller' => 'Admin',
             'action' => 'home',
        ],
        'storage' => [
'className' => 'Session',
'key' => 'Auth.Admin'
]

]);
}

ポイントは次の通りです。ソースの上から順番に。
(ソースコードがフォーマット出来てなくゴメンなさい。)

  • モデル(テーブル)はAdmin(admin)を使用する。
  • ログインのID / パスワードには、項目名 admin_cd / password を使用する。
  • 認証時にAdminテーブルを検索する時に findAuth メソッドを使用する。
  • ログイン処理は /admin/login (Adminコントローラの login メソッド)で行う。
  • ログイン後は /admin/home (adminコントローラの home メソッド)にリダイレクトする。
  • ログイン状態を Session の Auth.Admin というキーに格納する。

AdminController.php の継承元をこのファイルに変更します。
use App\Controller\Admin\AppController;

再度、 /admin/Admin にアクセスしてみると、こんなエラーになりました。

そりゃ当たり前だ。まだ login メソッド作ってませんからね。

認証を先に設定してしまったので編集画面にたどり着けませんでしたが、次回は是非。

去年から今年に掛けてCakePHP3を使ってWebシステムをいくつか作っております。
Webシステムと言えば管理画面が必要になりますね。そこで主に自分のためにCakePHP3を使った実装手順を整理してみることにしました。
なお、文中、フロント側とは一般のサイト利用者が使う側、管理側はサイトの管理者が使う側を指しています。

CakePHPはフロント側と管理画面で同じものを使う

以前、CakePHP1.3を使って同様に独自CMSなWebシステムを構築したときには、フロント側と管理側、それぞれ用にCakePHPを用意して使いました。
ルーティングがうまく使いこなかったこと(調べたり試したりする時間も無かった)、フロント側と管理側で体制が分かれていたのが理由でした。今回は、それではあんまりにも格好悪いので1つのCakePHP3でフロント側、管理側で共有しようと思います。

プレフィックスルーティングで管理側をフロント側から分離する

1.3で使いこなせなかったプレフィクスルーティングを3.0のCookBookで見てみます。なんだか以前よりスッキリしている気がします。config/routes.phpに以下を追加すると/adminでアクセス出来るようになって、src/Controllers/Admin 以下のコントローラが呼び出されるらしい。そしてテンプレートはsrc/Template/Admin/に用意すればいいと書いてあります。

Router::prefix('admin', function ($routes) {
$routes->fallbacks('DashedRoute');
});

この記述だけを追記した状態で /admin/Admin/ にアクセスしようとすると、Missing Controllerのエラーが表示されます。(Adminテーブルを管理するイメージ)

Controller/Adminの下にAdminController.php を作ってAdminControllerクラスを定義せよとのことです。
bakeでさくっとコントローラを作成します。(Windows環境なので \ がディレクトリを指しています。)

※アプリケーションのディレクトリで実行
bin\cake bake controller --prefix admin admin

気をつけるのは –prefix admin を付けること。これでController/Admin以下にファイルが作られます。この状態でアクセスすると、エラーの内容がadminテーブルが無いに変わりました。

そりゃ当たり前だ。まだ作ってないんだから。

今回はここまで。次回は管理者の管理用のadminテーブルを追加して、編集画面を作っていきたいと思います。

仕事がばたついていてなかなか手を付けられなかった「奇跡の営業所」をようやく読みました。

すぐに使えるノウハウがたくさん、なのに泣ける

この本は、実際にあった出来事が元になっています。実話を元にした物語が6割、解説が4割と言ったところでしょうか。(ページ数ではなく内容として。)
物語編では、営業のプロである吉田氏と彼が赴任した営業所でおこった2つの奇跡が、いかにしてなされたかが語られ、解説編では、どんな考え方や仕組みが2つの奇跡を起こしたのかが、具体的に紹介されています。

解説編の内容は本当にすぐに使えるレベルで、資料の作り方、アポの取り方、チーム力の高め方が具体的に書かれています。物語編を引用しながらなので、嘘くさくありません。もちろん、そうする「目的」も示されているのですが、ともすると抽象的な「目的」だけを熱く訴えて具体的に「何をすべきか」は読者にお任せな本もある中、この本では読み終わったらすぐ行動に移せそうです。物語に見た奇跡は、自分たちにも起こせるのかも知れない、そんな気持ちにさせられます。

物語編については、ネタバレになりますので内容には触れませんが、仲間の力を信じ、誠実に努力と工夫を積み重ねていけば「奇跡」だって起こせる、そんな清々しいお話でした。フリーランスとして1人で仕事をすることの多い私にとっては、かつて組織の中で働いたことが懐かしくなり、またちょっとだけ羨ましく感じました。お話の中ではチームが出した成績が「奇跡」として描かれていますが、本当の「奇跡」はそこに関わった人々におきた「変化」では無かったかと私は思っています。

最後に。
何人かの方が書かれていますが、初めて読むときはくれぐれも人前で読みませんよう。特に71ページ目からは要注意です。