読者です 読者をやめる 読者になる 読者になる

Love澤's Room

管理人のシステム開発奮闘記。更新頻度はそこまで高く無いと思います。いまのところ、技術ネタのみを記録中。今後もしかしたら、普通のブログのように、色々と書いていくかも。

CakePHPの設定(エラー解決編)

「エラー解決編」とか題してますが、ほかに○○編とか出さないと思います笑

本日、CakePHPの勉強を初めまして、環境構築をしていく中ででたエラーに関する情報をこちらのページにまとめていきたいと思います。

エラーがでて、解決したら随時更新予定。

タイムゾーンに関するエラー(2015/02/26 18:32 更新)

  • 問題

CakePHPをWebサーバに入れてサンプルページを表示させた際、以下のエラーメッセージが表示されていた。

Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /var/www/html/cakephp/lib/Cake/Cache/CacheEngine.php on line 60

f:id:love_zawa:20150216171025p:plain:w250

  • 原因

CakePHPの設定というより、PHPタイムゾーンの設定がなされていないことが原因であった。

  • 解決策

/etc/php.iniの889行目あたりにタイムゾーンの設定箇所があるので、そこを以下のように編集。

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo

apacheを再起動するとエラーが消える。

systemctl restart httpd (CentOS 7)
etc/rc.d/init.d/httpd restart (CentOS 6,5)
  • 参考文献

CakePHPのダウンロードとインストール - CakePHPの使い方

パーミッションに関するエラー(2015/02/26 22:07 更新)

Mac OS X + XAMPP + CakePHPという環境を構築しようとした時に以下の様なエラーが表示された。

  • 問題
Warning: mkdir(): Permission denied in /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Cache/Engine/FileEngine.php on line 380

Warning: _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Cache/Cache.php on line 328

Warning: /Applications/XAMPP/xamppfiles/htdocs/cakephp/app/tmp/cache/persistent/ is not writable in /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Cache/Engine/FileEngine.php on line 385

Fatal error: Uncaught exception 'CacheException' with message 'Cache engine "_cake_core_" is not properly configured. Ensure required extensions are installed, and credentials/permissions are correct' in /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Cache/Cache.php:186 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Cache/Cache.php(151): Cache::_buildEngine('_cake_core_') #1 /Applications/XAMPP/xamppfiles/htdocs/cakephp/app/Config/core.php(374): Cache::config('_cake_core_', Array) #2 /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Core/Configure.php(72): include('/Applications/X...') #3 /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/bootstrap.php(175): Configure::bootstrap(true) #4 /Applications/XAMPP/xamppfiles/htdocs/cakephp/app/webroot/index.php(100): include('/Applications/X...') #5 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Cache/Cache.php on line 186

f:id:love_zawa:20150216221131p:plain:w250

  • 原因

CakePHPの app/etc のパーミッションの設定が777になっていなかった

  • 解決策

app/etc のパーミッションを777にすると解決する。

sudo chmod -R 777 app/etc
  • 参考文献

Cakephp2.3 インストール時のエラー - Qiita

Sublime Text 3 でTeX用のスニペットを作成する

TeX用のスニペットを生成するような記事が見当たらなかったのでメモ.

やりたいこと

Sublime Text 3 でTeX用のスニペットを作成する.

スニペットを追加する方法

tool -> New Snippetを選択する.すると以下のように設定用のファイルが開く.
f:id:love_zawa:20150209021413p:plain:w600

content, tabTrigger, scopeの各タグはそれぞれ以下のような意味をもつ.

<content><![CDATA[登録したい内容]]></content>
<tabTrigger>スニペットを追加する際のトリガーとなる文字列</tabTrigger>
<scope>スニペットが有効になる環境(ファイルの種類・拡張子)</scope>

TeX用にするには,scopeをtext.texとすると良い.source.texではうまくいかない.

<scope>text.tex</scope>

参考文献

scopeをTeX用に設定するための方法が書かれていたのがこちらのサイト.
Creating Snippets in Sublime Text 2 for LaTeX - Economistry

