2016年4月14日木曜日

独自ドメインでテックブログ始めました!

このBlogをしばらく更新をしていませんでしたが、実は独自ドメインでブログを始めています。

プログラミンはもちろん、アフィリエイトなどのマネタイズに関することも書いています。

基本は、このブログと同じく、自分が学んだこと、ぶつかった問題への対処法などを書いていきます。

では、今後ともよろしくお願いいたします。

Webで食う技術を学ぶメディア、WebFood

CakePHPとRailsの比較

ずっとCakePHPを使ってきましたが、周りにRailsを使え使えという人が多かったので、ここ1年くらいはRails漬けです。

簡単にですが、両者を比較してみたいと思います。

CakePHPのメリット

  • エンジニアの数が多く採用がしやすい
  • 環境構築が簡単
  • PHPは独特な概念が少ないので習得しやすい

Railsのメリット

  • エンジニアのレベルが高く、一人でなんでもできちゃう人が多い
  • オープンソース活動が活発でライブラリがたくさんあるし、情報も多い
  • 独特な概念は多いが、その分コードが綺麗になる
  • コードが少なくなるのでメンテナンスがしやすい

ほんとにざっくりいうとこんな感じですね。

正直、CakePHPにある程度慣れた人には、Railsを触ってみることをお勧めします。

MVCなどの概念はとても似ているので、理解はしやすいですし、この手のフレームワークの本家はRailsなので、学ぶと色々と腑に落ちること多いと思います。これって、こういう目的なのかぁ、と思うことが多いです。

とはいえ、これだけの比較だと足りないと思いますので、もっと詳しく比較した記事をご紹介します。

2014年7月9日水曜日

[CakePHP]v3.0.0-alpha1導入@XAMPP

ここを参考にした。
http://book.cakephp.org/3.0/en/installation.html

1.コンポーザやってみると。

composer create-project -s dev cakephp/app

以下のエラーが。

Warning: This development build of composer is over 30 days old. It is recommended to update it by running "/usr/local/bin/composer self-update" to get the latest version.

Installing cakephp/app (dev-master d15c9b13b6088a4bf3d52a3342fbce878a6cc3a5)

  - Installing cakephp/app (dev-master master)

    Cloning master

Created project in /Users/araky/git/test03/app

Loading composer repositories with package information

Installing dependencies (including require-dev)

Your requirements could not be resolved to an installable set of packages.

  Problem 1

    - Installation request for cakephp/cakephp 3.0.*-dev -> satisfiable by cakephp/cakephp[3.0.x-dev].

    - cakephp/cakephp 3.0.x-dev requires ext-intl * -> the requested PHP extension intl is missing from your system.

2.intlをダウンロード

http://pecl.php.net/package/intl

gunzip intl-3.0.0.tgz
tar xvf intl-3.0.0.tar

3.phpize

/Applications/XAMPP/bin/phpize

4.configure

./configure --with-php-config=/Applications/XAMPP/bin/php-config-5.5.9

こんなエラーが。。。
configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.

5.icuをinstall

brew install icu4c

6.もう一度configure

 ./configure --with-php-config=/Applications/XAMPP/bin/php-config-5.5.9 --with-icu-dir=/usr/local/Cellar/icu4c/52.1

7.sudo make

8.sudo make test

なんかFailでてるけどいいや。
=====================================================================

TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped    :    0
Exts tested     :   59
---------------------------------------------------------------------
Number of tests :  388               357
Tests skipped   :   31 (  8.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :   22 (  5.7%) (  6.2%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :  335 ( 86.3%) ( 93.8%)
---------------------------------------------------------------------
Time taken      :   36 seconds
=====================================================================
=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
Bug #58756: w.r.t MessageFormatter [tests/bug58756_MessageFormatter.phpt]
IntlCalendar::getDayOfWeekType() basic test [tests/calendar_getDayOfWeekType_basic.phpt]
asort() [tests/collator_asort.phpt]
compare() [tests/collator_compare.phpt]
get_locale() icu >= 4.8 [tests/collator_get_locale2.phpt]
collator_get_sort_key() [tests/collator_get_sort_key.phpt]
sort() [tests/collator_sort.phpt]
sort_with_sort_keys() [tests/collator_sort_with_sort_keys.phpt]
IntlDateFormatter: several forms of the calendar arg [tests/dateformat_create_cal_arg.phpt]
IntlDateFormatter::formatObject(): IntlCalendar tests [tests/dateformat_formatObject_calendar.phpt]
IntlDateFormatter::formatObject(): DateTime tests [tests/dateformat_formatObject_datetime.phpt]
datefmt_format_code() (5.3+, ICU >= 50) [tests/dateformat_format_50+.phpt]
datefmt_format_code() and datefmt_parse_code() (ICU >= 50) [tests/dateformat_format_parse_50+.phpt]
IntlDateFormatter: setCalendar()/getCalendar()/getCalendarObject() [tests/dateformat_get_set_calendar.phpt]
IntlDateFormatter: get/setTimeZone() [tests/dateformat_get_set_timezone.phpt]
IntlDateFormatter: several forms of the timezone arg [tests/dateformat_timezone_arg_variations.phpt]
numfmt_format() icu >= 4.8 [tests/formatter_format2.phpt]
locale_get_display_name() ICU >= 50 [tests/locale_get_display_name_50+.phpt]
locale_get_display_script()  icu >= 49 [tests/locale_get_display_script3.phpt]
MessageFormat accepts IntlCalendar args [tests/msgfmt_format_intlcalendar.phpt]
msgfmt_parse() tests [tests/msgfmt_parse.phpt]
IntlTimeZone::getDisplayName(): type parameter (ICU >= 49) [tests/timezone_getDisplayName_variant2-49+.phpt]
=====================================================================

9.sudo make install

10.php.ini編集

extension=intl.so

11.改めて

composer create-project -s dev cakephp/app


12. Cake のserver起動。Railsっぽい。


Console/cake server -p 9999

※localhostが衝突したのでport指定した。

とりあえず、起動しました。あとはデータベースの設定

2014年6月30日月曜日

[CakPHP]ControlloerでsetするとDebugKitのVariablesタブで捕捉されないことがある

※version2.4.9の話

ControllerのCallback関数には、

Controller::beforeFilter()
Controller::beforeRender()
Controller::afterFilter

があるけど、beforeRenderとafterFilterでController::setしてもDebugKitのVariablesタグで捕捉されることはない。afterFilterでsetしてもViewで使えないので全く意味はないが。
beforeRenderでsetしたいケースはあると思う。たとえば、Authの情報をどのページでもsetしているが、logout画面ではする必要がない(したくない)ので、その場合はbeforeRenderにset処理を入れておく。すると、beforeRender以前にlogoutのロジックが終わっているので、Auth情報はセッションからなくなっているので、setせずに済む。

これをbeforeFilterでsetしていると、logout処理の前でセッションからAuth情報がある状態なのでsetされてしまい、View画面で使われてしまったりする。「ログアウトしました。」画面なのに、「マイページ」とか表示されてたりする。

話はそれたけど、beforeRenderでController::setしてもDebugKitのVariablesからは見えないけど、ViewではきちんとRenderされます。


2014年6月7日土曜日

[CakePHP]CakeDC/migrationsの微妙な仕様

ここによるとModelが存在しないテーブルのmigrationは以下のように-fをつけてあげるとできる。これをつけないと、差分として検知されない。
ここでは例えば、Aというテーブルを作成した場合とする。


cake Migrations.migration generate -f

このコマンドから始まるプロンプトを進めて行くと、以下のように

Do you want update the schema.php file? (y/n)

schema.phpを更新するか聞かれて、自分はいつも通り、yを選択する。

で、次にDB定義変更をしてmigrationをする機会が訪れたとする。

今度は普通にModelが存在するテーブルBだったので、以下のように-fはつけない。

cake Migrations.migration generate

そうすると何が起こるかというと、①で作成したテーブルAをdropするmigrationが作成されてしまう。

なぜかというと、②でも-fが有効になっているらしく、ここで生成されるschema.phpにはテーブルAが入ってしまう。migrationの仕組みは現実のDB定義とschema.phpを比較して差分をmigrationファイルとする。なので、③で-fをつけないのからモデルのないテーブルは検知されないため、schema.phpにあるAテーブルは、現実のDBには存在しないよ、となり、じゃあ削除するマイグレーションファイル作りますね、と判断してしまうのだ。

イケてないですね。

なので、 -fをつける場合は②はnを選択したほうがよさそうですね。





[SublimeText] .sublime-projectの属性はシングルクオテーションじゃなくてダブルクオテーションじゃなきゃだめ。

※Sublime Text3の話
"xdebug":
{
  "max_children": 128,
  "max_depth": 5,
  "max_data": 512,
  "debug_layout":
    [
      {
        'rows': [0.0, 1.0],
        'cols': [0.0, 0.6180212590826522, 1.0],
        'cells': [[0, 0, 1, 1], [1, 0, 2, 1]]
      }
    ]
}

こんな感じでシングルクオテーション使ってたら、

Error trying to parse project: Expected value in

というエラーが発生した。なのでダブルクオテーションにしたら直った。

2014年6月6日金曜日

[CakePHP]find()のオプションのpageはlimitと併用しないと恐ろしい事に。。。

※CakePHP2.4.9のお話。
$page = 1;
do{
    $ids = $this->find('list',array(
        'page' => $page,
        'fields' => array('user_id'),
        'conditions' => //ある条件
    ));
    //ある処理
    $page++;
}while (!empty($ids));

こんな感じで、特定の条件全てのレコードに対してある処理をするバッチを作っていて、1pageあたりの数はデフォルト値を当然使ってくれるだろうと思っていたんだけど、これを実行したら、なかなか処理終わらずおかしいなと思ってたら、あるテーブルにありえない数のレコードがインサートされてる。。。無限ループ状態になっていました。あわてて、ApacheとMySQLをシャットダウンして、止めた。

というわけで、デバッグしたら、limitを明示的に定義していないと、実際SQLで使われるoffsetとlimitに値が入らないってことがわかった。

model.php 2942行目
if ($query['page'] > 1 && !empty($query['limit'])) {
    $query['offset'] = ($query['page'] - 1) * $query['limit'];
}
なので、以下のようにlimitを明示的に指定して直った。恐ろしや〜。
$page = 1;
do{
    $ids = $this->find('list',array(
        'page' => $page,
        'limit' => 20,
        'fields' => array('user_id'),
        'conditions' => //ある条件
    ));
    //ある処理
    $page++;
}while (!empty($ids));