2012年6月12日火曜日

FuelPHPでpdo_dblibがつながらない?

Fuel\Core\Database_Exception [ Error ]: SQLSTATE[01002] Adaptive Server connection failed (severity 9)


PHPで普通に?PDOでMSSQLには繋がるけどFuelPHPを通すと繋がらない。。。
return array(
    'default' => array(
        'connection' => array(
            'dsn'        => 'dblib:host=<hostname>;dbname=<databasename>',
            'username'   => 'sa',
            'password'   => '',
        ),
    ),
);

db.phpはこんなかんじです。

繋がるソース↓
 $pdo = new PDO("dblib:host=<hostname>;dbname=<database>", "sa", "");

何が違うのか。。。

2012.6.13
動くようになりました。
アドバイスを頂いてなんとか動かすことができました。

まず、app/config/config.phpでlocaleを設定します。
return array(
 (省略)
  'locale' => 'ja_JP.utf8',
 (省略)
);

するとエラーメッセージが変わりました。
PDOException [ HY000 ]: SQLSTATE[HY000]: General error: 195 General SQL Server error: Check messages from the SQL Server [195] (severity 15) []

いろいろ調べてみるとMSSQL 2005/2008でset namesはサポートしてない?
(今回はMSSQL 2005で試してました)
データベース接続は初期値がutf8となっているのでこれを空にしてやることで回避できました。
これでクエリビルダを利用してSQLを実行すると動作が確認できました。
が、モデルを利用してfind_allで実行するとエラー。(`)が邪魔してうまく実行ができませんでした。

ただ、上の二つ(set namesの回避と(`))はdb.phpを修正することでエラー回避ができました。
return array(
    'default' => array(
        'connection' => array(
            'dsn'        => 'dblib:host=<hostname>;dbname=<databasename>',
            'username'   => 'sa',
            'password'   => '',
        ),
        'identifier' => '', // 空白を指定
        'charset'   => '', // 空白を指定
    ),
);

最終的にはこんなかんじのdb.phpとなりました。
とりあえず動いてよかったー。


2012年6月8日金曜日

mod_rewriteとurl rewrite

先ほどのサンプル(FuelPHPを試してみた)はとりあえず動かしたってかんじですが
URLに「public/index.php」がついてたんでこれを取り除いてhttp://localhost/fp-sampleでアクセスできるように。

これもドキュメントに載ってる通りそのままですが、ルートフォルダ(ここでは/fp-sampleの下)に.htaccessを作成して以下を記述します。
※.htaccessはpublicフォルダに入ってるんでそれを流用できます。
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /fp-sample/public
    RewriteRule ^(/)?$ index.php/$1 [L]
    RewriteCond ${REQUEST_FILENAME} !-f
    RewriteCond ${REQUEST_FILENAME} !-d
    RewriteRule ^(.*)?$ index.php/$1 [L]
</IfModule>

ドキュメントでは「RewriteBase /public」となっていますがここは環境に合わせて変更します。
これだけです。
本来であればpublicをウェブサーバのルートにおいてその他のファイルはルート外にするのが一般的みたいですがこういうやり方もあるみたいです。

ちなみにドキュメントにはApacheの環境しか載ってませんでしたがWindowsのIISでも同じようなことはできました。
※ただしIISにはmod_rewriteはないので別途URL Rewriteをインストールする必要があります。

