【PHP】CakePHP2の環境構築と初期設定
こんばんは。
今更ですが、CakePHP2系列の環境構築と初期設定のやり方をまとめておきます。
ここではTwitterBootstrapの導入まで行います。
複数人で開発するときに環境構築のところで色々エラーが出て非常にめんどくさい思いを今したので・・・。
1. CakePHPのダウンロード
まずはダウンロードです。GitHubにあるのでCloneしてきます。
$ git clone git@github.com:cakephp/cakephp.git
2. .htaccessの設定
Cakeを開いてみて、無事開けたらこの設定は飛ばして次の手順に行ってOKです。
サーバによっては404エラーが出ると思うので、その場合は以下の.htaccessにRewriteBaseを追記します。
- cake/.htaccess
RewriteBase /~project/cake/
- cake/app/.htaccess
RewriteBase /~project/cake/app/
- cake/app/webroot/.htaccess
RewriteBase /~project/cake/app/webroot/
3. Security.saltとSecurity.cipherSeedの値を設定
次からは基本的にCakePHPのTOPページのエラーを直していくようになります。
上から順に、まずはSecurity.saltとSecurity.cipherSeedの設定です。
これは簡単で、app/Config/core.phpのSecurity.saltとSecurity.cipherSeedの値をランダムな値に変えるだけです。
ちなみにここの部分については私はこちらのサイトの方が作ったプログラム(Security.saltとSecurity.cipherSeedのセットのところ)を使わせてもらっています。
非常に便利です。ありがとうございます!
4. tmpフォルダに書き込み権限を与える
次はapp/tmpフォルダに書き込み権限を与えましょう。
$ chmod -R 777 app/tmp
5. database.phpの設定
次にdatabase.phpの設定です。
自分の環境に合わせて設定します。ここは省略します。
また、これはbakeでも出来るので後回しでもOKです。
6. DebugKitの導入
DebugKitを導入します。
まずはダウンロードして/plugins/にDebugKitにリネームして入れます。(cloneしても良いと思います。)
$ git submodule add https://github.com/cakephp/debug_kit.git app/Plugin/DebugKit
次に/app/Config/bootstrap.phpにプラグインのロードを記述します。
CakePlugin::load(array('DebugKit'));
次にAppController.phpでコンポーネントを読み込みます。
<?php class AppController extends Controller { public $components = array('DebugKit.Toolbar'); // この行を追加 } ?>
次にLayouts/default.phpに記述されたsql_dumpエレメントの出力を削除します。
<?php echo $this->element('sql_dump'); ?>
以上のことを行い、右上にアイコンが出現したらOKです。
7. TwitterBootstrapの導入(追記:現在は下記の8番の方法でやるようにしています)
以上でCakePHPのTOP画面のエラーは全て消えたと思います。
続いてTwitter Bootstrapを導入します。
導入手順は以下の通りです。
本体をダウンロードし、css, img, jsファイルをwebrootに移動
Bootstrapからダウンロードします。 wgetとかでやるのが早いと思います。
TwitterBootstrapプラグインをTwitterBootstrapにリネームしてapp/Pluginに配置
Cakeのルートに移動して以下のコマンドを実行
$ git clone git://github.com/slywalker/TwitterBootstrap.git app/Plugin/TwitterBootstrap
bootstrap.phpにプラグインの読み込み記述
app/Config/bootstrap.phpに以下の記述を追記します。
上記でDebugKitの読み込み記述をしたときにarrayでやったので、そこに追記する形で。
CakePlugin::load(array('DebugKit', 'TwitterBootstrap'));
default.ctpファイルをbootstrap.ctpにリネームして配置
app/Plugin/TwitterBootstrap/View/Layouts/default.ctpを app/View/Layouts/bootstrap.ctpとしてコピー。
$ cp app/Plugin/TwitterBootstrap/View/Layouts/default.ctp app/View/Layouts/bootstrap.ctp
このbootstrap.ctpはbake用です。bakeでControllerやViewを生成する際、選べるようになります。
ここまでの作業を終えると、http://host/project/twitter_bootstrapにアクセスするとbootstrapのテンプレートが表示されると思います。
AppControllerにヘルパーを追加
次にbakeではなくデフォルトでTwitterBootstrapにする場合についても設定しておきます。
bakeでやる場合はいらないかもですが一応書いておきましょう。
Appcontrollerに以下の記述を追記。
<?php public $helpers = array( 'Session', 'Html' => array('className' => 'TwitterBootstrap.BootstrapHtml'), 'Form' => array('className' => 'TwitterBootstrap.BootstrapForm'), 'Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator'), ); ?>
次にレイアウトファイルでcssとjsを読み込むようにします。
Layouts/default.ctpに以下の記述を追記。
echo $this->Html->css('bootstrap.min'); // echo $this->fetch('meta');の直前 echo $this->Html->css('bootstrap-responsive.min'); // 同上 echo $this->Html->script('bootstrap.min'); // echo $this->fetch('script');?>の上に配置
8. TwitterBootstrapの導入(追記分)
7番では本体をダウンロードして、TwitterBootstrapプラグインをCloneしてきましたが、ここでは本体をダウンロードすることなくLESSからコンパイルし、かつTwitterBootstrapプラグインをサブモジュール化したいと思います。
ほとんどプラグインのREADMEに書いてあるまんまでしたけど…
個人的にはこっちのやり方のほうがスマートな感じがするので好きです。
プラグインをサブモジュールとしてインストール
READMEに書いてある通りですが、まずは自分のプロジェクトにサブモジュールとしてインストールします。
$ cd /project $ git submodule add git://github.com/slywalker/TwitterBootstrap.git app/Plugin/TwitterBootstrap $ git submodule update --init --recursive
submoduleに対して update と init を同時に行い、またrecursiveによって再帰的にupdateをしています。
bootstrap.phpにプラグインの読み込み記述
ここは7番と同じ。
app/Config/bootstrap.phpに以下の記述を追記します。
CakePlugin::load(array('DebugKit', 'TwitterBootstrap'));
default.ctpファイルをbootstrap.ctpにリネームして配置
ここも7番と同じ。bake用にレイアウトファイルを移動します。
$ cp app/Plugin/TwitterBootstrap/View/Layouts/default.ctp app/View/Layouts/bootstrap.ctp
ちなみにbakeを使わない場合はAppControllerにヘルパーを追記し、レイアウトファイルにCSSなどを読み込ませますが、7番とまったく同じやり方なので割愛します。
recessとuglifyjsをインストール
次にbootstrapプラグインのLESSをコンパイルするために必要な recess と uglifyjs をインストールします。
両者をインストールするには node(npm) が必要なので、まずはその環境を整えます。
nvmとnodeのインストール
ここではnvmを使ってnodeをインストールしたいと思います。
nvmとnodeのインストール方法は過去に書いたこちらの記事を参照で。
npmでrecessとuglyfyjsをインストール
nodeがインストールできたら、npmを使ってrecessとuglyfyjsをインストールします。
$ npm install recess -g $ npm install uglify-js@1 -g
-g でカレントディレクトリではなくユーザホームにインストールしています。
また、uglifyjsは最新版だとエラーが出るので過去バージョンを使用しています。
bootstrapのビルド
ここでbootstrapをビルドし、CSSやjsを生成します。
$ cd /project $ app/Console/cake TwitterBootstrap.copy $ app/Console/cake TwitterBootstrap.make
これでエラーが出なければOKです。
webrootのcssやjsを見てみるとbootstrap用のファイルが生成されていると思います。
あとはbakeする際にbootstrapを指定すれば適用されると思います。
以上で全ての手順が終了です。 あとはCake bake allとかで色々作ってください。 お疲れ様です。
参考にさせていただいたサイト
[PHP]CakePHPのインストール〜DebugKitの導入&HelloWorldまで | offsidenowの日常を綴ったブログ
CakePHP DebugKit の導入手順 - Qiita
CakePHPでTwitterBootstrapがはまった話~即戦力になるためのPHPシステム開発の教科書P33より – エコテキブログ
CakePHPのエラー by rice_american's blog
CakePHPのTwitter Bootstrapプラグイン インストール方法 | 三日坊主も300個
crontabの書き方と安全な使い方
こんばんは。
今回、何気に今までcrontabをあまり使っていなかったので、その使い方とかをまとめてみたいと思います。
cronとは
cronはUNIX系のデーモン(常駐プログラム)の一種で、ユーザが設定したスケジュールに基づいて指定したコマンドとかを自動で実行してくれるものです。
つまり、定期的に決められた時間にプログラムを実行したいとき、使うものです。
その時間帯について、何時(何日とかも)に実行するのかを指定するのを書くものが、crontabファイルになります。
ちなみにMac(OS X)にはlaunchdというのがあり、Macの場合はこっちを使ったほうが良いみたいです。
launchdの使い方についてはこちらの記事で。
crondが起動しているか確認
さて、まずはcrondが起動しているか確認します。
デフォルトでは起動しているはずです。
確認する方法は以下の通りです。
$ /etc/rc.d/init.d/crond status crond (pid xxxx) を実行中...
上記のようになっていれば起動しています。
もし起動していない場合はstartとかで起動してください。
crontabファイルの使い方と運用
crontabファイルはユーザ毎にファイルを持ち、/var/spool/cron/user
に保存されています。
このファイルを直接編集することも可能ですが、普通はcrontabコマンドを使って編集します。
crontabコマンドの使い方とオプションは以下の通りです。
crontab [-u user] file または crontab [-u user] [-e | -l | -r | -i]
オプション | 内容 |
---|---|
u | 対象となるユーザを指定 |
e | エディタを起動し、crontabの設定を編集する |
l | crontabの内容を確認 |
r | crontabの内容を削除 |
i | 確認プロンプトを表示(rと併用) |
よく使うのは u, e, lでしょうか。
で、実際にcrontabを編集する場合はeオプションでやることになるわけですが、本当はeオプションで編集していくというやり方はやらないほうが良いみたいです。
なぜかと言うと、削除をするのはrオプションですが、rとeがキーボードで隣同士にあり、間違って消してしまう可能性があるからです。
よって、これを防ぐために色々なやり方があるわけですが、私はeオプションを使わず、常に外部ファイルを読み込ませるようにしています。
crontab cron.txt
上記のようにするとcron.txtに書いた内容が設定されます。
よって、このcron.txtに設定を書いていくようにします。
crontabファイルの書き方
crontabは以下のように書きます。
分 時 日 月 曜日 <コマンド>
曜日は0と7が日曜日になり、数値で設定します。
また、以下の様な書き方も出来ます。
記号 | 内容 | 例 |
---|---|---|
-(ハイフン) | 範囲指定 | 5-10とすると5~10分の毎分コマンドが実行 |
* | 全範囲 | 分フィールドに*とした場合は毎分実行 |
,(カンマ区切り) | リスト指定 | 1,3,5-10とすると1,3,5分と10分までの毎分コマンドが実行 |
/ | 間隔値指定 | 5-10/2とすると5~10分の間を2分間隔で実行し、*/5だと5分おきに実行 |
よく使う設定例は以下の様な感じですかね。
00 00 * * * /home/username/test.sh // 毎日0時に実行 * * * * * /home/username/test.sh // 毎分実行
もっと他に色々細かい話があるんですけどそれは何かあったら書こうと思います。基本的にはこれまで書いた内容で使えるはずです。
それでは。
参考にさせていただいたサイト
crontab使い方まとめ。 - ばくのエンジニア日誌
crontab -e は「絶対に」使ってはいけない - ろば電子が詰まっている
【PHP】MAMPでCakePHPのbakeコマンド実行したらMySQLに接続出来なかった時の対応
久しぶりに記事更新です。 今回はCakePHPについてです。
MacのMAMP環境でbakeコマンドでモデルを作成しようとした際、mysql.sockが No such file or directory となってしまい、MySQLに接続出来ませんでした。
色々調べてみた結果、こちらの記事に解決策が書いてありました。
方法としては、現在生成されているmysql.sockをdatabase.phpに指定してあげるというやり方です。
database.phpに以下のコードを付け足します。
<?php public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'username', 'password' => 'password', 'database' => 'yourdatabase', 'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock', // ここを付け足す 'encoding' => 'utf8', ); ?>
どうもCakephp2.x系からsocketの指定がデフォルトと違う場合にこのように設定するみたいです。
結構ハマりましたが解決出来て良かったです。
ちなみに、cakeコマンドのschema generateを使うとトレースみたいなことが出来るので、よく分からないエラーが出た時はこれも非常に便利です。以下のように実行します。
$ php cake.php schema generate
今回は以上です。それでは。
参考にさせていただいたサイト
MAMPのcakephpでDBにつながらない « Hello My World MAMP環境でのCakePHPのmysql.sockの指定方法 - 10rane.com
【JavaScript】ローカルファイルにテキストを出力して保存
こんにちは。 久々の更新になってしまいました。
今回はJavaScriptについてです。
先日とある人から「ボタンを押した数をカウントしてテキストファイルに保存したい」という要望がありました。 要望だけ見ればものすごく簡単です。
ただ、今回はWebサーバ環境はないのでローカルだけで処理したい(PHP等が使えない)ということだったため、JavaScriptで実現しようと思いました。 しかしJavaScriptは基本的にはローカルファイルを扱えません。
そこで色々と調べた結果、HTML5のFile APIというのを使うと実現出来るようなのでやってみました。 一応実現出来たため、メモとして残しておきます。
以下ソースコードです。
<!DOCTYPE html> <html> <head> <script src="jquery-1.7.1.min.js"></script> <script type="text/javascript" src="test.js"></script> </head> <body> <div id="contents_sample_wrap"> <ul> <li class="text_box">ボタンを押すとテキストが変わります</li> </ul> <input type="button" value="テキストを変更" id="count" /><!--クリックしたときにtext() を実行--> <input type="button" value="出力!" id="export" /> <a id="download" target="_blank">ダウンロード(IEでは、右クリック>対象をファイルに保存)</a> </div> </body> </html>
HTML側は特に難しいことはしていません。 Jqueryと外部JSファイルを読み込み、カウントアップボタンと出力ボタンを作成しています。 出力ボタンを押すとダウンロードリンクが生成され、ボタンを押した回数が書き込まれたファイルをDLできるという流れです。
次にJavaScriptのほうです。
$(function() { var click_count = 0; // ボタンカウント用変数 if (typeof Blob !== "undefined") { // alert('このブラウザに対応しています'); } else { alert('このブラウザには対応していません'); } $("#count").click(function(){ click_count++; // ボタンを押した数をカウント // text_boxクラスのテキストの値を変更 $("#contents_sample_wrap .text_box").text("ボタンが" + click_count + "回クリックされました"); }); $("#export").click(function(){ // 出力ボタンを押した場合は、setBlobUrl関数に値を渡して実行 setBlobUrl("download", click_count); }); }); function setBlobUrl(id, content) { // 指定されたデータを保持するBlobを作成する。 var blob = new Blob([ content ], { "type" : "application/x-msdownload" }); // Aタグのhref属性にBlobオブジェクトを設定し、リンクを生成 window.URL = window.URL || window.webkitURL; $("#" + id).attr("href", window.URL.createObjectURL(blob)); $("#" + id).attr("download", "tmp.txt"); }
ポイントはsetBlobUrl関数の中身です。 BlobというクラスをNewしていますが、これがFile APIの機能の一部です。 これを利用し、ローカルファイルに出力しています。
今回は以上です。 File APIは割と手軽なので、色々と出来そうですね!
それでは。
参考にさせていただいたサイト
Webページ作成覚書: javascript: ファイルの出力
HTML5のBlobで、動的データのダウンロードを、わずか3行で実装できた。
【Android】DialogFragmentのdismissで落ちるときの対策
こんにちは。
これまでDialogFragmentについて何回か触れてきましたが、どうもたまに dismiss で落ちることがあるようです。
DialogFragmentの表示を消すときは、基本的に以下のようにして消していました。
if (dialogFragment.getShowsDialog() && dialogFragment != null) dialogFragment.getDialog().dismiss(); // ここで落ちる
上記のようにすると、コメントのある行で NullPointerException が起きてしまします。 どうやら、dialogFragment.getDialog() がNullなようです。 なぜNullになってしまうのかは不明ですが、とりあえず下記のようにして解決出来ました。
if (dialogFragment.getShowsDialog() && dialogFragment != null) dialogFragment.onDismiss(dialogFragment.getDialog());;
こちらのエントリーを参考にさせて頂きましたが、結構困っていたので本当に助かりました!
今後は上記のように onDismiss を使っていきたいと思います。
今回は以上です。 それでは。
参考にさせていただいたサイト
【Android】AsyncTaskでバックグラウンド処理とキャンセル対応
こんばんは。
今回は、Android(Java)でバックグラウンド処理(非同期処理)をする方法について、メモします。
また、バックグラウンド処理中にプログレスダイアログを表示させ、キャンセルにも対応するようにしました。
Androidでバックグラウンド処理をしようとすると、UI Threadを使いメインスレッドとは別スレッドとして処理をさせるようにする必要があります。
また、処理中にUI更新を行うためにはHandlerを利用しなければなりません。
ただ、それだと少しめんどくさいので、今回は別スレッドでの処理と処理中や処理完了後のUI更新を簡単にしてくれるAsyncTaskというものを使って書いていきます。
(なお、UI ThreadやHandlerを利用した方法はこちらのサイトに詳しく説明してあります。一度見ておくとAsyncTaskについての理解の助けになるかもしれません。)
基本的にこういう処理の場合はプログレスバーで何%処理が完了しているかみたいなのを表示するのですが、今回は前の記事でも書いた、グルグルするプログレスダイアログを表示することにします。
プログレスバーでのやり方については参考サイトにたくさん載っているので。
今回作成するのは、ボタンを押したらダイアログが表示され、バックグラウンドで3秒Sleepする、というものです。
処理完了後はToastが表示され、またキャンセルされたときもToastを表示させます。
さて、それでは実装していきましょう。
作成しなければならないクラスファイルは以下の3つです。
- メインとなるActivity
- プログレスダイアログのDialogFragment
- AsyncTaskのクラス
以下でそれぞれについて見ていきます。
1. メインとなるActivity
まずはActivityです。
ここは単純にAsyncTaskを実行するだけですね。
public class MainActivity extends Activity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(this); } @Override public void onClick(View v) { // AsyncTask呼び出し new MyAsyncTask(this).execute("params"); } }
はい。MyAsyncTaskという独自クラスにThisを渡して、executeしているだけです。
ここで"params"という引数を渡していますが、これはAsyncTaskのdoInBackgroundの引数として受け取ります。
2. プログレスダイアログのDialogFragment
これはこちらで書いてあるDialogFragmentの内容そのままですので、今回は割愛します。
3. AsyncTaskのクラス
いよいよメインとなるAsyncTaskのクラスを実装していきます。
import java.io.Serializable; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; /** * AsyncTaskの引数は、デフォルトでは AsyncTask<Params, Progress, Result>です。これはそれぞれ <入力パラメータ、進行度、結果のデータ型> を表しています。 * 入力パラメータはActivityのexecute()で渡した引数の型です。 * 今回は、入力パラメータをStringで渡し、進行度をIntegerで指定してUIを更新し、最終結果をLongで返すようにしています。 */ public class MyAsyncTask extends AsyncTask<String, Integer, Long> { Context context; MyProgressDialogFragment progressDialog = null; // ロード中画面のプログレスダイアログ作成 /** * コンストラクタ */ public MyAsyncTask(Context context){ this.context = context; } /** * バッググラウンド処理の前処理(準備) * UI Thread処理 */ @Override protected void onPreExecute(){ @SuppressWarnings({ "serial" }) Serializable Cancel_Listener = new MyProgressDialogFragment.CancelListener() { @Override public void canceled(DialogInterface _interface) { cancel(true); // これをTrueにすることでキャンセルされ、onCancelledが呼び出される。 } }; progressDialog = MyProgressDialogFragment.newInstance("処理中", "しばらくお待ちください", true, Cancel_Listener); progressDialog.show(((Activity) context).getFragmentManager(), "progress"); } /** * バックグラウンド処理 */ @Override protected Long doInBackground(String... params) { try{ Thread.sleep(3000); // Cancelされたとき if (isCancelled()){ return 0L; } } catch (InterruptedException e) { Log.d("test", "Error"); } return 123L; } /** * バックグラウンド処理が終わった後の処理(表示の更新) */ @Override protected void onPostExecute(Long result){ if (progressDialog.getShowsDialog()) progressDialog.dismiss(); if (result != null){ Toast.makeText(context, result.toString(), Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(context, "NG", Toast.LENGTH_SHORT).show(); } } /** * 中止された際の処理 */ @Override protected void onCancelled(){ if (progressDialog.getShowsDialog()){ progressDialog.dismiss(); } Toast.makeText(context, "Canceled", Toast.LENGTH_SHORT).show(); } }
こんな感じです。
注意点はだいたいソースコードに書いてあります。
AsyncTaskの実行の流れとしては以下のようになります。
- onPreExecute(前処理)
- doInBackground(メイン処理)
- onPostExecute(後処理)
- onCancelled(中止されたときの処理)
また、プログレスバーを付けると、doInBackgroundでpublishProgressを使ってプログレスバーの値を変更します。
publishProgressを呼び出すと、onProgressUpdate(進み具合を更新)する関数が呼び出されますので、これもオーバーライドして実装します。ここの引数の型はAsyncTaskの2つ目のパラメータです。
以上でバックグラウンド処理をすることが出来ました!
最初はちょっと戸惑いましたが、流れが分かるとそこまで難しくないのかなーと思います。
今回は以上です。
それでは。
追記
こちらのエントリーでは上記のものをリスナーを使って汎用的にし、Activity側にイベントを返しています。
こんな感じでやったほうが便利ですね。今後私もこのようにやっていきたいと思います。
ぜひ参考にしてみてくださいー。
参考にさせていただいたサイト
AsyncTaskと仲良くなろう:バックグラウンド処理とキャンセル
AsyncTask を利用した非同期処理
AndroidでAsyncTaskを使ったバックグラウンド処理
Androidの汎用的な非同期通信クラスできたよー!
【PHP】DBpedia Japaneseから情報を取得する
こんばんは。
最近、オープンデータの勉強をしました。 そこでSPARQLについて使い方を少し学んだので、これを使って前々からやりたかったDBpediaの情報をPHPで取得するということを今回はしたいと思います。
SPARQLをPHPで使おうとすると、ライブラリ等を使うやり方が多いですが、今回は特に何も入れることなく実装しています(PHPのcurlを使っています)。
SPARQLをPHPやJava等で使うやり方を探してみると、もう見事に英語の記事しかありません。 なので、今回初挑戦ということもあり、このやり方がベストなやり方なのかは正直自信ないですが、とりあえず出来たのでメモしておきます。
なお、私自身はオープンデータやRDF、SPARQLをそこまで勉強しているわけではないので、今回SPARQLの使い方の詳しい説明等は省きます。
取ってくるデータはWikipediaをLODとして公開しているDBpediaのデータにしたいと思います。
やることは以下の点です。
- DBpediaのエンドポイント(SPARQL文を発行するところ)を確認する。
- DBpediaにSPARQLを発行して得られる情報(RDF)の形を確認し、ほしい情報のプロパティを確認する。
- PHPでSPARQLを発行し、情報を取得する
さて、一つずつ見ていきます。
1. DBpediaのエンドポイントを確認する
まずはDBpedia Japaneseを見てみます。
SPARQL例のところに、SPARQL Endpointというリンクがありますが、DBpedia JapaneseのエンドポイントのURLはこのリンク(http://ja.dbpedia.org/sparql)です。
また、フォームにデフォルトで入ってるのが基本的なSPARQL文です。ここの東京都を岩手県にしたり、宮沢賢治にしたりするとそれに関連する情報を得られます。
ここで色々といじれるので(結果フォーマットをJsonにしたりCSSにしたり)、いろいろやってみると面白いと思います。
2. RDFを確認し、欲しい情報のプロパティを決める。
さて、上記のところで、Run Queryを押してみてください。
すると、フォームに書いてあったSPARQLが実行され、ブラウザに実行結果が表示されます(結果フォーマットをHTMLにしてくださいね)。
データはこんな感じで返ってくるので、”o”の欄を見て自分が欲しい情報を決めます。
すべて返すようにしてもいいんですけど、今回は長いので下にあるabstractの値のみを返すようにしたいと思います。
つまり、プロパティは"abstract"になりますね("p"の欄のURLの最後に書かれているもの)。
3. PHPでSPARQLを発行し、情報を取得する
それでは、上記までで得た情報を元に、実際にPHPでSPARQLの発行をしてみたいと思います。
今回はテキストフォームに入力された値の情報(abstract)を取得するようにしたいと思います。
ソースコードは以下のような感じになります。
大体参考サイト様のソースそのままですが。
<?php // URL発行 function getUrlDbpediaAbstract($arg){ $format = 'json'; // フォーマット。textにもできる // 実際のSPARQLクエリ文。URLを打つのがめんどい場合はPREFIX使おう // 今回は関数の引数に実際の値となるもの(東京都とか岩手県とか)を渡す感じで // また、Abstractの項目の値のみを取得しています。全部取得する場合は?pとかで $query = "select distinct * where { <http://ja.dbpedia.org/resource/".$arg."> <http://dbpedia.org/ontology/abstract> ?o . }"; // これが発行URL。上記で生成したものをURLエンコードして文字列結合するだけ。 $searchUrl = 'http://ja.dbpedia.org/sparql?' .'query='.urlencode($query) .'&format='.$format; return $searchUrl; } // クエリを実際に発行する関数 // ここではCurlを使って結果セットを取得しています。 function request($url){ // curl関数があるかどうかを調べる if (!function_exists('curl_init')){ die('CURL is not installed!'); } // Curlセッションを初期化 $ch= curl_init(); // リクエストURLをセット curl_setopt($ch, CURLOPT_URL, $url); // 結果を文字列で取得 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curlの実行 $response = curl_exec($ch); curl_close($ch); return $response; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <form action="" method="post"> <input type="text" name="arg" /> <input type="submit" /> </form> </body> </html> <?php if(isset($_POST["arg"])){ // リクエストURL発行 $requestURL = getUrlDbpediaAbstract($_POST["arg"]); // レスポンスをパースして取得(テキスト形式の場合はそのまま取得) $responseArray = json_decode(request($requestURL), true); //$responseArray = request($requestURL); // 表示 var_dump($responseArray); } ?>
こんな感じです。
フォームに東京都とか岩手県とか入れて、ブラウザ上にAbstractの値が表示されればOKです。
説明はほぼソースコードに書いてあります。
これでDBpediaの情報を取得出来たので、色々と面白いアプリが作れそうです。
前からDBpediaの情報は使いたいと思っていたので、今後積極的に活用していきたいと思います。
また、ライブラリを使うとまたできることが広がるのかなーとは思いますが、英語あんまり読めないのでどなたか詳しい方がいれば、是非もっと良いやり方や他のやり方などを教えてほしいです。
とりあえず今回は以上です。
それでは。