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

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

解決方法は、
環境設定 -> 一般 -> デフォルトエンコーディング
の値を自動判別からUTF-8に変更するだけ。


たぶんこの方の問題も同じように解決する気がします。
http://d.hatena.ne.jp/genhou/20131224/1387915831

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

ApacheやNginxとopensslのバージョンを指定するとおすすめの暗号スイートなど、SSL設定ファイルを表示してくれるMozillaのサイトがあります。
https://mozilla.github.io/server-side-tls/ssl-config-generator/


これを使えば安全な暗号スイートのみを使ってる設定などが簡単に生成されますので、この通りに指定すれば良いです。
Apacheの場合はデフォルトでは暗号スイート設定の記述はなかったと思いますが、下記の3つは表示通りに指定しておくのが良いかと思います。
SSLProtocol
SSLCipherSuite
SSLHonorCipherOrder


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

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し直せばよいからです。

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

本日、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

日本語ドメインって本当に良いものですね。
さよなら、さよなら、さよなら。。。

村井純著インターネットを読んで自分の思考を形成してきたものを振り返る

1995年に出版された村井 純教授の「インターネット」という書籍を読みました。

古い本ですが、色々な気付きが多く楽しめました。書籍「Unixという考え方」と同じような感覚。


継続的セキュリティテストサービスVAddyのプロジェクトリーダになってから私の考え方をメンバーに共有することが多くなってきました。今のこの考え方は、この15年ぐらいの時代の流れをずっと見てきて、それらの蓄積から来てるんだなと自分で感じ、それらをもっとうまく言語化してメンバーと共有したいと思っていました。
その中で一番強い影響を与えたインターネットというものの本質や哲学をうまく書いてある書籍が読みたくなり、この書籍を購入してみました。

この書籍の面白いところは、インターネットの歴史を作ってきた人からそれが学べる点です。グローバル視点が少なかったボードメンバー達に、日本だけでなく英語圏以外の地域のことも考えて活動してきた点は読んでて興奮しました。この人がいなかったら日本のインターネットの普及は10年ぐらい遅れてたんじゃないかと思うほど、技術だけではなく政治的な活動にも精力的な方です。
それから20年、2015年の今読んでみても面白いのですが、1995年の時点から未来を予測して執筆している箇所はあまり興味がわきませんでした。何故かというと、その予想はだいたい的中して既に当たり前になってきているからです。それも凄い話ですよね。


インターネットの本質

  • いいかげんな技術の集合で、それがなんとなく動く、ことが重要
  • データはほとんど着くけど着かない場合もある、その時は着くまで再送すれば良い
  • 完璧なネットワークを構築するよりも、クオリティが低く不通になっても構わないとして、敷設しやすくしてネットワークを広げた。それらが複雑に絡み合って集合した時に強靭さを持つようにして、データの保証はその上のレイヤー(TCP)で制御して途中のネットワークはそれを意識しない。
  • プログラムを単純にして、小さなコンピュータでも動き、プログラミングがやさしいため開発者が増えた
  • どれだけの技術者がその技術を支えられるかを考える。支える人が少なければ普及して運用されることもないという考え
  • とりえず90%は作って動かしてしまって、あとの10%は後回しにして最後の詰めの膨大なコストを無くす

支える開発者にフォーカスしてる点が興味深いですね。
まずは動くもの使ってもらえるものを正義として考え、完璧さを求めすぎてコストだけが膨れるようなものにしないことが重要だったのですね。
2000年ごろからのWeb2.0の流れも、永遠のベータと呼んでまずは最低限動くものを出して利用者の反応をみながら改善していくものでした。最近のリーンスタートアップも同じ感じですね。
SOAPではなく、WebAPIを公開してJSON形式で扱うのが普及したのも、多くの開発者が簡単に扱えたからでしょう。

実際の想定ケースからのシミュレーション

