2007年8月10日金曜日

Smartyのディレクトリ構成

Smartyは、以下のようなディレクトリ構成で配置する

<htdocs>
+-- <smartyapplication>
+-- <templates>
+-- <templates_c>
+-- <config>
+-- <cache>



phpをここにおく。
templateは<templates>におく。
とりあえず、今はこれだけ。
<templates_c>は、コンパイルされたファイルが置かれる。

これらのディレクトリをSmartyに教えてあげるには
smartyオブジェクトを生成後に指定すればよい。


// エンジンの指定
require_once('Smarty/Smarty.class.php');

// オブジェクトの作成
$smarty = new Smarty;

// テンプレートファイル
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
$smarty->config_dir = './configs/';

2007年8月8日水曜日

データベース/フィールド/日付時間型


DATE
| TIME
| TIMESTAMP
| DATETIME
| YEAR


*DATE [#w9fa72d8]

mysql> create table d ( d date );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into d values('2007-08-06');
Query OK, 1 row affected (0.02 sec)

mysql> select * from d;
+------------+
| d |
+------------+
| 2007-08-06 |
+------------+
1 row in set (0.00 sec)

mysql> insert into d values(NULL);
Query OK, 1 row affected (0.03 sec)

mysql> select * from d;
+------------+
| d |
+------------+
| 2007-08-06 |
| NULL |
+------------+
2 rows in set (0.00 sec)


mysql> select * from d where d='2007-08-06';
+------------+
| d |
+------------+
| 2007-08-06 |
+------------+
1 row in set (0.00 sec)

mysql> select * from d where d='2007/08/06';
+------------+
| d |
+------------+
| 2007-08-06 |
+------------+
1 row in set (0.00 sec)

-日付の形式は「年-月-日」や「年/月/日」を使える。
-区切り文字は何でも良いようだ。(区切り文字を保存しているわけでない。あくまでも保存しているのは年月日)

mysql> insert into d values('2010@08@30');
Query OK, 1 row affected (0.03 sec)

mysql> select * from d where d = '2010|08:30';
+------------+
| d |
+------------+
| 2010-08-30 |
+------------+
1 row in set (0.00 sec)

*TIME [#tf0eeb6d]
MySQLでは、TIME型は時刻を格納するだけではなく~
時間の間隔を保存できるように-838:59:59~838:59:59の範囲の時間を保存できます。~

mysql> create table t ( t time );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into t values('10:10:10');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t;
+----------+
| t |
+----------+
| 10:10:10 |
+----------+
1 row in set (0.00 sec)


mysql> insert into t values('-838:59:59');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t values('838:59:59');
Query OK, 1 row affected (0.03 sec)

mysql> select * from t;
+------------+
| t |
+------------+
| 10:10:10 |
| -838:59:59 |
| 838:59:59 |
+------------+
3 rows in set (0.01 sec)

-また、時間を日数換算で指定することもできます。但し指定できる範囲は0から33日までです。

mysql> insert into t values('15 5:30:21');
Query OK, 1 row affected (0.03 sec)

mysql> select * from t;
+------------+
| t |
+------------+
| 10:10:10 |
| -838:59:59 |
| 838:59:59 |
| 365:30:21 | ←これが15日(360時間)と5時間30分21秒
+------------+
6 rows in set (0.00 sec)

*TIMESTAMP [#xa619097]

mysql> create table ts ( i int, ts timestamp );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into ts(i) values(1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from ts;
+------+---------------------+
| i | ts |
+------+---------------------+
| 1 | 2007-08-07 16:09:02 |
+------+---------------------+
1 row in set (0.00 sec)


mysql> create table ts2 ( i int, ts1 timestamp, ts2 timestamp );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into ts2(i) values(1);
Query OK, 1 row affected (0.03 sec)

mysql> select * from ts2;
+------+---------------------+---------------------+
| i | ts1 | ts2 |
+------+---------------------+---------------------+
| 1 | 2007-08-07 16:10:47 | 0000-00-00 00:00:00 |
+------+---------------------+---------------------+
1 row in set (0.00 sec)


-2つのtimestamp型が存在した場合は、1つめのフィールドだけに、挿入時、更新時にセットされます。

*DATETIME [#lde9a930]

mysql> create table dt (dt datetime );
Query OK, 0 rows affected (0.09 sec)

mysql> insert into dt values('2007-08-06 16:15:30');
Query OK, 1 row affected (0.03 sec)

mysql> select * from dt;
+---------------------+
| dt |
+---------------------+
| 2007-08-06 16:15:30 |
+---------------------+
1 row in set (0.00 sec)

*YEAR [#a5fbae73]

mysql> create table y ( y year );
Query OK, 0 rows affected (0.09 sec)

mysql> insert into y values('2007-08-30');
ERROR 1265 (01000): Data truncated for column 'y' at row 1
mysql> insert into y values('2007');
Query OK, 1 row affected (0.03 sec)

mysql> insert into y values('1968');
Query OK, 1 row affected (0.03 sec)

mysql> insert into y values('-1');
ERROR 1264 (22003): Out of range value adjusted for column 'y' at row 1
mysql> select * from y;
+------+
| y |
+------+
| 2007 |
| 1968 |
+------+
2 rows in set (0.00 sec)

2007年8月7日火曜日

dfGallery

dfGalleryというフォトスライドショーを使ってみた。
http://www.dezinerfolio.com/2007/06/07/dfgallery/
フロントエンドがFlash, バックエンドがPHPの組み合わせで、
フルスクリーンへの切り替えも可能。
なかなかスムーズでしかもフリーというのが素晴らしい。

重要な特色:
* Flickr、Picasa、Fotki、PhotobucketとCustom Imagesの両方に対応するFlash Gallery。
*「Print Screen」を利用可、不可を設定可能。
* 容易にカスタマイズ可能です。
* 完全なScreenモード。
* RSSとCustom Imagesの両方対応している。
* どんなサイズでも対応。
* バックグラウンドで流れるMP3ファイルを指定可能。
* 複数の言語サポート。
* 新しいアップデートが利用可能であるなら、通知する。
* 無料です。

フリーでこれだけできていれば感謝ですね。
ただ、下に表示されるサムネイルの画像も指定しなければならないのだけれど
勝手にリサイズしてサムネイル画像をつくってくれるとよいのだが。
噴出しに出る画像に合せるとへんな部分(左上の一部?)が表示されている。


o 試してみたフォトスライドショー
+ http://www.iplusone.sakura.ne.jp/photo/dfgallery/

2007年8月5日日曜日

JavaScript

Ajaxのライブラリを調べているうちに、JavaScriptの復習をしておこう。と思った。

JavaScriptが出てきたときは、Webでは使い物にならない言語と酷評されるように
なってしまった。これは言語自体の問題ではなく、時代背景や、その使い方、使われ方に問題があったわけだ。
今では、当たり前のようにライブラリが出回り、ほとんどのサイトでは
JavaScriptがオンでないと使えないという具合に時代は変わったのです。

JavaScript †

* ジャバスクリプト、ジャヴァスクリプト、略称:JS
* スクリプト言語
* 主にWebブラウザ上で動作する。
* HTMLの動的書き換えや入力フォームの自動補完など、Webページの使用感向上を目的として使用されたり、リッチクライアントアプリケーションの構築に使われる。

よくJavaとJavaScriptは同じなの?と聞かれるが
ネーミングが似ているだけである。
これは、wikipediaにも書いてあるが、誕生したとき

* JavaScriptはネットスケープコミュニケーションズのBrendan Eichによって開発され、Netscape Navigator 2.0 で実装された。
* 開発当初は「LiveScript」と呼ばれていた

そうなんだ。最初からJavaScriptではなかった。

* 1995年にSun Microsystems社の開発したプログラミング言語「Java」が当時大きな注目を浴びており、これに便乗したネットスケープ社のマーケティング的な思惑が働き「JavaScript」という名前に変更されたといわれている。

そういうこと。

* 1996年にマイクロソフトのInternet Explorer3.0に搭載される
* その手軽さからJavaScriptは急速に普及していく。

ここから、ザラウザ非互換性の時代がやってくる。独自の拡張が行われ、
同じ記述でも、ブラウザによって表示が変わってしまうなんてことが
当たり前の時代でした。そこで、ブラウザに何が使われているかを判定して
それぞれの記述を書くなんてことをやっていました。

あと、Visual Basicのときにもあったが、敷居が低いので、精通していない開発者が
増えすぎたというのも問題でした。

面白いライブラリを利用してみました。
http://www.iplusone.sakura.ne.jp/SKILLUP/JavaScript/rintaro.html

2007年8月4日土曜日

Ajax

Ajaxは「Asynchronous(エイシンクロナス) JavaScript + XML」の略で、
スクリプト言語のJavaScriptやWeb記述言語のXMLといった技術を
組み合わせて開発する手法を指す。

Ajaxという技術があるのではなく、
動的にWebの表示を変化させるDynamic HTML(JavaScript? + CSS)と、
表示内容を適宜サーバから通信を介して取得するXMLHttpRequest?という、
従来からある標準的な技術を組み合わせで、
より効果的な利用方法を提唱したものを指している。

この技術に対し、米国のJesse James Garrett氏が2005年2月に
「Ajax: A New Approach to Web Applications」というコラム内で、
「Ajax」という分かりやすい名前を付けたことで、この言葉が世界中に広がった。


HTTPのリクエスト&レスポンスという枠を超えて、
インタラクティブな処理を取り入れたり、
スタンドアロンアプリケーションを開発しているかのような感覚になります。

ユーザーインターフェース+非同期通信

従来のWebアプリケーションは、サーバへリクエストを送信した後、レスポンスを新たにWebページとして受け取り、画面遷移が発生していた。
しかし、Ajaxは画面遷移を伴わない動的なWebアプリケーションの製作が実現可能になる。
例えばWeb検索に応用することで、従来は入力確定後にボタンをクリックしてから行っていた検索を、
ユーザがキー入力をする間に(入力されるたびに)非同期でバックグラウンドで行うことで
リアルタイムに検索結果を表示していくといったことが可能になる。


既存技術の組み合わせ

Webブラウザのみで動作する、既存の技術の組み合わせであることが特徴。
基本的な仕組みはJavaScriptだけでかけるので、ブラウザ側が処理を行う。
GoogleがGoogle マップやGoogle サジェストにこの技術を利用したことで有名になり、
Webアプリケーションの可能性を広げた。
Ajaxの実用性がGoogleのWebアプリケーションを通じて世間に認知されはじめ、
今では、業務システムにまで取り入れられようとしている。

2007年8月1日水曜日

各ユーザ別にWebページを公開する場合の設定

httpサーバにはapacheを使っています。
通常はhttpd.confの中でDocumentRootで指定したディレクトリにドキュメント(HTMLファイル等)を配置します。

http://ドメイン名/index.html

のURLの場合、index.htmlは、このDocumentRootで指定したディレクトリにあるindex.htmlのことです。

このほかに、登録ユーザごとに、独立したDocumentRootを指定することも可能です。

Fedora7では、httpd.confは、以下の場所にあります。

/etc/httpd/conf/httpd.conf


httpd.confファイルの場所はディストリビューションやインストール方法によって異なります。

/etc/httpd/conf/      : Fedora CoreなどRed Hat系
/etc/apache2/        : SUSE系
/usr/local/apache2/conf/ : ソースからインストールした場合

などに配置されています。



これを開いて、
ユーザごとのディレクトリを利用する指定と
そのディレクトリ名を指定します。
<IfModule mod_userdir.c>
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
#UserDir disable <---コメントにする

#
# To enable requests to /~user/ to serve the user's public_html
# directory, remove the "UserDir disable" line above, and uncomment
# the following line instead:
#
UserDir public_html <--コメントをはずす

</IfModule>
と編集します。

また、以下の範囲の Directoryセクションのコメントをはずして、AllowOverride, Optionsは以下のように変更します。


<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
AllowOverride FileInfo None
Options SymLinksIfOwnerMatch
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>


各ユーザごとに、以下の処理を行います。

・homeディレクトリにpublic_htmlディレクトリを作成する。
・public_htmlディレクトリに読み込み権限、実行権限を付与します。
・ホームディレクトリは実行権限を付与します。
・SELinuxの制限を解除するために、ラベルを変更します。

/home/ishii を例書くと、以下のようになります。


[ishii@fedora7 ~]$ pwd
/home/ishii
[ishii@fedora7 ~]$ mkdir public_html
[ishii@fedora7 ~]$ chmod o+rw public_html/
[ishii@fedora7 ~]$ chmod o+x ./
[ishii@fedora7 ~]$ /sbin/restorecon -R public_html/

データベース/フィールド/任意精度型

浮動小数点よりも正確な値が必要な場合、非常に大きい値、または非常に小さい値を扱う場合、任意精度型を利用します。


DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
| NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]

* DECIMALもNUMERICも同じです。
* (a)整数部100桁の精度ももつフィールド







CREATE TABLE t1 (d NUMERIC(100));


* (b) (a)をDECIMALで書く







CREATE TABLE t2 (d DECIMAL(100));


* 全体の精度が100桁で、少数桁が10桁であるNUMERIC型







CREATE TABLE t3 (d DECIMAL(110, 10));


* MySQLでは指定した桁数より1桁多い情報を保持する
o NUMBER(5,2)の場合、全体の桁数を6桁、少数桁を2桁で格納できる
* 指定した少数桁よりも小さい値を格納した場合、1桁小さい桁で四捨五入される。
* 最大値や最小値から溢れる値を格納しようとした場合、PostgreSQLはエラーにあんるが MySQLは、エラーにならず、最大値(または最小値)で格納される。

データベース/フィールド/浮動小数点数型


REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
| NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]


MySQLでは、REAL, FLOAT, DOUBLE, DOUBLE PRECISIONは、どれも8バイトで
扱える範囲は、-1e+308~+1e+308です。
UNSIGNEDは符号なし、ZEROFILLは頭を0で埋めます。


mysql> create table d (
-> r real,
-> dp double precision,
-> f8 float8,
-> d double );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into d(r) value(-1e+308);
Query OK, 1 row affected (0.05 sec)

mysql> insert into d(r) value(+1e+308);
Query OK, 1 row affected (0.03 sec)

mysql> insert into d(dp) value(-1e+308);
Query OK, 1 row affected (0.02 sec)

mysql> insert into d(dp) value(+1e+308);
Query OK, 1 row affected (0.03 sec)

mysql> insert into d(f8) value(-1e+308);
Query OK, 1 row affected (0.02 sec)

mysql> insert into d(f8) value(+1e+308);
Query OK, 1 row affected (0.02 sec)

mysql> insert into d(d) value(-1e+308);
Query OK, 1 row affected (0.02 sec)

mysql> insert into d(d) value(+1e+308);
Query OK, 1 row affected (0.02 sec)