IISの管理画面を開いてURL Rewriteの画面を開きます。
右のメニューから「Import Rules...」をクリックして以下の画面を開きます。
先に.htaccessファイルを作成していればそれをインポートすることもできます。
下のRewrite rulesに直接書き込んでも問題ありません。
(というかインポートするとここに入ります)
そのままだと上のようにエラーが表示されてしまいますので修正します。
RewriteEngine on
RewriteRule ^(/)?$ /fp-sample/public/index.php/$1 [L]
RewriteCond ${REQUEST_FILENAME} !-f
RewriteCond ${REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /fp-sample/public/index.php/$1 [L]

こんなかんじ。
ほとんど変わりませんがURL RewriteではRewriteBaseがサポートされていないみたいなんで上のような書き方で動きます。

IISで動かすとかいうのは稀でしょうが一応動いたんでメモ程度に。。。



FuelPHPを試してみた

FuelPHP
PHPの新しいフレームワークということでちょっとだけ触ってみました。
。。。なんとか動いたんでメモ程度に。

まず、サイトからバージョン1.2 をダウンロード。
ダウンロードしたファイルを展開してそのままウェブサーバに配置。
(今回はhtdocs > fp-sampleとしました)

とりあえずhttp://localhost/fp-sample/public/index.phpにアクセス。
「You don't have permission to access」と出たんで権限を与えます。
$ chmod 755 fp-sample

再度アクセスすると画面が表示されると思います。

はじめから動くサンプルとしてhttp://localhost/fp-sample/public/index.php/hello/にアクセス。画面に「Hello, World!」が表示されていると思います。
そのままアドレスの後ろに何か適当に文字を入力すると「Hello, <入力文字>」が表示されるようになると思います。

とまぁこんな感じです。
詳細はドキュメントを参考に。(まだ全然わかってないんで。)

もぉひとつ、データベースの接続を試してみました。

まず予めデータベースを作成しておきます。
mysql > create database fp_sample;

fuel > app > config > development > db.php を開いてデータベースの設定を行います。
<?php
return array(
    'default' => array(
        'type' => 'mysql',
        'connection'  => array(
            'hostname'   => 'localhost',
            'database'   => 'fp_sample',
            'username'   => 'root',
            'password'   => 'admin',
        ),
    ),
);

次にoilコマンドを使ってscaffoldでファイルを生成します。
ターミナルを起動してワークスペースに移動、以下を実行します。
$ oil generate scaffold post title:string summary:varchar[250] body:text

続けて以下を実行
$ oil refine migrate
Error: mysql_connect(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock)

ここでけっこう悩んでしまいました。
mysql.sockですが私の環境では/tmp/mysql.sockにあります。
phpinfo()で見ても/tmp/mysql.sockになってるし適当にfuelphpを使わずmysql_connectを実行すると普通に動くし。。。
悩んだあげく'socket' => '/tmp/mysql.sock'を追加することで実行されました。
<?php
return array(
    'default' => array(
        'type' => 'mysql',
        'connection'  => array(
            'hostname'   => 'localhost',
            'socket'     => '/tmp/mysql.sock',
            'database'   => 'fp_sample',
            'username'   => 'root',
            'password'   => 'admin',
        ),
    ),
);

これで再度migrateを実行すると成功しました。
$ oil refine migrate
Performed migrations for app:default:

----------------------
※kenji_sさんに教えて頂きましたがFuelPHPのトラブルシューティングに載っていました。
Oil がデータベースに接続できないがアプリケーションは接続できる
私の場合は'localhost'を'127.0.0.1'に変えるだけで動作しました。

----------------------



データベースを見るとpostsというテーブルが作成されていることが確認できると思います。
これでhttp://localhost/fp-sample/public/index.php/postにアクセス。
でかでかとエラーがでました。「Class 'Orm\Model' not found」
ormとかいうのを有効にしないとだめみたいです。
fuel > app > config > config.phpを修正します。
'always_load' => array(
    'packages' => array(
        'orm',
    ),
    (省略)
),

もともとコメントアウトさせているのでコメントを外すだけOK。
再度アクセス!
またエラー。「Crypto key error」。。。
よくわかりませんが「Please copy the following code into APPPATH/config/crypt.php manually:」とあるんで下のグレー部分をコピーしてcrypto.phpに貼付けろってかんじでしょう。
書かれてある通り fuel > app > config > crypt.phpを作って貼付け。

もっかいアクセス。
これでやっと画面が表示されました。

なかなか手間取りました。。。
手順が間違ってるのか?
けどとりあえずこれでデータの一覧〜登録、入力チェックまでを一気にやってくれます。

これからちょいちょい触っていきたいと思います。


2012年6月7日木曜日

EclipseのEgitでThe Current branch is not configured for pull

GitをEclipseから操作するためにEgitプラグラインを導入しています。

ローカルリポジトリの操作は問題なく動作するんですが
リモートの操作(共有リポジトリ)でちょっと苦戦しています。

基本的に開発する流れとしては
  1. ローカルリポジトリを作成
  2. 適当な具合に開発
  3. ローカルリポジトリにコミット
  4. 共有リポジトリにプッシュ
  5. 共有リポジトリからプル
となると思いますが、どうしても5のプルがうまくいかず下のようなエラーが発生してしまいました。
the current branch is not configured for pull novalue for key branch.master.merge found in configuration

branch.master.mergeが見つからない。的なエラー。
いろいろ調べてみたんですがEgitからの操作ではなくターミナルから操作を行い対処してます。
上の1〜3の操作は変わりませんが、4のプッシュする前にgit remote add とgit configを操作してます。
$ git remote add origin ssh://git@server/test.git
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

これをターミナルで実行してプッシュ、プルすると成功しました。
(ターミナルだけでテストしてるときはこんなことしなくても動作したんだけどな。。。)

Egitを使う以上、しょうがないこと??
このあたり詳しい方いたら教えてください。

ちなみに共有リポジトリからcloneしてきた場合は、上のような操作は一切することなく動作しました。
(git config -lでconfigの中身を確認してみるとremoteもbranchも追加されていることがわかると思います)




2012年6月4日月曜日

post-updateでちょっとハマったこと

post-updateを使ってssh経由で共有リポジトリにpushしたとき、自動的にローカルリポジトリを更新したい場合などあると思います。

例)
Server A
    └ repo-sv.git (共有リポジトリ)
    └ repo (ローカルリポジトリ)

