【PHP】CakePHPで特定のバリデーションルールを解除
こんにちは。
CakePHPではモデルの$validateにバリデーションルールを指定しています。
ここで指定するとsaveのときや $this->Model->validates() で自動でバリデーションをしてくれてとても便利です。
しかし、場合によってはバリデーションルールの一部をここでは使わなくていい、というときがあります。
今回はその場合のやり方についてメモしておきます。
やり方としては、unsetで対象のルールを解除してからバリデーションを行います。
例えばUserモデルのemailのnotEmptyを解除したい場合は以下のように書きます。
<?php unset($this->User->validate['email']['notEmpty']); if ($this->User->validates()){ } ?>
ちなみにunsetは(ローカル)変数の割当を解除する関数です。
今回は以上です。
それでは。
参考にさせていただいたサイト
【PHP】CakePHP2でcurlを使ってREST APIを叩く処理
こんにちは。
最近、自作したAPIをCakePHPを使って叩こうとしたのですが、何を使えばいいか迷いました。
PHPを使って外部のリソースを取得したりAPIを叩くとき、file_get_contentを使う方法があります。
しかし、パフォーマンス的にはcURLを使ったほうが良いみたいです。
そこで、今回はREST APIを叩く場合にcURLを使う方法をメモしておきます。
cURLを使ってAPIを叩く関数を作成
まずはRESTに対応した関数を作成します。基本的にこの関数を各コントローラーから呼び出してAPIを叩く感じになります。
関数は AppController とかに書きましょう。
<?php class AppController extends Controller { public function api_rest($method, $uri, $query = null, $data = null){ $ch = curl_init(); $basic_url = "http://localhost/sample_api/"; $options = array( CURLOPT_URL => $basic_url.$uri.'?'.$query, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS => http_build_query($data), // URLエンコードして application/x-www-form-urlencoded でエンコード。URLエンコードしないとmultipart/form-dataになる ); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); // 第2引数をtrueにすると連想配列で返ってくる curl_close($ch); return $response; } } ?>
基本的にcurlの公式マニュアル(こちら)のExampleに書いてあるのを参考にした(パクった)のですが、一応上から説明していきます。
引数について
- $method
GET, POST, PUT, DELETEなどが入ります。リクエストを何で送るかですね。
- $uri
どこのAPIに送るかです。Users.jsonなど、CakePHPでいうコントローラー名になると思います。
- $query
主にデータ取得の際、何か指定する場合に値が入ります。
- $data
POSTなどのデータを送る場合にその送るデータが入ります。
curlの基本的な流れ
curl は基本的に以下のように使います。
ここで重要なのはオプションについてです。
curl_setopt()で一つひとつオプションを指定するやり方もあるのですが、今回は curl_setopt_array() で一気にオプションを指定しています。
オプションについて
ここで使っているオプションについてメモしておきます。
その他にもたくさんのオプションがあるのでこちらを参照してください。
- CURLOPT_URL
- アクセス(APIの)するURL
- CURLOPT_HEADER
- ヘッダを出力するか。レスポンスヘッダを見たい場合はtrueにしてください。
- CURLOPT_RETURNTRANSFER
- curl_execの戻り値を文字列にする
- CURLOPT_TIMEOUT
- タイムアウト時間の設定
- CURLOPT_CUSTOMREQUEST
- HTTPメソッドのカスタムリクエストを設定出来ます。ここでリクエストの種類を指定
- CURLOPT_POSTFIELDS
- 送信するデータ
作成した関数を利用する
さて、関数を作成したらあとはこの関数を利用すればOKです。
以下のようにして各コントローラーで利用しましょう。
$res = $this->api_rest('POST', 'users.json', "", $this->request->data);
これでREST APIに対応出来ました。
ちなみに、curl_close()する前に curl_getinfo($ch) とすることでHTTPレスポンスの情報を見ることが出来ます。
接続時間とかあるので何かを検証するときなどは便利そうです。
今回は以上です。
それでは。
参考にさせていただいたサイト
【Excel】文字列処理の便利な関数まとめ
こんにちは。
今回はExcelについてです。
Excelで改行削除とかスペース削除とかの文字列処理をしたいときに使える関数をまとめておきます。
今回は完全に自分の備忘録です。
関数名 | 説明 |
---|---|
CLEAN関数 | 改行コードを削除(厳密には印刷されない制御文字を削除) |
SUBSTITUTE関数 | 置換。入れ子で複数指定できます。これでスペースとか削除します |
基本はこの2つで余計な文字はなくせました。
また、文字列処理ではないですが、データ件数が多い時はフィルタを使うことがあると思います。そのフィルタをかけてるときにそれが何件あるのかをカウントしたいときはSUBTOTAL関数を使います。
SUBTOTALは以下のように使います。
SUBTOTAL(集計方法, 集計範囲)
集計方法は以下の数字を指定します。
引数 | 集計方法 |
---|---|
1 | 平均 |
2 | 数値の個数 |
3 | データ件数 |
4 | 最大値 |
5 | 最小値 |
9 | 合計 |
以上です。
それでは。
【PHP】CakePHP2.x系での別モデルの使用方法まとめ
こんにちは。
久々にCakePHPについての更新です。
今回は小ネタ的な感じですが、あるコントローラーから別のモデルを使いたいとき、あるいはあるモデルから別のモデルを使いたいときの方法をまとめておきます。
以下では、hogeコントローラー、hogeモデルにおいて別のモデルを使用する場合の書き方を書いていきます。
Controller内で別のモデルを使う
Controllerで別のモデルを使う場合は、2つの書き方があります。
これは使う用途によって分けるのが良さそうです。
Controller全体で別のモデルを使う場合
そのコントローラーにおいて全体的に別のモデルを使いたい場合は以下のように書きます。
<?php class hogeController extends AppController{ public $uses = array('Model1', 'Model2'); } ?>
Controllerの一部のみで別のモデルを使う
Controllerで特定の処理のときのみ別のモデルを使う場合は以下のように書きます。
<?php class hogeController extends AppController{ public function index(){ $this->loadModel('Model1'); $this->Model1->find('all'); } } ?>
この場合はその処理のときのみ指定したモデルが読み込まれるので、全体的に使う場合の書き方より処理が早くなりますし無駄もなくなります。
ですのでこの2種類の書き方をうまく使い分けるほうが良さそうです。
Model内で別のモデルを使う
Modelにメソッドを書いて値をControllerに渡すことは多いと思います。
そのためModel内で別のモデルを使いたくなることもあると思いますが、その場合は以下のように書きます。
<?php class hoge extends Appmodel{ App::import('Model', 'FooModel'); $this->FooModel= new FooModel; $this->FooModel->find('all'); } ?>
簡単ですね。
今回は以上です。
それでは。
参考にさせていただいたサイト
nvmをHomebrewでインストールしてみました
こんばんは。
今までnode.jsをHomebrewでインストールしていたんですが、今更ながらnvmで管理することにしました。
nvmはnodeのバージョン管理ツールです。
nvmはHomebrewで入れたのでインストールから設定と使い方までメモしておきます。
nvmのインストール
まずはHomebrewでインストールです。
$ brew install nvm
インストールすると色々とメッセージが出てくるのでそれの通りにします。
ちなみにメッセージが流れちゃった場合は brew info nvm で見れると思います。
$ mkdir ~/.nvm $ vim ~/.bash_profile # 以下を追加 export NVM_DIR=~/.nvm source $(brew --prefix nvm)/nvm.sh
以上です。
nvmの使い方
次にnvmの使い方を見てみます。
nvm help を見てみると大体分かりますが、よく使いそうなのは以下のコマンドです。
$ nvm install <version> # node.jsのインストール $ nvm uninstall <version> # node.jsのアンインストール $ nvm use <version> # 指定したバージョンのnode.jsを使う $ nvm run <version> <jsfile> # jsfileを指定したバージョンのnode.jsで実行 $ nvm alias default <version> # 指定したバージョンのnode.jsをデフォルトに設定 $ nvm ls # インストール済みのnode.js一覧を表示します $ nvm ls-remote # インストール可能なnode.js一覧を表示します
各コマンドでのVersion指定の際は、0.10とかにすると0.10.x系の最新版がインストールされるようです。
node.jsのインストール
ではnvmを使ってnode.jsをインストールしてみましょう。
nvm ls-remote で見るとv.0.11.x系が出てきますが、現時点ではv.0.10.36が安定版でしたのでそちらをインストールします。
$ nvm install 0.10 $ which node ~/.nvm/v0.10.36/bin/node
上記のようになっていればOKです。
それでは。
MacにTermExtractをインストールして使ってみる
こんにちは。
最近自然言語処理のツールを色々といじっています。
今回は専門用語自動抽出ツールであるTermExtractというものをインストールして使ってみたいと思います。
ツールのページはこちら。
Web版もありますが今回は自分のシステムに組み込みたいこともあったのでPerlモジュールを使います。
基本的にこちらにインストールから使い方まで書いてありますが若干詰まったのでそこも含めてメモしておきます。
実行環境
以下私の環境になります。
- OS: OS X Mavericks
- Perl
- v5.21.6
- plenvでインストールしています。インストール方法はこちら。
- Perl DB_Fileモジュール
- TermExtractは学習機能を有していますが、学習機能を使うためにはこのモジュールのインストールが必要です。今回は使わないのでなくても良いですが、一応インストールしておきました。インストール方法はこちら。
- Mecab
- Mecab-perl
モジュールのインストール
環境が整ったところでモジュールをインストールします。
$ wget http://gensen.dl.itc.u-tokyo.ac.jp/soft/TermExtract-4_10.tar.gz $ tar zxfv TermExtract-4_10.tar.gz $ cd TermExtract-4_10
次にMakeでインストールするんですが、その前にモジュールのソースファイルの文字コードをUTF-8に変更します。
これをしないと結果が出力されません(私はここで若干詰まりました)。
$ cd TermExtract $ nkf -w --overwrite * $ nkf -g *
ここではnkfコマンドを使っています。
コマンドがない場合はHomebrewでインストールしましょう。
-g で確認してUTF-8になっていればOKです。
あとは普通にインストールします。
$ perl Makefile.PL $ make $ sudo make install
plenvの場合、TermExtractは以下のディレクトリにインストールされます(以下はPerlのバージョンが5.21.6の場合です)。
~/.plenv/versions/5.21.6/lib/perl5/site_perl/5.21.6/TermExtract
使ってみる
それでは実際に使ってみましょう。
まずはMecab用のサンプルスクリプトがあるのでそれを取得しましょう。
$ wget http://gensen.dl.itc.u-tokyo.ac.jp/doc/ex_mecab.pl.txt $ mv ex_mecab.pl.txt ex_mecab.pl $ nkf -w --overwrite ex_mecab.pl
文字コードをUTF-8に変更しました。
スクリプトを見てみると、mecab_out.txtに形態素解析をしたテキスト情報を入れ、そこから用語を抽出し標準出力に表示するようにしているのが分かります。
よってまずはmecab_out.txtを作りましょう。
また、色々なオプションがありますが、まずはデフォルトのままやります。
今回はMecabのWikipedia記事にある文章を分析してみたいと思います。
以下ではこの文章を test.txt にコピペしています。
$ mecab test.txt > mecab_out.txt $ perl ex_mecab.pl ChaSen 4.00 MeCab 3.00 日本語入力 2.91 Google日本語入力開発者 2.35 開発者 2.21 iPhone O S 2.18 解析精度 2.11 解析速度 2.11 解析・推定 2.08 開発開始 2.00 Mac O S X v 1.97 規模日本語n 1.91 品詞情報 1.86 形態素解析エンジン 1.85 Google 1.73 Googleソフトウェアエンジニア 1.70 IPA品詞体系 1.70 v 1.41 gramデータ 1.41 オープンソース 1.41 奈良先端科学技術大学院大学出身 1.41 工藤拓 1.41 和布蕪 1.41 基 1.00 好物 1.00 辞書 1.00 スクラッチ 1.00 程度 1.00 Spotlight 1.00 ChaSenTNG 1.00 名称 1.00 名前 1.00 IPADIC 1.00 平均 1.00 独立 1.00 作成 1.00
若干変な結果もありますが、概ね用語が抽出されているのではないでしょうか。
右の数値は重要度になります。
もし何も出力されない場合は、恐らくインストールしたTermExtractモジュールの文字コードがUTF-8になっていないので、インストールのところで述べたようにインストールされたファイルに対しnkfコマンドとかを使って文字コードを変更してください。
今回は以上です。
それでは。
参考にさせていただいたサイト
Wikipedia上位下位関係抽出ツールを使ってみた
おはようございます。
最近研究関連で言語処理の分野を見ています。
今回はWikipediaのダンプデータを使って用語の上位下位関係(is-a関係)を抽出するツールがあったので、それを使ってみました。
ツールはこちら。
なお、後述しますが抽出にはかなり時間がかかります。
インストール方法がツールのページに細かく書いてくれているのですが、このツールが2010年か2011年ぐらいのものでしたので、中々スムーズに使うことが出来ませんでした・・・
そこで今回はその方法をメモしておきます。
動作環境と必要なもの
動作環境
今回の私の環境は以下のようになります。
- OS: OS X Mavericks
- ruby: ruby 1.8.7
rubyはrbenvで1.8.7をインストールしました。
1.9以上だと動かないようなので・・・
※ 実際に2.0以上でやってましたが、色々修正が必要でめんどくさかったので結局1.8.7をインストールしました
インストールするもの一覧
さて、次に実行に必要なツールについてですが、以下のものが必要になります。
- 上位下位関係抽出ツールキット
- こちらからダウンロードし、解凍します。
- MeCab: 形態素解析器
- 自分は v0.996 で実行できました。インストールは過去記事参照で。
- IPA辞書: Mecab用辞書
- mecab-ruby
- ruby 1.8.7 に mecab-ruby をビルドします。インストール方法は過去記事参照で。
- pecco: 分類器
- 次で説明します
- Wikipediaのダンプデータ: 解析用
peccoのインストール
ここではpeccoという分類器のインストール方法について記載します。
これの make が中々通らず苦労しました・・・
多分これが一番詰まりました。
peccoのソースファイルを取得
まずはpeccoのソースファイルを取得します。
$ cd ex-hyponymy-1.0 $ wget http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/pecco/pecco.tar.bz2 $ tar jxvf pecco.tar.bz2 $ cd pecco
darts-cloneのダウンロード
次に darts-clone というライブリの最新版をこちらからダウンロードします。
なお、darts-clone を使うとデフォルトより高速かつ省メモリになりますので今回はこちらを使いますが、darts-clone を使わなくても pecco は使うことが出来ます。
その場合は pecco の設定ファイルをである pecco_conf.h を以下のように編集して、次の手順(Makefileの編集)に飛びます。
$ vim pecco_conf.h // darts_clone を使う宣言をしている以下の行をコメントアウト // #define USE_DARTS_CLONE #define USE_CEDAR //この行を追加
さて、darts-cloneを使う場合の話に戻ります。
現時点では0.32が最新版ですのでそれをダウンロードしましょう。
$ wget https://darts-clone.googlecode.com/files/darts-clone-0.32g.tar.gz $ tar zxvf darts-clone-0.32g.tar.gz
次に darts-clone のヘッダファイルを pecco のディレクトリに移動して使えるようにします。
$ pwd /Users/username/Download/ex-hyponymy-1.0/pecco $ cp darts-clone-0.32g/include/darts.h ./darts-clone.h
これで darts-clone が使えるようになりました。
なお、darts-clone は Make でインストール可能ですが、今回はツールが使えるようになればそれで良いのでインストールはしないことにします。
さて、コピーが終わったらあとは darts-clone.h を呼び出しているファイルを少し編集するだけです。
ファイルは typedef.h になります。
$ vim typedef.h // 以下の行をコメントアウト //#include <darts-clone.h> #include "darts-clone.h" // 追加
これで pecco で darts-clone を使えるようになりました。
Makefileの編集
次にMakefileを環境に合わせて編集します。
$ vim Makefile // 以下の行をコメントアウト CC = ccache g++ CC = g++ //追加
このツールではg++でコンパイルするんですが、私のだとデフォルトのg++でやったらエラーが出ましたので、Homebrewでgccの最新版を入れて、gccやg++にシンボリックリンクを張りました。
インストール
さて、ここまで終わったらようやくpeccoをインストールします。
$ sudo make -f Makefile
これでエラーが出なければOKです。
上位下位関係抽出ツールを使う
いよいよツールを使いましょう。
ツールにはdata, data2, data3の3つの学習用データがあります。
デフォルトはdataですが、今回は一番精度の高いdata3を使いたいと思います。
データの指定は -t オプションです。
ちなみに更に高精度の結果が欲しい場合は -a オプションをつけると良いらしいです。
PATH=./pecco/:$PATH script/ex_hyponymy.sh -t ./data3 Wikipediaダンプファイル
上記ではpeccoにパスを通した上でやっています。
これでしばらく(かなりの時間かかりますが)待てば結果が出力されます。
自分の場合は40時間以上はかかったと思います。
出力結果
ツールの実行が終了すると、3つのファイルが作成されます。
hierarchyに対する出力結果
res_hier_withWD_posWDというファイルに出力されます。
この出力結果は、Wikipediaの箇条書きなどの階層構造から上位下位関係を抽出しています。
definitionに対する出力結果
res_def_withWD_posWDというファイルに出力されます。
この出力結果は、WikipediaのAbstract(概要文)から上位下位関係を抽出しています。
categoryに対する出力結果
res_cat_withWD_posWDというファイルに出力されます。
この出力結果は、Wikipediaの記事に付与されているカテゴリタグから上位下位関係を抽出しています。
それぞれの結果を見てみると確かに違いました。
私の場合はなぜかdefinitionだけ何回やってもエラー文も表示されてないのに出力されなかったので諦めましたが……
しかしまぁ、これでやっと使えました。
ここまでローカルにインストールして使うところまで書きましたが、正直Wikipediaの全記事データを分析しているのでめっちゃ時間かかるしメモリもかなり消費するので仮想サーバ上でやるのがおすすめです。
今回は以上です!
それでは。