Snippetの作成方法などについては以下のサイトがわかりやすかった.
Sublime Text 3: スニペットの登録方法と使い方 | Web Design Workbook
Sublime Text 2で自分用のスニペットを作る方法 | prime factor

LaTeXiTで日本語を含む数式を生成する

  • やりたいこと

LaTeXiTで日本語を含む数式を生成する.

  • 方法

まず,LaTeXiTの設定を以下の画像のようにする.変更したのはLaTeXとdvipdfのパス.インストール環境によってパスも変わってくると思うので,その辺りは各自の環境に合わせる.
f:id:love_zawa:20150207000503p:plain:w250

次にエディタ上で日本語の部分を\text{}でくくってやるとちゃんと出力される.

\text{日本語}i

f:id:love_zawa:20150207002228p:plain:w250

◯参考サイト
LaTeXiTの数式で日本語を通す方法 | メモlog

ファイル名を連番に変更する方法(CentOS, Mac)

やりたいこと

複数のファイルのファイル名を連番に変更する。

> ls
test1.png test4.png test5.png test10.png

上記を下記のようにする。

> ls
test001.png test002.png test003.png test004.png

方法

以下のコマンドで変更前後を確認

> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR }'
mv test1.png test001.png
mv test4.png test002.png
mv test5.png test003.png
mv test10.png test004.png

問題なければ次のように、パイプを使って実行

> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR }' | sh

また、printfの部分を変更することで柔軟な連番付けが可能となる。

## 連番を1000番台にする
> ls *.csv | awk '{ printf "mv %s test%03.2f.png\n", $0, NR+1000.03 }'
mv test1.png test1001.03.png
mv test4.png test1002.03.png
...
## 偶数の連番にする
> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR+NR }'
mv test1.png test002.png
mv test4.png test004.png
...
## 奇数の連番にする
> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR+NR-1 }'
mv test1.png test001.png
mv test4.png test003.png
...

Rの演算子「<-」と「=」と「<<-」の違い

Rをいじっているのだが、タイトルの通り、代入演算子の違いがわからなかった。それぞれ以下のように呼ぶそう。

(参考サイト)
http://isyus2.yz.yamagata-u.ac.jp/xoops/Data/R_v3.pdf
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/28.html


通常の代入操作については、「<-」「=」のどちらを使っても構わないそう。いわゆる、プログラミングで一般的に使われる代入と同じイメージ。ただし、S4クラスやS5クラスの中でデータの型を指定するときは「<-」ではエラーとなり「=」を使用しなければならないっぽい。気を使うのが面倒。

永続代入演算子は、あるメソッドの中からメソッド外の変数に値を代入する際に使用する演算子。個人的にはメソッドの中からメソッド外の変数に代入なんてすんなよって思う(古い考え?)。使う場面としては、S5クラスで定義されているフィールドに代入する際など。

下記サイトに載っているプログラム例を参考にしながら、自分なりに少しずつ手を加えたプログラムを以下に示す。
「<-」「=」「<<-」の使い方を示せればと。
R5クラス | 参照渡しを実現する,リファレンス,ポインター

Asagao = setRefClass(
  # クラス名
  Class = "Asagao",     # 通常の記述法
  # Class <- "Asagao",  # Asagaoという値をもつClassという変数が生成される。ただし、クラスとしての機能は実装できる。
  # 上記どちらかの記述がなければ、クラスとして実装できない(エラーがとなる)。

  # 継承
  contains = c("Flower"),     # 通常の記述法
  # contains <- c("Flower"),  # Flowerという値を持つcontainsという変数が生成される。
  
  # フィールド
  fields = list (     # 通常の記述法
  # fields <- list (  # seeds, speciesという変数(カラム?)を持つlistが生成される。
                      # また、seedsは"numeric"という値をspeciesは"character"という値をもつ
    seeds   = "numeric",   # 種の数
    species = "character"  # 種類
  ),

  # フィールド                           # この書き方だと、エラーとなる
  # fields = list (  # 通常の記述法      # |
  #   seeds   <- "numeric",   # 種の数  # |
  #   species <- "character"  # 種類    # |
  # ),                                 # |
  
  # method
  methods = list (
    # コンストラクタ
    initialize = function(color=NULL, leaves=NULL, species=NULL) {    # 通常の記述法
    # initialize = function(color=NULL, leaves=NULL, species=NULL) {  # エラー
      if (is.null(color)) {
        color <<- "skyblue"   # 通常の記述法
        # color <- "skyblue"  # エラー
      } else {
        color <<- color
      }
      
      if (is.null(leaves)) {
        leaves <<- 50
      } else {
        leaves <<- leaves
      }
      
      if (is.null(species)) {
        species <<- "昼顔"
      } else {
        species <<- species
      }
    },
    
    # 葉っぱの枚数から生育状態を計算して、その状態を conditions 変数に保存
    CalcConditions = function() {
      x = 2
      y = 4
      conditions <<- leaves * x - y
    },
    
    # 現在の生育状態から種子数を予測し、予測した種子数を seeds に保存
    EstimateSeeds = function() {
      seeds <<- round(conditions / 10 + 50)
    },
    
    getConditions = function() {
      conditions <<- leaves * 2
      return(conditions)
    },
    getConditions2 = function() {
      conditions <<- CalcConditions()
      return(conditions)
    }
  )
)

