にこにこ動画の新着動画リストを取得できる非公式API
ニコニコ動画の新着リストを取得できるAPIを作ってみました。
新着リストを取得できるAPI
URL:http://miyataka.sakura.ne.jp/api/nico/newarrival
そのうちランキングなんかにも対応していきます。
負荷大丈夫かな・・・。
新着リストを取得できるAPI
URL:http://miyataka.sakura.ne.jp/api/nico/newarrival
そのうちランキングなんかにも対応していきます。
負荷大丈夫かな・・・。
CakePHP1.2標準のAuthコンポーネントを利用して楽に認証機能を実装する
CakePHP1.2では標準でAuthコンポーネントが付属しています。
これを利用して楽に認証機能を実装してみます。
cakephpのアーカイブを解凍したものをドキュメントルート直下に配置したばあいです。
1. テーブル作成
usersテーブル
bookmarksテーブル
2. モデルの作成
user.php
bookmark.php
3. コントローラの作成(手早くやる為にscaffoldを使用しています)
users_controller.php
bookmarks_controller.php
この時点では、http://localhost/users と、http://localhost/bookmarks にアクセスすると、登録、編集、削除、表示などが誰でも行えます。
これに「Auth」コンポーネントを使用し、アクセス制限をかけていきます。
4. 認証制限をかける
「bookmarks_controller.php」「users_controller.php」にそれぞれ以下を追加します。
これで、「/users」「/bookmarks」にアクセス制限がかかり、ログインしていなければ自動的に「/users/login」にリダイレクトされるようになります。
まだ、「users」コントローラには「login」アクションがありませんので、今アクセスするとエラーが画面に表示されます。
「users_controller.php」に、以下を追加します。
beforeFilterでは、アクセスを許可するアクションを設定しています。
ユーザ登録は許可したいので、ログインしていなくてもアクセスできるようにしています。
「app1/views/users/」に、「login.ctp」を作成します。
login.ctp
http://localhost/bookmarks にアクセスしてみてください。
http://localhost/users/login にリダイレクトされると思います。
まだユーザ登録をしていませんので、何を入力してもログインできません。
http://localhost/users/add にアクセスし、ユーザを作成します。
その後もう一度ログイン画面にアクセスし、作成したユーザでログインしてみてください。
その後は、http://localhost/bookmarks などにもアクセスできるようになります。
これを利用して楽に認証機能を実装してみます。
cakephpのアーカイブを解凍したものをドキュメントルート直下に配置したばあいです。
1. テーブル作成
usersテーブル
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 255 ) NOT NULL ,
`password` VARCHAR( 255 ) NOT NULL ,
`created` DATETIME NOT NULL ,
`modified` DATETIME NOT NULL
) ENGINE = MYISAM ;
bookmarksテーブル
CREATE TABLE `bookmarks` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` INT NOT NULL ,
`bookmark` VARCHAR( 255 ) NOT NULL ,
`created` DATETIME NOT NULL ,
`modified` DATETIME NOT NULL
) ENGINE = MYISAM ;
2. モデルの作成
user.php
class User extends AppModel {
var $name = 'User';
var $useTable = 'users';
var $validate = array(
'username' => array('alphaNumeric'),
'password' => array('alphaNumeric')
);
//The Associations below have been created with all possible keys, those that are not needed can be removed
var $hasMany = array(
'Bookmark' => array('className' => 'Bookmark',
'foreignKey' => 'user_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
}
?>bookmark.php
class Bookmark extends AppModel {
var $name = 'Bookmark';
var $useTable = 'bookmarks';
var $validate = array(
'user_id' => array('numeric'),
'bookmark' => array('_extract')
);
//The Associations below have been created with all possible keys, those that are not needed can be removed
var $belongsTo = array(
'User' => array('className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
}
?>3. コントローラの作成(手早くやる為にscaffoldを使用しています)
users_controller.php
class UsersController extends AppController {
var $name = 'Users';
var $scaffold;
}
?>bookmarks_controller.php
class BookmarksController extends AppController {
var $name = 'Bookmarks';
var $scaffold;
}
?>この時点では、http://localhost/users と、http://localhost/bookmarks にアクセスすると、登録、編集、削除、表示などが誰でも行えます。
これに「Auth」コンポーネントを使用し、アクセス制限をかけていきます。
4. 認証制限をかける
「bookmarks_controller.php」「users_controller.php」にそれぞれ以下を追加します。
var $components = array('Auth');
これで、「/users」「/bookmarks」にアクセス制限がかかり、ログインしていなければ自動的に「/users/login」にリダイレクトされるようになります。
まだ、「users」コントローラには「login」アクションがありませんので、今アクセスするとエラーが画面に表示されます。
「users_controller.php」に、以下を追加します。
beforeFilterでは、アクセスを許可するアクションを設定しています。
ユーザ登録は許可したいので、ログインしていなくてもアクセスできるようにしています。
function beforeFilter() {
$this->Auth->allow(a('add'));
}
function login() {
}「app1/views/users/」に、「login.ctp」を作成します。
login.ctp
echo $form->create('User', array('action'=>'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('submit');
?>http://localhost/bookmarks にアクセスしてみてください。
http://localhost/users/login にリダイレクトされると思います。
まだユーザ登録をしていませんので、何を入力してもログインできません。
http://localhost/users/add にアクセスし、ユーザを作成します。
その後もう一度ログイン画面にアクセスし、作成したユーザでログインしてみてください。
その後は、http://localhost/bookmarks などにもアクセスできるようになります。
CakePHP1.2で複数アプリを動かす設定
複数アプリで同じ場所のcakeライブラリを使いたい場合があると思います。
その方法を色々試してみましたのでメモしておきます。
上記のファイル構成の場合に、「http://localhost/app1」で、アプリ1が動作。「http://localhost/app2」でアプリ2が動作するようにします。
cakephp1.2をダウンロードして解凍します。解凍してできたフォルダの「cake」フォルダを、「c:\home」フォルダにフォルダごとコピーします。
「app」フォルダを「c:\home\apps」フォルダにコピーし、フォルダ名を「app1」に変更。同じように「app」フォルダをコピーして、「app2」に変更します。
「app1」「app2」の中にある「webroot」フォルダの中のファイルを「c:\xampp\htdocs」フォルダの「app1」「app2」フォルダの中にそれぞれコピーします。


次に、「.htaccess」の設定を行います。「c:\xampp\htdocs\app1」フォルダにある、「.htaccess」をテキストエディタなどで開き、以下の行を追加します。
「c:\xampp\htdocs\app2」フォルダにある、「.htaccess」をテキストエディタなどで開き、以下の行を追加します。
次に、「c:\xampp\htdocs\app1」フォルダにある「index.php」を編集します。
「c:\xampp\htdocs\app2」フォルダにある「index.php」も上記の要領でで編集します。
以上で設定完了です。
http://localhost/app1 にアクセスしてみるとcakeが動作していることを確認できます。

その方法を色々試してみましたのでメモしておきます。
c:\home・・・・ホームディレクトリ
|
+- apps・・・・アプリ配置ディレクトリ
| |
| +- app1・・・・アプリ1
| |
| +- app2・・・・アプリ2
|
+- cake・・・・cakeフレームワーク本体
c:\xampp\htdocs・・・・ドキュメントルート
|
+- app1・・・・アプリ1のwebrootの中身
|
+- app2・・・・アプリ2のwebrootの中身
上記のファイル構成の場合に、「http://localhost/app1」で、アプリ1が動作。「http://localhost/app2」でアプリ2が動作するようにします。
cakephp1.2をダウンロードして解凍します。解凍してできたフォルダの「cake」フォルダを、「c:\home」フォルダにフォルダごとコピーします。
「app」フォルダを「c:\home\apps」フォルダにコピーし、フォルダ名を「app1」に変更。同じように「app」フォルダをコピーして、「app2」に変更します。
「app1」「app2」の中にある「webroot」フォルダの中のファイルを「c:\xampp\htdocs」フォルダの「app1」「app2」フォルダの中にそれぞれコピーします。


次に、「.htaccess」の設定を行います。「c:\xampp\htdocs\app1」フォルダにある、「.htaccess」をテキストエディタなどで開き、以下の行を追加します。
RewriteBase /app1
「c:\xampp\htdocs\app2」フォルダにある、「.htaccess」をテキストエディタなどで開き、以下の行を追加します。
RewriteBase /app2
次に、「c:\xampp\htdocs\app1」フォルダにある「index.php」を編集します。
define('ROOT', 'c:\home\apps'); //アプリを配置しているルートディレクトリを指定します。
define('APP_DIR', 'app1'); //アプリフォルダを指定します。
define('CAKE_CORE_INCLUDE_PATH', 'c:\home'); //cakeフォルダを配置したディレクトリを指定します。「c:\xampp\htdocs\app2」フォルダにある「index.php」も上記の要領でで編集します。
define('ROOT', 'c:\home\apps'); //アプリを配置しているルートディレクトリを指定します。
define('APP_DIR', 'app2'); //アプリフォルダを指定します。
define('CAKE_CORE_INCLUDE_PATH', 'c:\home'); //cakeフォルダを配置したディレクトリを指定します。以上で設定完了です。
http://localhost/app1 にアクセスしてみるとcakeが動作していることを確認できます。

CakePHP1.2-betaでbakeでデータベースの設定ファイルを作成する
環境としては、xamppを標準でインストールし、apacheのrewriteの設定を行った状態です。
htdocs直下にcakephpをコピーしました。
bakeも1.1の頃とは随分変わっていますのでまとめておきます。
1.appフォルダに移動する
2.bakeコマンド実行
上記を実行すると、下記のようになります。
3.データベースの設定ファイルを作成
データベースの設定ファイルを作成してくださいといわれますので、とりあえずは[default]のままエンターを押します。
4.使用するデータベースを設定
mysqlを使用しますので、このままエンターを押します。
次もそのままエンターを押します。
データベースのURLを設定します。今回はこのままエンターを押します。
次もポートは標準ですので、そのままエンターを押します。
次はmysqlのユーザ名を設定します。開発環境ですのでこれもこのままエンターを押します。
次はパスワードを入力します。特に設定しない場合はこのままエンターを押します。
設定しないでエンターを押すと、本当に設定しなくて良いですか?ときいてきますので、「y」と入力してエンターを押します。
次はデータベース名を設定します。mysqlにすでにtestDBがありますので、それを使用します。「test」と入力してエンターを押します。
テーブルにprefixを設定する場合は入力します。今回はそのままエンターを押します。
データベースの文字コードを設定します。utf-8でいきますので、「utf8」と入力してエンターを押します。
次もそのままエンターを押します。
コレで良いですか?と確認がでますので、エンターを押します。
データベース設定をまだ作成しますか?ときいてきますので、「n」を入力してエンターを押します。
これで、データベースの設定ファイルができあがりました。
htdocs直下にcakephpをコピーしました。
bakeも1.1の頃とは随分変わっていますのでまとめておきます。
1.appフォルダに移動する
C:\>cd xampp\htdocs\app
2.bakeコマンド実行
C:\xampp\htdocs\app>..\cake\console\cake bake
上記を実行すると、下記のようになります。
Welcome to CakePHP v1.2.0.6311 beta Console
---------------------------------------------------------------
App : app
Path: C:\xampp\htdocs\app
---------------------------------------------------------------
Your database configuration was not found. Take a moment to create one.
Database Configuration:
Name:
[default] >
3.データベースの設定ファイルを作成
データベースの設定ファイルを作成してくださいといわれますので、とりあえずは[default]のままエンターを押します。
4.使用するデータベースを設定
mysqlを使用しますので、このままエンターを押します。
Driver: (db2/firebird/mssql/mysql/mysqli/odbc/oracle/postgres/sqlite/sybase)
[mysql] >
次もそのままエンターを押します。
Persistent Connection? (y/n)
[n] >
データベースのURLを設定します。今回はこのままエンターを押します。
Database Host:
[localhost] >
次もポートは標準ですので、そのままエンターを押します。
Port?
[n] >
次はmysqlのユーザ名を設定します。開発環境ですのでこれもこのままエンターを押します。
User:
[root] >
次はパスワードを入力します。特に設定しない場合はこのままエンターを押します。
Password:
>
設定しないでエンターを押すと、本当に設定しなくて良いですか?ときいてきますので、「y」と入力してエンターを押します。
The password you supplied was empty. Use an empty password? (y/n)
[n] > y
次はデータベース名を設定します。mysqlにすでにtestDBがありますので、それを使用します。「test」と入力してエンターを押します。
Database Name:
[cake] > test
テーブルにprefixを設定する場合は入力します。今回はそのままエンターを押します。
Table Prefix?
[n] >
データベースの文字コードを設定します。utf-8でいきますので、「utf8」と入力してエンターを押します。
Table encoding?
[n] > utf8
次もそのままエンターを押します。
Table schema?
[n] >
コレで良いですか?と確認がでますので、エンターを押します。
---------------------------------------------------------------
The following database configuration will be created:
---------------------------------------------------------------
Name: default
Driver: mysql
Persistent: false
Host: localhost
Port:
User: root
Pass:
Database: test
Table prefix:
Schema:
Encoding: utf8
---------------------------------------------------------------
Look okay? (y/n)
[y] >
データベース設定をまだ作成しますか?ときいてきますので、「n」を入力してエンターを押します。
Do you wish to add another database configuration?
[n] >
これで、データベースの設定ファイルができあがりました。
newマークのバグ修正
newマークが関係のないカテゴリにまでついてしまうのを修正しました。
paginationのバグ
1.2系からページネーション機能が標準としてあります。オプションによってAjax化も可能です。
で、このAjax化に問題が。cakeのajaxヘルパーでリンクタグなどを画面に出力すると、それぞれに「link{ランダムな数値}」というIDが割り振られます。
ランダムな数値なのが問題で、paginationをAjax化しているときにページ遷移していると、まれにこのIDが被ってしまうことがあります。
ajaxヘルパーの189行目あたりに以下のような文があります。
これを、以下のようにすることでとりあえずこの問題は回避できました。
で、このAjax化に問題が。cakeのajaxヘルパーでリンクタグなどを画面に出力すると、それぞれに「link{ランダムな数値}」というIDが割り振られます。
ランダムな数値なのが問題で、paginationをAjax化しているときにページ遷移していると、まれにこのIDが被ってしまうことがあります。
ajaxヘルパーの189行目あたりに以下のような文があります。
if (!isset($htmlOptions['id'])) {
$htmlOptions['id'] = 'link' . intval(rand());
}これを、以下のようにすることでとりあえずこの問題は回避できました。
if (!isset($htmlOptions['id'])) {
$htmlOptions['id'] = 'link' . uniqid();
} CakePHP1.2系のセッション問題
1.2系からなのか、1.1系からなのかは調べてないのでわかりませんが、1.2系で認証情報などをセッションに保持しておき、いろいろと操作をしているとログアウト状態になることが何度もありました。
色々調べてみた結果、1.2系のセッションセキュリティレベルをhighにしていると、接続のたびに現在のセッションを破棄して、新しいセッションを確立するらしい。
で、この処理が途中で止まったり、処理の途中で再度アクセスされたりした場合にセッション情報が消えてしまうようです。
これは、セッションハイジャックなどセキュリティを考慮した仕様であるようなので、セキュリティレベルをmediumにしておけばとりあえずこの現象は回避できる。
若干セキュリティレベルが下がってしまいますが、1つの処理を実行中に他の処理をさせないように制御するよりは楽です。
色々調べてみた結果、1.2系のセッションセキュリティレベルをhighにしていると、接続のたびに現在のセッションを破棄して、新しいセッションを確立するらしい。
で、この処理が途中で止まったり、処理の途中で再度アクセスされたりした場合にセッション情報が消えてしまうようです。
これは、セッションハイジャックなどセキュリティを考慮した仕様であるようなので、セキュリティレベルをmediumにしておけばとりあえずこの現象は回避できる。
若干セキュリティレベルが下がってしまいますが、1つの処理を実行中に他の処理をさせないように制御するよりは楽です。
CakePHP1.2で1アクションで複数のデータを登録する方法
テキストエリアからのデータを受け取り、改行で区切って配列にセットしています。それをループし、配列分データを登録しています。
if ($this->data) {
$this->Movie->begin();
$array = split("rn", $this->data['Movie']['list']);
foreach ($array as $d) {
if (trim($d)) {
$this->data['Movie']['url'] = $d;
$this->Movie->create();
$this->Movie->save($this->data);
}
}
$this->Movie->commit();
$this->flash('登録しました。', '/movies');
} ツリーを閉じた状態にする方法
プラグインのJavascriptの113行目辺りに以下のような記述があります。
「new YAHOO.widget.TextNode」の部分でツリーを作成しています。
以下のように変更してください。(赤い文字)
for (var i = 0; i < categoryObj.length; i++) {
var node = new YAHOO.widget.TextNode(categoryObj[i].group + "(" + categoryObj[i].count + ")", tree.getRoot(), true, true);
if (categoryObj[i].category && categoryObj[i].category.length > 0) {「new YAHOO.widget.TextNode」の部分でツリーを作成しています。
以下のように変更してください。(赤い文字)
for (var i = 0; i < categoryObj.length; i++) {
var node = new YAHOO.widget.TextNode(categoryObj[i].group + "(" + categoryObj[i].count + ")", tree.getRoot(), false, true);
if (categoryObj[i].category && categoryObj[i].category.length > 0) { 