P94.
多くの学者は、こんな仕組みがうまく動くわけがない、みんなが一斉に話し始めたらぶつかり合ってしまうから性能の悪い通信システムで実用にはならないのではないか、などと言われていました

P95.
いちばん大切な事は、全員が一斉に話したらたぶん動かないだろうが、実際に人間が使っていくようなコミュニケーションは、分散することが予想でき、それに基づけばある程度の性能が得られる。
それが十分薬に立つならいいだろうという考え方です。

このおかげで、イーサネットが普及して安価にネットワーク構築が出来るようになって、今や無線LANさえも当たり前になってます。
誰が使うのか、どのように使うのか、それらを想定してうまく動けば使いやすくて低コストで普及しやすい方法が良いということですね。

「みんなで使う」が重要

P146
コンピュータの世界だけでどんなにいいことを考えても、広い範囲で使われる可能性を作っていかないと、そのソフトウェアはよくならない、ということです。
ですから不整合でも何でも、まずみんなが使えるようにして、コンピュータに対する期待と可能性を高めていくのはきわめて大切な事です。
今日、技術と人間の関係で、いちばん大切なことだと言ってよいと思います。

マルチバイト文字をどう扱っていくかという議論の時に、自分たちの理想を掲げて進んで誰も使ってくれなくなってしまうのは避けたいという想いがあったようです。結局は役に立たなければ何にもならないのだから、現在動いているものにいかに合わせて動かせるかという方向で進んで行ったとのこと。
学術的にはこれはかなり苦しい決断だったようですが、それがあって今の多言語環境が快適に使えるようになっていると思うと頭が下がります。

まとめ

インターネットの歴史や仕組みを知っていたけれども、この本を読んで新しい気付きや歴史が分かったのは良かったです。
自分が学生の時に読んでおきたかった1冊ですね。何で読まなかったんだろう・・・

CakePHP3のfind結果はdebug関数で見ると良い

CakePHP3を触り始めています。Cake3からfind()の結果がオブジェクトになりました。
Cake2までは配列だったのでpr関数で見ても問題なかったのですが、オブジェクトになるとprは辛くなります。

CakePHP3からはdebug関数を使うと下記のようにリレーション先のデータも確認できるようになります。debug関数はcakephpが標準で用意しているグローバル関数です。CakePHP2にもあります。

debug( $this->Users->find()->contain(['Bookmarks'])->all() );

Users hasMany Bookmarksの状態でfindすると、下記のようなデータがdebug()を通して確認できます。
Usersオブジェクトの中にitemsフィールドがあり、その中身が下記になります。
リレーション先のエンティティオブジェクトがbookmarksフィールドに入っていて、その値も確認できます。

(int) 0 => object(App\Model\Entity\User) {
'properties' => [
        'id' => (int) 1,
        'email' => 'xxxxxxx@gmail.com',
        'password' => 'xxxx',
        'created' => object(Cake\I18n\Time) {
                'time' => '2014-12-23T06:48:20+0000',
                'timezone' => 'UTC',
                'fixedNowTime' => false                         
        },
        'updated' => null,
        'bookmarks' => [
                (int) 0 => object(App\Model\Entity\Bookmark) {
                        'properties' => [
                        'id' => (int) 1,
                        'user_id' => (int) 1,
                        'title' => 'aaa',
                        'description' => 'aaa',
                        'url' => '',
                        'created' => object(Cake\I18n\Time) {
                                'time' => '2014-12-23T07:11:21+0000',
                                'timezone' => 'UTC',
                                'fixedNowTime' => false
                        },
                        'updated' => null
                                ],
                        'dirty' => [],
                        'original' => [],
                        'virtual' => [],
                        'errors' => [],
                        'repository' => 'Bookmarks'

                }
]
],

Debug用のクラス(Cake\Error\Debugger)など他にも用意されていて、ドキュメントも下記にあります。
http://book.cakephp.org/3.0/en/development/debugging.html