SourceTree + backlog と SourceTree + codebreak; を試す

今日は短め。

やりたいこと

かねてより、試してみたいと思っていたGitによるソースコード管理。これまで面倒だという理由でとくに利用してこなかったが、WindowsからMacに乗り換えたついでに設定してみた。

環境

コマンドラインでのGitは敷居が高いので、GUIで使えるGitクライアントのSourceTreeを導入した。
Git、Mercurial 対応 無料 DVCS Mac、Windowsクライアント | Atlassian

使い方などはこちらのページが大変分りやすかった。
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

Gitホスティグサービスは、下記の2つを試しているところ。


使用雑感

両方ともまだ全然触ったわけではない、ということを断っておいた上での雑感。

backlogはリポジトリの公開・非公開設定ができない(?)っぽい。デフォルトが非公開リポジトリなのであればよいのだけど、ググってもよくわからなかった。また、ネットでプランの機能一覧などを見ると、アクセス制限などはフリープランではできないようなので、その辺りが気になっているところ。

codebreak;はリポジトリの公開・非公開の設定がはっきりしているので大変ありがたい。利用人数も無制限だそう。自分の場合はまだ使い始めたばかり&共同開発の予定はないので、あまり関係はないが。

今後の予定

他にも試してみたいのが
Pricing for Git and Mercurial repo hosting for Bitbucket by Atlassian

どのサービスが使いやすいのか、自分に合っているかはわからないので、これから色々と試していくつもり。何かあれば比較記事でもあげようかな。

(おまけ)
Gitホスティングサービス5選【比較表付き】 | Find Job ! Startup
コードブレイクの特徴

JpGraph Error: 25049が出た時の対処方法

やりたかったこと

JpGraphを使って折れ線グラフを描画する。

エラーが起きた状況

PHPでJpGraphを利用する際に、以下のように記述。フォントは明朝体に設定。

<?php
(中略)
// グラフの描画先
$g = new Graph(400, 400); // サイズ
$g->setScale('textlin'); // 目盛り
$g->title->setFont(FF_MINCHO, FS_NORMAL, 14); // タイトルフォント
$g->title->set('テストタイトル'); // タイトル
$g->legend->setFont(FF_MINCHO, FS_NORMAL, 14); // 凡例フォント
(中略)
?>

エラー内容

以下の様なエラーが出た。
f:id:love_zawa:20150118073437p:plain
画像ではipampp.ttfとなっているが、エラーを起こすためにわざとそのようにした。実際のエラーは以下のとおり。

JpGraphError: 25049
Font file "/usr/share/fonts/ipa-gothic/ipam.ttf" is not readable or does not exist.

エラー文をみると、「ipa-gothic」ディレクトリに明朝体フォント「ipam.ttf」を探しに行っていることがわかる。

対策(簡単)

必要フォントを、「JpGraphに関するファイルが保存されているディレクトリ/fonts/」に配置する。

色々と試行錯誤したが、結局はこちらの対策に落ち着いた。

