5丁目通信(仮称)

とある5丁目で活動する還暦を過ぎたWebプログラマーの覚え書きです。それとかかってくる迷惑電話や、家業のアパート経営について。

タグ: CakePHP

  • Cakephp2でTextHelper::truncate()がおかしいので対応した話し

    Cakephp2でTextHelper::truncate()を動かすと、1回目の処理が文字化けしてしまいました。どういう訳か2回目以降は正常に切り取ってくれます。

    /lib/Cake/View/Helper/TextHelper.phpのソースを追ってみると、mb_strlen()が正しい文字列の長さを返していません。strlen()と同じ値を返してくれます。それで後のmb_substr()で正しく切り取ってくれていませんので文字化けしているようです。

    strlen()になっているということは、予想通りmb_strlen()の第4パラメータにエンコードを指定しておけばOKでした。ということは、php.iniのmbstringの項目を正しく設定していないのが原因です。そこで、

    [mbstring]
    mbstring.language = Japanese
    mbstring.internal_encoding = UTF-8
    mbstring.http_output = UTF-8

    なんて設定してApacheを再起動すると、ソースに手を入れずにエンコードなしで文字化けしないで表示します。/app以外のソースはいじらないのが基本。

    つまり、日本語のサイトを作成するときは、mbstringをサボらずに設定しましょうというという基本を忘れるなということでした。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • テストから始めてみます、という話し

    最近はまじめにプログラムを書いています。あるサイトを再構築しているのですが、これまた大昔に作ったものでフレームを使っています。

    試しにCakePHPで作成してみます。しかも、最新のCakePHP2です。

    CakePHP2になるとUnitTestがSimpleTESTからPHPUnitiに変わりました。いろいろとカンファレンスに話しを聞いていると、アジャイルとか自分は感化されやすいので、まずはUnitTestでのテスト駆動開発を導入してみます。バージョン管理は前に導入していましたが、徐々に試してみます。

    こうでも新しいことをしていないと、だんだんを開発のモチベーションが上がらないので。何でも試すことができるのは、一人で動いているせいでしょうか。

    CakePHP2で使うPHPUnitの情報は、Googleさんに聞いてもほとんどありません。日本語での情報はありません。一番詳しいのは、CakePHP2のCook Bookです。ますはこちらを読むことを薦めます。結局、本家CakePHPにたどり着きました。英語ですけど、何とか読めます。

    PHPUnitも開発元のサイトが一番詳しいということになりました。こちらは日本語に翻訳されています。

    Fixruresのファイルは、CakePHPのBakeで作成するのが簡単のようです。DBから直接Fixturesにインポートすると、ちょっと大きなテーブルだとメモリが一杯になります。ソースを追ってみたところ、メモリにテーブルデータをすべて展開しているようです。最初は、何かバグでもあるのかと思っていました。Bakeで途中で聞いてきますが、一部を切り出した方がよさそうです。

    テスト駆動開発は最初にテストコードを書いてからソースコードを書くのですが、まだまだテストコードを書くのを忘れて、直接コードを書いてしまいます。こちらは癖を付けなければいけません。

    恩恵としては、リファクタリングするときはやはり効果があります。あとはエラーの赤を消して、緑にするという目標があって、プログラミングは楽しくなりそうです。

    しかし、まだまだ、どうやってテストを書くのがいいのか迷います。我慢してしばらく続けようと思います。

    Google+: View post on Google+

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • PoeditをWindows7 64bitで使うときの注意と回避方法の話し

    CakePHPを使っていると、翻訳を処理するgettextのmoファイルを出力しなければいけません。そのためにpoファイルをPoeditで編集します。このPoeditは、WordPerssでも使われます。

    しかし、PoeditをWindows7の64bit版で使うと、検索のダイアログが表示できないという障害あるため、Poeditは使いにくいものでした。しかし、調べてみると、Poeditのサイトでその障害の回避方法が載っていました。既出の障害らしいです。

    その回避方法通りにすると、正常に検索ダイアログが表示されて検索できます。

    回避方法は下記のリンク先に書かれていますが、regeditで、

      HKEY_CURRENT_USERSoftwareVaclav SlavikPoedit

    にあるfind_pos_x と find_pos_yの2つのキーを削除するだけです。

    これでWindows7の64bit版でPoeditが使えるようになりました。

     

    Embedded Link

    #437 (Search Window not visible in Windows 7)
    – Poedit

    Description. I am using POEDIT 1.4.6 on Windows 7 64 bit and have used the search option several times but now all of a sudden I can’t access the search screen anymore. I see it is there in the ta…

    Google+: View post on Google+

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHPでタイムゾーンを明示しないとUTCでcreatedに格納されてしまう話し

    CakePHPで発生した障害の対応のメモ。

    config/core.phpに

    date_default_timezone_set('Asia/Tokyo');

    とタイムゾーンを明示してあげないと、モデルからテーブルにレコードを追加したとき、UTCの世界標準時でcreatedに現在時間が格納されてしまいます。

    PHP5.3からのようです。

  • CakePHP2.0リリース

    注目すべきことがいろいろあって、2.0を触っていかなければいけないな。1.xのソースがそのまま動くかな? 新しいサイトは2.0で試してみていこう。

    Embedded Link

    CakePHP 2.0 のリリース(訳) – 24時間CakePHP
    訳 CakePHPコアチームはメジャーなバージョン番号のジャンプをアナウンスすることに興奮を覚えています。 C..

    Google+: View post on Google+

    Post imported by Google+Blog. Created By Daniel Treadwell.

    CakePHP 1.3によるWebアプリケーション開発 オープンソース徹底活用

    CakePHP辞典 Pocket詳解

  • PHPカンファレンス2011に参加してきた。

    PHPカンファレンス2011に参加しました。10年近くPHPで仕事をしてきたのに、今回が初めての参加です。

    さて、何かとセキュリティが低いと言われているPHPですが、だんだんと開発者が減ってきたのでしょうか? 私は違うような気がします。Webプログラミングでは簡単に入っていけますし、Windowsではないサーバーはとりあえずデフォルトで使えますし、レンタルサーバーを借りた際にはPHPは動かせます。WebプログラマーはPHPで開発できて損はないじゃないかと思います。

    さてPHPカンファレンスですが、考えていたよりは盛況でした。あるセッションでは部屋に入りきれずに、別室でUStreamで見ているという、現地に行った意味ないじゃん、と行ったことがありました。こちらは運営の方には改善を願いたいものです。

    セッションに感化されてTDDの本を帰りに買ってしまいました。今回はとても刺激になってよかったです。たまにこんなセミナーに参加して、モチベーションを上げていきたいものです。

    普段使っているCakePHPは、もう盛り上がっていないのかな・・・。

    CakePHP 1.3によるWebアプリケーション開発 オープンソース徹底活用

    CakePHP辞典 Pocket詳解

  • CakePHPのサイトをサーバーに配置してはまった話し

    ローカルPCで開発していたCakePHPのサイトをサーバーに配置したら動かなかった。対応していく過程のメモ。

    まずはPHPのバージョン。最新のPHP5.3にしたのは間違え。大量にエラーをはく。これは使っているCakePHPのバージョンがPHP5.3に対応していないため。以下のページに対応方法が書いてある。

    PHP 5.3だとCakePHPで大量のエラー

    あまりいじりたくないので、PHPのバージョンを下げる。前の記事のようにPHPの複数のバージョンを切り替えるようにしておく。インストールしてあったバイナリのMySQLとPostgreSQLの指定の方法がわからないので、こちらもソースからコンパイルしなおし。

    次はページが真っ白になったり、ページが見つからなっている。mod_rewriteが動いていないことが判明。httpd.confでのパスの指定が間違えていた。単純なミス。

    以上、一日テストサーバーの構築で潰れた。プログラムの修正は半日で済んだのに・・・。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • 違うPHPのバージョンを切り替えできるようにした話し

    昔CakePHPで作成したWebサイトの機能追加を行っているのですが、そのサイトはPHP4なのです。テストするため、PHP4の環境が必要です。

    PCですとXAMPPで一発インストールなのですが、みんなで参照するLinuxサーバーではそうはいきません。今まではyumで簡単にインストールしていきましたが、PHP4は古いバージョンなのでyumでのパッケージインストールもできません。

    しかたないのでソースからコンパイルです。PostgeSQLとかMySQLもソースからインストールしていきます。今回はとても時間がかかる。PHP4 だけではなく、いまはPHP5 もテストで使うであろうと考えて、切り替えるようにしておきます。参考になったのは、

    【PHP】複数バージョンのPHPを使う方法

    です。違いはApacheがパッケージでインストールしているとか、PHPのバージョンの違いです。

    以上、自分が設定したことを忘れそうなので、手順はEvernoteにメモしておきます。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakaPHP。また同じことで悩んでいた

    だめじゃないか。自分。また同じことで悩んしまうなんて。半日無駄にした。同じことで繰り返して悩むなんて、このブログの意味はないではないか。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)
  • CakePHPでの多数レコードへのバッチ処理をした話し

    現在、テストフェーズに入っているサイトで不具合発見。6万レコードのテーブルに対して再処理を行う必要があります。

    CakePHPで開発しているので、すべてのレコードをfind(“all”)で取得してから処理するのでは、おそらくメモリのオーバーフローで止まることは確実です。そこで、レコードを分割して取得して処理することにします。

    CakePHPのモデルに対するfindメソッドはよく使うのですが、意外とパラメータに関してはマニュアルに丁寧に説明してくれていません。

    しかし、

    array(
      'conditions' => array('Model.field' => $thisValue), //条件の配列
      'recursive' => 1, //int
      'fields' => array('Model.field1', 'DISTINCT Model.field2'),     //フィールド名の配列
      'order' => array('Model.created', 'Model.field3 DESC'), //文字列か配列でのorder定義
      'group' => array('Model.field'), //GROUP BYするためのフィールド
      'limit' => n, //int
      'page' => n, //int
      'offset' => n, //int
      'callbacks' => true //false, 'before', 'after'が指定できます。
    )
    

    MySQLを使っているのであれば、limit,offsetは想像付くのですが、pageって何?っていうところでしょうか?

    CakePHPのソースファイル(cake/libs/model/model.php)のfind()の部分を読むとわかるのですが、page(ページ数)とlimit(表示レコード数)を指定すれば自動的にoffset(先頭からのレコード位置)を計算してくれるのでした。

    他にマニュアルにないパラメータがあるかもしれませんので、CakePHPのソースは読んだ方がいいかもしれません。といいながら、callbacksは何をするのか自分はわかりませんが。

    著:山田祥寛
    ¥3,366 (2025/03/27 13:40時点 | Amazon調べ)
    著:松浦 健一郎, 著:司 ゆき
    ¥2,574 (2025/03/27 13:40時点 | Amazon調べ)
    著:谷藤賢一, 著:徳丸浩
    ¥2,750 (2025/03/30 15:22時点 | Amazon調べ)