スタッフブログ
XOOPS Cube日本サイトのニュースのページから新着情報を見ることが多いのですが、一昨日この中にXOOPS汎用データベースモジュール 0.1リリースというニュースがありました。
汎用データベース(以下汎用DB)とは何かと言うと、名前の通り、どんな用途にでも使えるデータベース、ということになります。
Accessとか使ったことがある方は、あれをXOOPS上で行うものだと思えばわかりやすいと思います。
項目を自由に定義して、そこに自由にデータを入力することができます。社員名簿、出欠記録、売上記録、商品リストなど、様々な用途で利用することができます。
XOOPSでは既にwaffleという汎用DBモジュールが存在しますが、選択肢が増えるのはいいことなので、今回はこちらを試してみたいと思います。
とあるきっかけで、IIS上でXOOPS Cube Legacy(以下XCL)を試すこととなりましたので、「XCL on IIS」と銘打って、今回から複数回に渡って色々と書いてみたいと思います。
今回は動作予定の環境などについて書こうと思います。
OSには、つい最近リリースされたWindows Server 2008 R2を選択しましたので、IISのバージョンは7.5となります。
このバージョンを選んだ主な理由は、先日に開催されたPHPカンファレンス2009でマイクロソフト株式会社の奥主さんが発表していた内容に興味を覚えたからだったりします。
こちらのブログにも書かれていますが、マイクロソフトさんはPHPに対して強力に支援していくとのことですので、IISでXCLを動かすことが今後増えていく可能性がありそうです。
作ったのはXOOPSユーザのランク画像等を表示するためのプラグインです。
・ユーザのランク情報を表示する ryus_user_rankプラグイン
ユーザメニューなら下記のような感じで使えます。
<img src="<{$block.uid|ryus_user_rank}>" title="<{$block.uid|ryus_user_rank:"title"}>" />
<{$block.uid|ryus_user_rank}> あるいは <{$block.uid|ryus_user_rank:"image"}> で画像URL
<{$block.uid|ryus_user_rank:"title"}> でランク名
XOOPSユーザのuidさえSmarty変数にアサインされていれば、ランク画像表示ができますので他に使えそうなところがあればいろいろためしてみてください。
また、短時間でサクッとつくれそうなプラグインがあったら作ってみますね。
「オープンソースカンファレンス???」と思われる方は
オープンソースにまつわるいろんな団体が参加する、お祭り!
と思っていただければと思います。あ、オープンソースというのはフリーソフトのように自由に使えるソフトウェアというようなもの、、です。
RYUSではこのところスタッフが力を注いで作成している「ITXOO(あいてぃずー)」という名前の商品を展示しています。
お手持ちの定期券に使われている交通系ICカード、携帯電話に付いているICカード、その他色々なところに付いているICカードを利用してタイムカードの替わりに打刻できるというシステムです!
開発するきっかけとなったのは実はRYUSでタイムカード管理するのが面倒だなぁということでした!
最初は〜
何もしてなくて…でも社労士さんがちゃんとつけないといけない、というから
反省して
入り口に置いた紙に各自が書いて…うーでもめんどくさいし、つけ忘れちゃう。それに時刻の計算も手作業で、、昭和の会社か!とつっこみたいような状況でした
めんどくささに負けて、いよいよモジュール化
めんどくさがりやが管理してますので、手計算もすぐに限界になりました。かといって今更、がっちゃん!っていうのも…。てことでモジュール化を考えました。ICリーダーからの読み込みも考えましたがドライバが見つからず、とりあえず手持ちのバーコードリーダーで読み取る形のタイムカードモジュールを作成して運用を開始。
RYUS初の商品に!
モジュール化してからずっと使い続けていました。RYUSで商品を作ってみよう!と話をしてるときに「じゃぁタイムカードモジュールを商品に」ということになりました。せっかくなのでICカードを読み込んでハード付きでかっこよく♪ということで今の形に
というようなストーリーです。いよいよ11月には発売となります。
会場では皆さん試していただき
「お〜!便利ですね」
「インストールが不要で各自のパソコンから参照したり管理できるのがいい♪」
と好評です。
オープンソースカンファレンスは明日まで開催されていますから、遊び気分で是非RYUSの商品 ITXOO を触りに来てください♪
その過程を連載記事としてブログに書いていこうと思います。
さて、作るサイトは身内なのですが、自分の弟のサイトです。
彼はストリートで音楽を演奏したりライブをやったりと音楽活動をしているので
そういった事を載せるサイトにしていけたらと思います。
まず、レンタルサーバーをどこにするかを検討します。
参考
XUGJのレンサバ放浪記
候補
XREA
CORESERVER
ヘテムル
さくらインターネット
といった所でしょうか。XREAとCORESERVERは自分のサイトで使ったことあります。
ヘテムルもちょっと使ったことがあるので候補に。
あとは知名度と評判でさくらインターネット、プランは当然安いタイプになりますが。
こんな感じで候補を考えていたのですが、弟と話していたら、まずXREAの無料サーバで試して
できてきたら、ドメイン取得やXREAの有料化またはサーバー移転等すれば良いのじゃないか?
という話に落ち着きました。小さく始めて育てていこうと思います。
次回予定
XOOPSインストール
今日HTML5の新機能であるWeb Databaseを仕事で使えないかなーと調べてみたので、
簡単に使い方をコードで紹介したいと思います。
<script>
var db = openDatabase("sample", "1.0", "Sample database", 1024 * 1024);
function createTable() {
db.transaction(function(tx) {
tx.executeSql(
"CREATE TABLE IF NOT EXISTS users( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(64) NOT NULL);",
null,
insertData,
function() {
alert("CREATE 失敗");
}
);
});
}
function insertData(tx) {
tx.executeSql(
"INSERT INTO users(name) VALUES(?);",
["hamaco"],
findData,
function() {
alert("INSERT 失敗");
}
);
}
function findData(tx, rs) {
tx.executeSql(
"SELECT * from users WHERE id = ?",
[rs.insertId],
function(tx, rs) {
document.body.innerHTML = rs.rows.item(0)["name"];
},
function() {
alert("SELECT 失敗");
}
);
}
createTable();
</script>
上記コードを実行すると、Safariのデータベースデバッグ用の画面で以下の様にデータが入っているのを確認することができます。
CREATE,INSERT,SELECTの3つを行なっているだけですが、executeSqlメソッドが非同期で動作する為、このように面倒くさいコードになってしまいます。
ただ、現在Web Databaseが動作するのはSafari4しかなく、他のブラウザでは動作しないので結局仕事には使えませんでした。
たいていは、「CTRL+Cを押して、コマンドを中断してやりなおす」か、「BSキーを適度に連打して、再度入力」という方法をとると思います。
が、一旦中断するのは面倒だし、BSキーもどれだけ押せばいいかわからないので、不便です。
こういった場合は、「CTRL+uを押す」と、入力中の内容をすべて削除できます。
間違えたかも。と思った時はあわてずにCTRL+uを押して再度入力すると、あの入力内容が見えない画面も怖くなくなると思います。
こんにちわ。 なおとです。
開発では、なにごともやってみて初めて分かるということがあるものです。 今回は、あるコンテンツに対して「HEADリクエストを送って存在確認をする」、というスクリプトを(PHPで)書いた時の話です。
マニュアルにはレスポンスが正常な場合(200 OK)の例が掲載されています。 これが、リダイレクトするコンテンツの場合には、少々様子が異なってきます。
結果を書いてしまうと、「get_headers()はリダイレクトを辿って複数のリクエストを行う」ということを知りました。 私は「HTTP HEADの結果に係わらず、1回だけリクエストして、その結果を返す」という動作を(勝手に)想像していたのですが、違いました。
動作を確認するために以下のような、リダイレクトを数回繰り返すサンプルを用意しました。(redirect.php)
<?php $req = $res = $_SERVER['REQUEST_URI']; if (preg_match('/[^\w\:\/\.]/i', $req)) { echo 'wrong request.'; } else { if (strpos($req, '.php') === (strlen($req) - 4)) { $res = $res . '/'; } if (!strpos($req, '1111')) { $res = $res . '1'; header('Location: ' . $res); } else { echo htmlspecialchars($req, ENT_QUOTES, 'UTF-8'); } }
これを、get_headers()を使って結果を見ます。(別のスクリプトです)
<?php var_dump(get_headers('http://localhost/redirect.php', 1));
その結果が以下になります。
※分かりやすくするために、一部を編集しました
array 0 => string 'HTTP/1.1 302 Found' (length=18) 1 => string 'HTTP/1.1 302 Found' (length=18) 2 => string 'HTTP/1.1 302 Found' (length=18) 3 => string 'HTTP/1.1 302 Found' (length=18) 4 => string 'HTTP/1.1 200 OK' (length=15) 'Date' => array 0 => string 'Tue, 13 Oct 2009 06:38:51 GMT' (length=29) 1 => string 'Tue, 13 Oct 2009 06:38:51 GMT' (length=29) 2 => string 'Tue, 13 Oct 2009 06:38:51 GMT' (length=29) 3 => string 'Tue, 13 Oct 2009 06:38:51 GMT' (length=29) 4 => string 'Tue, 13 Oct 2009 06:38:51 GMT' (length=29) 'Server' => array 0 => string 'Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch' (length=xxx) 1 => string 'Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch' (length=xxx) 2 => string 'Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch' (length=xxx) 3 => string 'Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch' (length=xxx) 4 => string 'Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch' (length=xxx) 'X-Powered-By' => array 0 => string 'PHP/5.2.4-2ubuntu5.7' (length=20) 1 => string 'PHP/5.2.4-2ubuntu5.7' (length=20) 2 => string 'PHP/5.2.4-2ubuntu5.7' (length=20) 3 => string 'PHP/5.2.4-2ubuntu5.7' (length=20) 4 => string 'PHP/5.2.4-2ubuntu5.7' (length=20) 'Location' => array 0 => string '/redirect.php/1' (length=15) 1 => string '/redirect.php/11' (length=16) 2 => string '/redirect.php/111' (length=17) 3 => string '/redirect.php/1111' (length=18) 'Content-Length' => array 0 => string '0' (length=1) 1 => string '0' (length=1) 2 => string '0' (length=1) 3 => string '0' (length=1) 4 => string '18' (length=2) 'Connection' => array 0 => string 'close' (length=5) 1 => string 'close' (length=5) 2 => string 'close' (length=5) 3 => string 'close' (length=5) 4 => string 'close' (length=5) 'Content-Type' => array 0 => string 'text/html' (length=9) 1 => string 'text/html' (length=9) 2 => string 'text/html' (length=9) 3 => string 'text/html' (length=9) 4 => string 'text/html' (length=9)
get_headers()の第2引数に「1」をセットしなかった場合は、もっと混沌とした結果になっていましたが、省略します。
それと今回は、自分自身にリダイレクトするスクリプトで実験しました。 異なるサーバ/スクリプトに跨ってリダイレクトを辿った場合は、レスポンス・ヘッダーの内容も異なると思われますので、もう少し複雑な結果になります。
これを受けて、「Locationの結果、行き着くコンテンツ」は次のように取得できることがわかります。 ただし、URLの解決(絶対URLに直す処理)は端折っています。 あと実際のコードでは、エラー処理など適宜しています。
<?php $url = 'http://localhost/redirect.php'; $headers = get_headers($url, 1); $location = $headers['Location']; if (is_array($location)) { $location = array_pop($location); } if ( (strpos('/', $location) === false) and (strpos('http', $location) === false) ) { $location = dirname($url) . '/' . $location; } echo "original: {$url} \n redirected: {$location} \n";
以上です。
あまり使いやすくはないとの評判だったEvernoteのWindowsクライアントですが、先月末に3.5のbeta版がリリースされ、今までとはだいぶ使い勝手が変わったとのことで、早速試してみました。
ダウンロードはこちらから行えます。
過去バージョンが入っている場合は、起動時に昔のDBをコピーするかどうか聞かれます。
早速起動してみたところ、
何かエラーが出てしまいました。
しかしキャンセルすると普通に使えるようになりました。betaなので仕方ないのでしょうか。
モザイクだらけでわかりにくいですが、今までの画面とは大幅に変わっているのがわかります。
相変わらず日本語での検索ができませんが、文字入力も前ほど重くなく、ようやく実用できるレベルが見えてきた感じです。
Lifehacking.jpの記事によると、来年中に日本語化を行うということで、文字認識や検索も使えるようになると思うので、非常に楽しみです。
ちなみに3.5のbetaはあくまでbetaなので、ご利用は自己責任でお願いします。
今のところ、FirefoxのEvernoteアドオンが正常に動かなくなる等の問題があるようです。
この台風18号ですが、ブログを書いている現時点では東北にあるとのことで、オフィスの窓から外を見ても雨や風はおさまっているようです。
幸いなことに、RYUSのスタッフにはこの台風で怪我をしたりした人はいなかったのですが、台風は日本列島の各地に被害を出しながら縦断していったそうで、被害に遭われた地域の復旧が少しでも早く進むことをお祈り申し上げます。
明日以降は、台風一過ということで暫くは良い天気が続くそうなので、週末などを使ってどこかに出かけてみようかと思います。
旅行などには行けないと思いますが、何か面白い体験が出来た場合は、次回のブログに書くかも知れません