自分の場合だと、以下の様な構成になっている。

  • public_html/
    • line.php
    • JpGraph/
      • jpg-config.inc.php, jpgraph_ttf.inc.php, など
      • fonts/
        • ipag.ttf, ipagp.ttf, ipam.ttf, ipamp.ttf

JpGraphでは、JpGraph/Fonts/にフォントがあるか読み込みに行き、ない場合にはシステムのフォントディレクトリにを読み込みに行く。そのため、JpGraph/Fonts/に必要フォントを配置することで、問題が解決される。

対策(ちょっと面倒)

jpg-config.inc.phpとjpgraph_ttf.inc.phpの設定を調整する。

設定ファイル類を直接いじることになるので、ちょっと面倒。上でも書いたが、エラー文をみると、「ipa-gothic」ディレクトリに明朝体フォント「ipam.ttf」を探しに行っているため、それを解消することを試みる。

まずjpg-config.inc.phpは40行目あたりを以下のように設定する。

<?php
// define('MBTTF_DIR','/usr/share/fonts/ipa-gothic/');  // delete
// define('TTF_DIR','/usr/share/fonts/ipa-gothic/');    // |
define('TTF_DIR_M', '/usr/share/fonts/ipa-mincho/');    // add
define('TTF_DIR_PM', '/usr/share/fonts/ipa-pmincho/');  // |
define('TTF_DIR_G', '/usr/share/fonts/ipa-gothic/');    // |
define('TTF_DIR_PG', '/usr/share/fonts/ipa-pgothic/');  // |
?>

上記からもわかるように、なぜかTTF_DIRやMBTTF_DIRがipa-gothicに設定されていた。今回、JpGraphは古いサーバで使っていたものを新しいサーバへコピーしてきたものである。おそらく、これはデフォルトでこのようになっていたのではなく、古いサーバにあわせて書き換えられていたのだと思う。

次に、ipgraph_ttf.inc.phpは495行目あたりを以下のように設定する。

<?php
// check jpgraph/src/fonts dir
$jpgraph_font_file = $jpgraph_font_dir . $font_file;
if (file_exists($jpgraph_font_file) === true && is_readable($jpgraph_font_file) === true) {
    $font_file = $jpgraph_font_file;
    break;
}

// check OS font dir
// if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {  // delete
//     $font_file = MBTTF_DIR.$font_file;                // |
if ($family == FF_MINCHO) {              // add
    $font_file = TTF_DIR_M.$font_file;   // |
}                                        // |
else if ($family == FF_PMINCHO) {        // |
    $font_file = TTF_DIR_PM.$font_file;  // |
}                                        // |
else if ($family == FF_GOTHIC) {         // |
    $font_file = TTF_DIR_G.$font_file;   // |
}                                        // |
else if ($family == FF_PGOTHIC) {        // |
    $font_file = TTF_DIR_PG.$font_file;  // |
}
// else {                                // delete
//     $font_file = TTF_DIR.$font_file;  // |
// }                                     // |
?>

以上の設定で、フォントをJpGraph/fonts/以下に配置しなくてもよくなった。


なお、FF_**という変数がでてきたが、これらは同ファイル32行目あたりに以下のように定義されている。

<?php
define("FF_MINCHO",40);
define("FF_PMINCHO",41);
define("FF_GOTHIC",42);
define("FF_PGOTHIC",43);
?>

また、同ファイル348行目あたりには

<?php
$this->font_files= array(
    中略
    /* Japanese fonts */
    FF_MINCHO  =>  array(
        FS_NORMAL =>MINCHO_TTF_FONT,
        FS_BOLD =>'',
        FS_ITALIC =>'',
        FS_BOLDITALIC =>''
    ),
    FF_PMINCHO => array(
    中略
);
?>

と定義されており、その中で出てくる、MINCHO_TTF_FONTなどは同ファイル137行目あたりに以下のように定義されている。

<?php
define('MINCHO_TTF_FONT','ipam.ttf');
define('PMINCHO_TTF_FONT','ipamp.ttf');
define('GOTHIC_TTF_FONT','ipag.ttf');
define('PGOTHIC_TTF_FONT','ipagp.ttf');
?>