Client A
    └ repo (ローカルリポジトリ)


  1. Client A が repo (ローカルリポジトリ) で変更・コミット
  2. Client A が Server A の共有リポジトリへpush
  3. Server A の repo (ローカルリポジトリ) を自動的に更新


これを実現するために hooks/post-update を使用します。

ハマったんで流れを書いておきます。

まず Clien A でローカルリポジトリを作成・コミットします
$ mkdir repo
$ cd repo
$ git init
$ touch test.txt
$ git add .
$ git commit -m 'first'

次に Server A に共有リポジトリを作成します。
$ mkdir repo-sv.git
$ cd repo-sv.git
$ git init --bare --shared

次に Client A に戻り、共有リポジトリへpushします。
$ git remote add origin ssh://@/repo-sv.git
$ git push origin master

これでpushは完了です。
ただこれだと普通に共有リポジトリにpushしただけです。
自動的にローカルリポジトリを更新するため、hooks/post-updateを修正します。
$ cd hooks
$ cp post-update.sample post-update
$ vi post-update

// 中身はこんなかんじ
#!/bin/sh

cd /repo && git --git-dir=.git pull

// そのまま共有リポジトリからcloneしてローカルリポジトリを作成
$ cd /
$ git clone /repo-sv.git repo

// ファイルがあるか確認する
$ ls repo
test.txt

これで Server A にもローカルリポジトリができたことがわかると思います。
hooks/post-updateの処理も追加していますので Client A に戻って再度コミット・プッシュしてみましょう。
$ touch add.txt
$ git add .
$ git commit -m 'added'
$ git push origin master

Server A でローカルリポジトリ内を確認してみると先ほど追加した add.txt が作成されていると思います。
$ ls /repo
test.txt add.txt

これでOK。

自分がハマったのは Server A でローカルリポジトリを作成するとき、clone先をsshで指定していました。
一見問題ないように思えるんですが(実際にcloneもpushもpullもうまくいくと思います) Client A が push したとき、permissionのエラーがでてしまいました。

けっこうハマったけどとりあえず動いたんでまぁいいか。




2012年6月2日土曜日

WindowsにGitをインストール 其ノ二

