cakephperの日記(CakePHP, Laravel, PHP) Twitter


継続的WebセキュリティテストサービスVAddyを始めました!

2015-12-21

SequelProでViewテーブルを表示すると日本語が文字化けする問題の解決

新しいMacに移行したところSequelPro1.1でViewテーブルを表示すると日本語が ??? という表示になってしまう問題が発生した。

Viewではない通常のテーブルは問題なく日本語表示される。

解決方法は、

環境設定 -> 一般 -> デフォルトエンコーディング

の値を自動判別からUTF-8に変更するだけ。


たぶんこの方の問題も同じように解決する気がします。

http://d.hatena.ne.jp/genhou/20131224/1387915831

2015-08-14

ApacheやNginxのSSL関連のおすすめ設定を生成する便利サイト

ApacheやNginxとopensslのバージョンを指定するとおすすめの暗号スイートなど、SSL設定ファイルを表示してくれるMozillaのサイトがあります。

https://mozilla.github.io/server-side-tls/ssl-config-generator/

f:id:cakephper:20150814095815p:image:w640


これを使えば安全な暗号スイートのみを使ってる設定などが簡単に生成されますので、この通りに指定すれば良いです。

Apacheの場合はデフォルトでは暗号スイート設定の記述はなかったと思いますが、下記の3つは表示通りに指定しておくのが良いかと思います。

SSLProtocol

SSLCipherSuite

SSLHonorCipherOrder


Oldを選択すると、古いブラウザにも対応してる暗号スイートを含めます。ただ暗号強度が弱いものが含まれるためサイトのアクセス傾向をみて古いブラウザのアクセスが無いのであればOldは選択しないほうが良いと思います。

2015-07-31

LaravelのマイグレーションでView Tableを作成する

Laravel5で試していますがLaravel4でも問題なく動くと思います。

複雑なテーブル構成の場合、LaravelのEloquentなどで頑張ってリレーションの情報を定義して取得するのも良いのですが、書き間違えて違うidを参照してしまったり、メンテナンスする際に毎回確認するのも面倒なので、複雑なテーブルはView Tableにして参照することにしました。

これなら、View Table用のモデルファイルを作ってselect一発で情報が取得できます。その代わり、Lazy Loadingが使えずにjoin結果全てを取得してしまいますのでご注意を。


テストでも利用したいのでマイグレーションで管理することにしました。

下記のように、foo_barというView Tableを作成します。

ファイルは、

database/migrations/2015_07_31_000000_create_foo_bar_table.php

のようにします。

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateViewFooBarTable extends Migration {

    public function up()
    {
        DB::statement( 'DROP VIEW IF EXISTS foo_bar' );
        DB::statement( "CREATE VIEW foo_bar AS 
          SELECT * FROM foo INNER JOIN bar ON (foo.id = bar.foo_id)
          " );
    }


    public function down()
    {
        DB::statement( 'DROP VIEW IF EXISTS foo_bar' );
    }

}

もしfoo_barが存在していればDropするようにしています。これは、将来このView Tableに変更が加えられた場合は、通常のテーブルのように差分のみ変更を適用することができないため、もう一度dropしてcreate viewし直す必要があるためです。その時は、このファイルをコピーして新しいマイグレーションファイル名でdropしてcreateし直せばよいからです。

2015-04-27

CakePHP2のPaginateでCASE式などを使ったフィールドを指定してソートする方法

CakePHP2で、CASEやCONCATなどを使ってテーブルに存在しないフィールド名でソートを行う場合、例えば下記のようにすると思います。

<?php
$params = [
  'fields' => ['CASE WHEN User.age >= 20 then 1 else 0 END AS adult'],
  'order'  => ['adult DESC']
];
find('all', $params);

通常のfindであれば問題ないですが、ページングのorderでこのフィールドを指定しても効いてくれません。

このような場合は、モデルのバーチャルフィールドを利用します。

<?php
//コントローラの中でUserモデルを利用
$this->User->virtualFields['adult'] = 'CASE WHEN User.age >= 20 then 1 else 0 END';
$this->Paginator->settings = ['order' => ['User.adult' => 'desc']];

参考:

http://book.cakephp.org/2.0/ja/models/virtual-fields.html

"バーチャルフィールドは find 時に普通のフィールドと同じように振舞うため、Controller::paginate() はバーチャルフィールドでもソートすることができます。"

http://stackoverflow.com/questions/21160171/implement-order-by-case-with-paginator-in-cakephp

2015-02-16

本日、kanaelのサービスが終わります。

kanaelは、2011年2月より4年間運用してきましたが、このまま続けてもなぁ、というところまできたので一旦終了します。

http://kanael.net/

kanaelというのは、あなたのやりたいこと、ほしいものを含めた、好きな日本語URLを作成し、他の人も、それに興味があるか測定できるサービスです。

ドメインは、 ほしい.jp と たいです.jp の2種類です。例えば下記のようなURLが作成できます。

http://kanaelにタグ機能が.ほしい.jp

アクセス数によってどれぐらいそのURLが人気なのか、その要望はどれぐらい支持されているのかが分かります。


2011年2月にひっそり公開して、最初にバズったURLは下記の2つでした。

http://ie6ばくはつして.ほしい.jp

http://赤いメガネでミニスカスーツのキレイなおねえさんに.僕のデスクの上に座られて見下ろされながら.「仕事できる振りしちゃって」とかいわれながら.チラチラとパンチラ見せられ.たいです.jp

力作ですねw

個人的にはこれも好きです。

http://こんにちは戸愚呂兄です.私の特技はぎ.たいです.jp


2011年3月に東日本大震災が起こると、kanaelに沢山の願いが投稿されました。多い時で、1日10万人ぐらいがアクセスしていました。日本中が悲しみにつつまれ、街も暗く、常に非常事態な生活が続いていたのを記憶しています。

kanaelによって何かが変わるわけではないのですが、色々な人の気持ちを受け止め、少しでも気持ちが和らぐことがあったのなら、kanaelを作って良かったなと思います。

kanaelは、初期のさくらVPS(CPU 2Core, メモリ 1.5G、HDD)1台でまかなっていました。アクセスごとにカウントアップアクセスログDBに書き込む仕組みでした。CakePHP + MongoDBという構成だったので書込みが多いkanaelでしたが問題なく乗り切りました。

日本語URLを作って楽しみながら計測できる仕組みを、商品のフィードバック用に活かせないかなと思い、ビジネスも考えましたが結局そこまで辿り着きませんでした。

kanael.netドメインは本日2/16で期限切れになりますが、たいです.jpと ほしい.jpは2月末まで生き残ってますので、興味ある方はご覧ください。

最後に、感謝の気持ちをkanaelにのせて。

http://サービス終了します.kanaelユーザに.感謝し.たいです.jp

日本語ドメインって本当に良いものですね。

さよなら、さよなら、さよなら。。。