Furudateのブログ

プログラミングやネットワーク系の知識・技術がメインのブログ。技術メモ帳的な感じになるかと。岩手から発信していきます。

【PHP】CakePHPで特定のバリデーションルールを解除

こんにちは。

CakePHPではモデルの$validateにバリデーションルールを指定しています。
ここで指定するとsaveのときや $this->Model->validates() で自動でバリデーションをしてくれてとても便利です。
しかし、場合によってはバリデーションルールの一部をここでは使わなくていい、というときがあります。
今回はその場合のやり方についてメモしておきます。

やり方としては、unsetで対象のルールを解除してからバリデーションを行います。
例えばUserモデルのemailのnotEmptyを解除したい場合は以下のように書きます。

<?php
    unset($this->User->validate['email']['notEmpty']);

    if ($this->User->validates()){
    
    }
?>

ちなみにunsetは(ローカル)変数の割当を解除する関数です。
今回は以上です。
それでは。

参考にさせていただいたサイト

CakePHP 一部のバリデーションルールを解除する - Code Life

【PHP】CakePHP2でcurlを使ってREST APIを叩く処理

こんにちは。

最近、自作したAPICakePHPを使って叩こうとしたのですが、何を使えばいいか迷いました。
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などが入ります。リクエストを何で送るかですね。

どこのAPIに送るかです。Users.jsonなど、CakePHPでいうコントローラー名になると思います。

  • $query

主にデータ取得の際、何か指定する場合に値が入ります。

  • $data

POSTなどのデータを送る場合にその送るデータが入ります。

curlの基本的な流れ

curl は基本的に以下のように使います。

  1. curl_init()で初期化
  2. オプションを設定
  3. curl_exec()で実行
  4. curl_close()で終了

ここで重要なのはオプションについてです。
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レスポンスの情報を見ることが出来ます。
接続時間とかあるので何かを検証するときなどは便利そうです。

今回は以上です。
それでは。

参考にさせていただいたサイト

PHP: 基本的な curl の使用法 - Manual

PHP: curl_setopt - Manual

PHPメモ : file_get_contentsの代替にcURLを使う – Mach3.laBlog

phpのcurl ライブラリの使い方の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');
}
?>

簡単ですね。

今回は以上です。
それでは。

参考にさせていただいたサイト

ControllerからModelを使用する | CakePHP情報

CakePHP2.xで複数のモデルを使う方法 - otyo's diary

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コマンドとかを使って文字コードを変更してください。

今回は以上です。
それでは。

参考にさせていただいたサイト

専門用語(キーワード)自動抽出用Perlモジュール "TermExtract"の解説

termextractのインストール - MacOS Xは僕の研究のパートナー

Wikipedia上位下位関係抽出ツールを使ってみた

おはようございます。
最近研究関連で言語処理の分野を見ています。
今回はWikipediaのダンプデータを使って用語の上位下位関係(is-a関係)を抽出するツールがあったので、それを使ってみました。
ツールこちら
なお、後述しますが抽出にはかなり時間がかかります。

インストール方法がツールのページに細かく書いてくれているのですが、このツールが2010年か2011年ぐらいのものでしたので、中々スムーズに使うことが出来ませんでした・・・
そこで今回はその方法をメモしておきます。

動作環境と必要なもの

動作環境

今回の私の環境は以下のようになります。

rubyはrbenvで1.8.7をインストールしました。
1.9以上だと動かないようなので・・・
※ 実際に2.0以上でやってましたが、色々修正が必要でめんどくさかったので結局1.8.7をインストールしました

インストールするもの一覧

さて、次に実行に必要なツールについてですが、以下のものが必要になります。

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の全記事データを分析しているのでめっちゃ時間かかるしメモリもかなり消費するので仮想サーバ上でやるのがおすすめです。

今回は以上です!
それでは。

参考にさせていただいたサイト

上位下位関係抽出ツール Version1.0: Hyponymy extraction tool

上位下位関係抽出ツールを使う | kitayama lab

上位下位関係抽出ツールを使ってみる - 重要なお知らせ