次にGitとOpenSSHを使う設定関係をメモしときます。

インストールはこちら
http://teru2-bo2.blogspot.jp/2012/06/windowsgit.html

cygwinのインストールが完了したらCygwin Terminalを起動してGitが正しくインストールされているかを確認します。
$ git --version
git version 1.7.9

これでインストール完了しているのとバージョンの情報を確認することができます。
あとは任意のフォルダにリポジトリを作っていろいろな操作を試してみてください。

次にOpenSSHです。
ところでGitをするのになんでSSHサーバをたてる必要がある?というかんじですが。。。
共有リポジトリにアクセスするのに一番一般的な方法っぽかったから。。。
このあたりは人それぞれ考えがあると思いますので、一応マニュアルのリンクだけ貼っときます。
4.1 Gitサーバ プロトコル

OpenSSHの設定はちょっと私も専門外なんで参考にしたサイトのリンクを貼っときます。
けっこう詳細に書かれているのでわかりやすくすんなり設定することができました。
CygwinのOpenSSHを使って自宅のWindowsにアクセスする


かなり適当ですがこれでGitとOpenSSHの設定は完了です。
以下は私が試した例を書いておきます。これができればどちらも設定が完了しているとおもいます。
// ローカルリポジトリを作成・コミットまで
$ cd ~/
$ mkdir repo
$ cd repo
$ git init
$ touch test.txt
$ git add test.txt
$ git commit -m 'first commit'

// 共有リポジトリを作成
$ cd ~/
$ mkdir repo-sv.git
$ cd repo-sv.git
$ git init --bare --shared

// 共有リポジトリにpush
$ cd ~/
$ cd repo
$ git remote add origin ssh://127.0.0.1/home//repo-sv.git
$ git push origin master

プログラム組むのがメインなんでこのあたりどう説明していいかわかりませんが
基本的な動作はこれでできるようになると思います。





WindowsにGitをインストール 其の壱

windowsでGitをインストールする場合は、msysgitcygwinの二種類があります。
はじめはmsysgitで環境を作ろうと思ってたんですがなかなかうまくいかずcygwinでインストールしました。

一応、msysgitでもローカルリポジトリを作って操作したりLinuxで構築したGit環境(共有リポジトリ)へのpush・pullはできたんですが、Windowsで作った共有リポジトリにpushができませんでした。
msysgitというよりSSHサーバをFreeSSHdでたてたんですがその設定がうまくできませんでした。

なんか悔しいんでそのうちmsysgit+FreeSSHdもも一回試してみたいと思ってます。

とりあえず今回はcygwinを使ってGitとOpenSSHの環境を構築しました。

簡単ですがやったことをメモ程度に書いておきます。


1.cygwinのサイトから「setup.ext」をダウンロードします。

2.Cygwin Setupでは「次へ」をクリック

3.Choose Instation Typeは「Install from Internet」を選択して「次へ」をクリック

4.Choose Instation Directoryは「Root Directory」はそのまま、Install Forは「All User」を選択して「次へ」をクリック

5.Select Local Package Directoryは「C:\cygwin-dll」(何でも構いませんが)のように設定して「次へ」をクリック

6.Select Connection Typeは「Direct Connection」でも構いませんが「Use Internet Expoler Proxy Settings」を選択して「次へ」をクリック

7.Choose Download Siteは適当に任意のものを選択して「次へ」をクリック

8.インストールするパッケージを選択して「次へ」をクリック
今回私の場合はGitの環境を構築したかったので以下のパッケージを選択しました。
・Devel -> git
・Devel -> git-completion
・Devel -> git-gui
・Devel -> git-svn
・Devel -> subversion-perl
・Editors -> vim
・Net  -> openssh

9.しばらく待つとインストールが完了してデスクトップに「Cygwin Terminal」とかいうショートカットができると思います。



これでインストールは完了です。
長くなりそうなんで設定関係は別に載せます。
http://teru2-bo2.blogspot.jp/2012/06/windowsgit_02.html