開発のための情報
このページでは,開発に関する情報を記述します.
チェックアウトの方法
どなたでも下記の方法でチェックアウト出来ます.
svn co http://dev.tyzoh.jp/svn/secure-sbm/Secure-SBM/trunk Secure-SBM
ライセンスについて(事前に必ず確認ください)
svn は subversion のコマンドです.以下のコマンドでインストールします(Linux).
yum -y install subversion
- Subversion によるバージョン管理 ( http://subversion.bluegate.org/)
- Subversion ドキュメント & ファイル ( http://subversion.tigris.org/)
開発者について
Secure-SBM に関連して公開しているソフトウェアの開発は主にメンテナと開発メンバーによって行われています.各役割は次の通りです.
- メンテナ
開発方針の決定,メンテナンス,レビューを行います.
- 開発メンバー
メンテナンス,レビューを実施します.
開発に参加するには
まずは,チケットにパッチ/コードを投稿することから始めてみてください.投稿の前には,既に同種の問題/拡張がチケット登録されていて作業中でないかどうかを必ず確認をしてください.
投稿されたパッチ/コードは.メンテナおよび開発メンバーによりレビューされた後,投稿者に対してフィードバックされます. 必ずしもソースコードリポジトリに取り込まれるわけではありませんが,取り込まれる場合はメンテナが手を加えることがあります.
To Do リスト
- To Do リストはチケットで管理しています.詳細は「未解決チケット(マイルストーン別)」をご覧ください.
開発環境
「Secure-SBM のインストール」にしたがって,動作環境を構築します.基本的にはこの環境で開発が行えます.
開発時には Apache を使用せず,./script/securesbm_server.pl を使用して動作テストを行います.
サーバの立ち上げ方法
展開したディレクトリにある "./script/securesbm_server.pl" を実行する.
./script/securesbm_server.pl
標準ではポート 3000 で待ち受ける.
ファイル変更後,自動的にリロードする方法
securesbm_server.pl スクリプトに "-r" オプションをつけて起動する.
./script/securesbm_server.pl -r
./lib/SecureSBM/Controller/Root.pm などを変更すると,サーバーが自動的にリスタートする.
データベースへの要求を表示させる方法
環境変数 DBIC_TRACE=1 を設定することで,データベースへの select 文などを表示する.
export DBIC_TRACE=1 ./script/securesbm_server.pl
あるいは
env DBIC_TRACE=1 ./script/securesbm_server.pl
クライアント ブラウザ
クライアントに使用するブラウザは Firefox と Intenet Expoler を想定している. いずれのブラウザでも表示や動作のテストを行うことが望ましいが,いずれかのブラウザのみの環境しかない場合には,他の開発メンバなどに要請し,他のブラウザでのテストを行わなければならない.
Firefox の動作テストでは,「ツール」→「エラーコンソール」でエラーコンソールを表示し,エラーがないことを確認する.ただし,ブラウザに依存したコードなどのために,エラーが発生する場合には,動作に影響がないことを確認するとともに,ソースコードにその旨をコメントで明示する.
javascript 機能を off にしたブラウザは対象としない.Secure-SBM ではそのようなブラウザに対しての配慮までは行いません.
ネーミング/プログラミングコンベンション
Perl
- 内部で使用する関数(Private)は,関数名の先頭にアンダースコア(_)をつける.
- 関数の名前は 動作+オブジェクト名 を基本とし,動作は小文字,オブジェクト名は頭文字を大文字にする.
- 関数の終了部分(}) の後ろにはコメントで "# end of functionName()" と記述する.
javascript
- 共通関数,wrapping 関数は ssbm.js に格納し,すべてアンダースコア(_)で始める.
- 関数の名前は 動作+オブジェクト名 を基本とし,動作は小文字,オブジェクト名は頭文字を大文字にする.
- 関数の終了部分(}) の後ろにはコメントで "// end of functionName()" と記述する.
Catalyst の基本
ソースコードツリー
ソースコードのツリーは,Catalyst (catalyst.pl) によって作成されたディレクトリ構造をそのまま使用している.
SecureSBM
|-- Build.PL ---- catalyst.pl によって作成されるファイル.変更なし.
|-- COPYRIGHT ---- 本プロダクトの Copyright.
|-- Changes ---- catalyst.pl によって作成されるファイル.変更なし.
|-- LICENSE ---- 「Rinza公衆使用許諾契約書」
|-- LICENSE.en ---- 「Rinza公衆使用許諾契約書」の英語版
|-- Makefile.PL ---- catalyst.pl によって作成されるファイル.変更なし.
|-- README ---- 「Rinza公衆使用許諾契約書」に関する記述.
|-- createPostgreSQLTables.sql ---- データベーステーブルを作成するための SQL コマンドのスクリプト.
|-- dropPostgreSQLTables.sql ---- データベーステーブルを削除するための SQL コマンドのスクリプト.
|-- mod_perl.conf ---- Apache2 から呼び出す場合に apache に設定するためのファイル.
|-- registbookmark.javascript ---- 簡単にブックマークするための javascript.popup バージョン.
|-- registbookmark_nopopup.javascript ---- 簡単にブックマークするための javascript.popup しないバージョン.
|-- securesbm.yml ---- 全体の初期設定用 YAML ファイル.
|-- showPostgreSQLTables.sql ---- データベーステーブルを表示させるための SQL コマンドスクリプ.
|-- lib ---- catalyst.pl によって作成される,perl モジュールを格納するためのディレクトリ.
| |-- SecureSBM ---- catalyst.pl によって作成されるディレクトリ.
| | |-- Controller ---- catalyst.pl によって作成されるコントローラ用ディレクトリ.
| | | |-- Admin.pm ---- admin が使用するページのコントローラ.
| | | |-- Login.pm ---- ログイン用のコントローラ.
| | | |-- Logout.pm ---- ログアウト用のコントローラ.
| | | |-- Noauth ---- 認証を必要としないページへのコントローラを格納するディレクトリ.
| | | | |-- Bookmark.pm ---- 最新ブックマーク一覧を表示するためのコントローラ.
| | | | `-- Profile.pm ---- プロファイルを表示するためのコントローラ.
| | | |-- Personal.pm ---- パーソナルホーム等の個人ページを表示するためのコントローラ.
| | | `-- Root.pm ---- / に対するコントローラ.
| | |-- Model ---- catalyst.pl によって作成されるモデル用ディレクトリ.
| | | `-- SecureSBMDB.pm ---- securesbm_create.pl によって作成されたファイル.
| | `-- View ---- catalyst.pl よって作成されるビュー用ディレクトリ.
| | `-- TT.pm ---- securesbm_create.pl によって作成されたファイル.
| |-- SecureSBM.pm ---- SecureSBM の初期設定を行うためのファイル.
| |-- SecureSBMDB ---- データベースのスキームを格納するためのディレクトリ.
| | |-- Adminstatus.pm ---- adminstatus テーブル用のスキーム定義モジュール.
| | |-- Bookmark.pm ---- bookmarks テーブル用のスキーム定義モジュール.
| | |-- Information.pm ---- information テーブル用のスキーム定義モジュール.
| | |-- Role.pm ---- roles テーブル用のスキーム定義モジュール.
| | |-- RoleOwner.pm ---- role_owners テーブル用のスキーム定義モジュール.
| | |-- Sideinfo.pm ---- sideinfo テーブル用のスキーム定義モジュール.
| | |-- Tag.pm ---- tags テーブル用のスキーム定義モジュール.
| | |-- User.pm ---- users テーブル用のスキーム定義モジュール.
| | |-- UserBookmark.pm ---- user_bookmarks テーブル用のスキーム定義モジュール.
| | |-- UserBookmarkRole.pm ---- user_bookmark_roles テーブル用のスキーム定義モジュール.
| | |-- UserBookmarkTag.pm ---- user_bookmark_tags テーブル用のスキーム定義モジュール.
| | |-- UserProfile.pm ---- user_profile テーブル用のスキーム定義モジュール.
| | `-- UserRole.pm ---- user_roles テーブル用のスキーム定義モジュール.
| `-- SecureSBMDB.pm ---- データベーステーブル定義用モジュール.
|-- root ---- catalyst.pl によって作成される,静的な参照ディレクトリ.
| |-- favicon.ico ---- Secure-SBM 用アイコン
| |-- static ---- 静的な設定を格納するディレクトリ.
| | |-- css ---- CSS ファイルを格納するディレクトリ.
| | | `-- style.css ---- Secure-SBM に関するスタイルシート.
| | |-- images ---- 画像を格納するディレクトリ.
| | | |-- SSBM-logo.png ---- Secure-SBM のロゴ画像.
| | | `-- bullet1.png ---- 列挙の際のヘッダ画像.
| | `-- js ---- javascript を格納するためのディレクトリ.
| | `-- ssbm.js ---- 共通 javascript 関数を格納するファイル.
| `-- template ---- テンプレートを格納するディレクトリ.
| |-- admin ---- admin 用テンプレートのディレクトリ
| | |-- admin.tt ---- /admin 用テンプレート.
| | |-- admin_center.tt ---- /admin 中央部のテンプレート.
| | |-- information.tt ---- お知らせ編集用テンプレート
| | |-- information_center.tt ---- お知らせ編集用中央部のテンプレート
| | |-- listbookmarks.tt ---- ブックマークリストのテンプレート
| | |-- listbookmarks_center.tt ---- ブックマークリストの中央部のテンプレート
| | |-- listroles.tt ---- ロールリストのテンプレート
| | |-- listroles_center.tt ---- ロールリストの中央部のテンプレート
| | |-- listtags.tt ---- タグリストのテンプレート
| | |-- listtags_center.tt ---- タグリストの中央部のテンプレート
| | |-- listusers.tt ---- ユーザリストのテンプレート
| | |-- listusers_center.tt ---- ユーザリストの中央部のテンプレート
| | |-- setproxy.tt ---- proxy 設定用のテンプレート
| | `-- setproxy_center.tt ---- proxy 設定用の中央部のテンプレート
| |-- bottom.tt ---- ページ下部のテンプレート
| |-- default.tt ---- エラーページのテンプレート
| |-- htmlfoot.tt ---- HTML フッタ部分のテンプレート
| |-- htmlhead.tt ---- HTML ヘッダ部分のテンプレート
| |-- index.tt ---- 標準テンプレート
| |-- index_center.tt ---- 標準の中央部のテンプレート
| |-- left.tt ---- 標準(共通)の左サイドメニューのテンプレート
| |-- right.tt ---- 標準(共通)の右サイドメニューのテンプレート
| |-- login.tt ---- ログイン用テンプレート
| |-- login_center.tt ---- ログイン用中央部のテンプレート
| |-- noauth ---- 認証を必要としないページへのテンプレートを格納するディレクトリ
| | |-- bookmark.tt ---- ブックマーク一覧のテンプレート
| | |-- bookmark_center.tt ---- ブックマーク一覧の中央部のテンプレート
| | |-- profile.tt ---- プロファイル用のテンプレート
| | |-- profile_center.tt ---- プロファイル用の中央部のテンプレート
| | |-- userprofiles.tt ---- ユーザプロファイル一覧用のテンプレート
| | `-- userprofiles_center.tt ---- ユーザプロファイル一覧用の中央部のテンプレート
| |-- personal ---- ログイン後の個人用テンプレートを格納するディレクトリ
| | |-- changepassword.tt ---- パスワード変更のテンプレート
| | |-- changepassword_center.tt ---- パスワード変更の中央部のテンプレート
| | |-- editprofile.tt ---- プロファイル編集用のテンプレート
| | |-- editprofile_center.tt ---- プロファイル編集用の中央部のテンプレート
| | |-- getregistbookmark.tt ---- GET を用いてブックマークを登録した場合のテンプレート
| | |-- personal.tt ---- パーソナルホームのテンプレート
| | |-- personal_center.tt ---- パーソナルホームの中央部のテンプレート
| | |-- prepareregistbookmark.tt ---- ブックマーク登録準備のテンプレート
| | `-- prepareregistbookmark_center.tt ---- ブックマーク登録準備の中央部のテンプレート
| `-- top.tt ---- ページ上部のテンプレート
|-- script ---- catalyst.pl によって作成されるディレクトリ
| |-- securesbm_cgi.pl ---- catalyst.pl によって作成される cgi 用スクリプト.変更なし.
| |-- securesbm_create.pl ---- catalyst.pl によって作成される構築用スクリプト.変更なし.
| |-- securesbm_fastcgi.pl ---- catalyst.pl によって作成される fastcgi 用スクリプト.変更なし.
| |-- securesbm_server.pl ---- catalyst.pl によって作成されるサーバ起動用スクリプト.変更なし.
| `-- securesbm_test.pl ---- catalyst.pl によって作成されるテスト用スクリプト.変更なし.
`-- t ---- catalyst.pl によって自動的に作成されるテスト用ディレクトリ.
| ディレクトリ下のファイルは secuersbm_create.pl によって作成される.
|-- 01app.t
|-- 02pod.t
|-- 03podcoverage.t
|-- Controller
| |-- Admin.t
| |-- Login.t
| |-- Logout.t
| |-- Noauth-Bookmark.t
| |-- Noauth-Profile.t
| |-- Personal.t
| `-- Root.t
|-- Model
| `-- SecureSBMDB.t
`-- View
`-- TT.t
(tree コマンドの出力を修正したものです)
テンプレートの構造
T.B.D.
DOM 構造
T.B.D.
インクルード関係
すべてのテンプレートは,メニューなどの表示を共通化するため,共通部分のテンプレートをインクルードしている.
以下は index.tt のインクルード関係を示したものである.
index.tt
|- top.tt
| `- htmlhead.tt
|- left.tt
|- index_center.tt
|- right.tt
`- bottom.tt
`- htmlfoot.tt
それぞれのメインとなるテンプレート(上の例では index.tt)は,同様の構造を持ち,基本的に center 部のテンプレート(上の例では index_center.tt)を変更する.
例えば,admin.tt を使用する場合は index.tt と同様の構造で index_center.tt の部分を admin_center.tt として INCLUDE する.(top.tt, bottom.tt, left.tt, right.tt は基本的にそのまま使用する.)
データベースの構造と関連性
T.B.D.
データベースのテーブルは,大きくわけてブックマークのための「基本テーブル」と関係性を記述するための「関係記述テーブル」および管理の設定を行うための「管理用テーブル」の三つにわけられる.
基本テーブル
- users テーブル
user_id SERIAL, user_email TEXT NOT NULL, user_password TEXT, user_name TEXT, user_surname TEXT, PRIMARY KEY(user_id), UNIQUE (user_email) - roles テーブル
role_id SERIAL, role_name TEXT NOT NULL, role_refcount INTEGER DEFAULT 1, PRIMARY KEY(role_id), UNIQUE (role_name) - bookmarks テーブル
bookmark_id SERIAL, bookmark_uri TEXT NOT NULL, bookmark_title TEXT NOT NULL, bookmark_refcount INTEGER DEFAULT 1, PRIMARY KEY(bookmark_id), UNIQUE (bookmark_uri) - tags テーブル
tag_id SERIAL, tag_name TEXT NOT NULL, tag_refcount INTEGER DEFAULT 1, PRIMARY KEY(tag_id), UNIQUE (tag_name)
関係記述テーブル
- user_roles テーブル
user_role_id SERIAL, user_id INTEGER, role_id INTEGER, PRIMARY KEY(user_role_id, user_id, role_id), FOREIGN KEY(user_id) REFERENCES users(user_id), FOREIGN KEY(role_id) REFERENCES roles(role_id) - user_tags テーブル (Ver. 0.3 で追加)
user_tag_id SERIAL, user_id INTEGER, tag_id INTEGER, PRIMARY KEY(user_tag_id, user_id, tag_id), FOREIGN KEY(user_id) REFERENCES users(user_id), FOREIGN KEY(tag_id) REFERENCES tags(tag_id) - user_bookmarks テーブル
user_bookmark_id SERIAL, user_id INTEGER, bookmark_id INTEGER, user_bookmark_ts TIMESTAMP WITH TIME ZONE DEFAULT now(), user_bookmark_comment TEXT, PRIMARY KEY(user_bookmark_id), FOREIGN KEY(user_id) REFERENCES users(user_id), FOREIGN KEY(bookmark_id) REFERENCES bookmarks(bookmark_id) - user_bookmark_tags テーブル
user_bookmark_tag_id SERIAL, user_bookmark_id INTEGER, user_bookmark_ts TIMESTAMP, /* Ver. 0.3 で追加 */ user_id INTEGER, /* Ver. 0.3 で追加 */ bookmark_id INTEGER, /* Ver. 0.3 で追加 */ tag_id INTEGER, PRIMARY KEY(user_bookmark_tag_id, user_bookmark_id, tag_id), FOREIGN KEY(user_bookmark_id) REFERENCES user_bookmarks(user_bookmark_id), FOREIGN KEY(user_id) REFERENCES users(user_id), /* Ver. 0.3 で追加 */ FOREIGN KEY(bookmark_id) REFERENCES bookmarks(bookmark_id), /* Ver. 0.3 で追加 */ FOREIGN KEY(tag_id) REFERENCES tags(tag_id) - user_bookmark_roles テーブル
user_bookmark_role_id SERIAL, user_bookmark_id INTEGER, user_bookmark_ts TIMESTAMP, /* Ver. 0.3 で追加 */ user_id INTEGER, /* Ver. 0.3 で追加 */ bookmark_id INTEGER, /* Ver. 0.3 で追加 */ role_id INTEGER, PRIMARY KEY(user_bookmark_role_id, user_bookmark_id, role_id), FOREIGN KEY(user_bookmark_id) REFERENCES user_bookmarks(user_bookmark_id), FOREIGN KEY(user_id) REFERENCES users(user_id), /* Ver. 0.3 で追加 */ FOREIGN KEY(bookmark_id) REFERENCES bookmarks(bookmark_id), /* Ver. 0.3 で追加 */ FOREIGN KEY(role_id) REFERENCES roles(role_id) - role_owners テーブル
role_owner_id SERIAL, role_id INTEGER, user_id INTEGER, PRIMARY KEY(role_owner_id, role_id, user_id), FOREIGN KEY(role_id) REFERENCES roles(role_id), FOREIGN KEY(user_id) REFERENCES users(user_id)
管理用テーブル
- user_profiles テーブル
user_profile_id SERIAL, user_id INTEGER, user_profile_publish INTEGER DEFAULT 0, user_profile_nickname TEXT, user_profile_nickname_publish INTEGER DEFAULT 0, user_profile_surname TEXT, user_profile_name TEXT, user_profile_name_publish INTEGER DEFAULT 0, user_profile_birthday DATE, user_profile_birthday_publish INTEGER DEFAULT 0, user_profile_age_publish INTEGER DEFAULT 0, user_profile_email TEXT, user_profile_email_publish INTEGER DEFAULT 0, user_profile_introduce TEXT, user_profile_introduce_publish INTEGER DEFAULT 0, user_profile_updatetime TIMESTAMP WITH TIME ZONE DEFAULT now(), PRIMARY KEY(user_profile_id, user_id), FOREIGN KEY(user_id) REFERENCES users(user_id) - informations テーブル
information_id SERIAL, information_title TEXT, information_content TEXT, information_date DATE, information_ts TIMESTAMP WITH TIME ZONE DEFAULT now(), information_publish INTEGER DEFAULT 0, PRIMARY KEY(information_id) - sideinfos テーブル
information_id SERIAL, information_title TEXT, information_content TEXT, information_date DATE, information_ts TIMESTAMP WITH TIME ZONE DEFAULT now(), information_publish INTEGER DEFAULT 0, PRIMARY KEY(information_id) - adminstatus テーブル
adminstatus_id SERIAL, adminstatus_info_start INTEGER, adminstatus_info_num INTEGER, adminstatus_sideinfo_start INTEGER, adminstatus_sideinfo_num INTEGER, adminstatus_proxy TEXT, PRIMARY KEY(adminstatus_id), UNIQUE (adminstatus_proxy)
Ajax に関する Perl 側関数の動作
getTitle() : Path('/gettitle')
引数として bookmark_url を渡し,text でそのページのタイトルを返す.
XML での応答は未実装.
getTags() : Path('/gettags')
XML フォーマットでユーザの使用しているタグ一覧を返す.
全体は <tags></tags>,タグのそれぞれのエントリは <tagentry></tagentry>で,<id></id>と<name></name>が含まれる.それぞれデータベース上のタグ ID とタグの名前を表す.
<?xml version="1.0" encoding="UTF-8" ?> <tags> <tagentry> <id>10</id> <name>BBC</name> </tagentry> <tagentry> <id>7</id> <name>ウルトラマン</name> </tagentry> <tagentry> <id>8</id> <name>ウルトラマンメビウス</name> </tagentry> <tagentry> <id>11</id> <name>スタートレック</name> </tagentry> <tagentry> <id>9</id> <name>スーパー戦隊</name> </tagentry> <tagentry> <id>5</id> <name>仮面ライダー</name> </tagentry> <tagentry> <id>4</id> <name>仮面ライダー電王</name> </tagentry> <tagentry> <id>6</id> <name>特撮</name> </tagentry> </tags>
DTD
/gettags によって得られる XML の DTD は以下の通りです.
Version 0.2.x
<!ELEMENT tags (tagentry*)> <!-- 全体のエントリ --> <!ELEMENT tagentry (id,name)> <!-- タグの各エントリ --> <!ELEMENT id (#PCDATA)> <!-- タグの ID 番号 --> <!ELEMENT name (#PCDATA)> <!-- タグの名前 -->
Version 0.3
<!ELEMENT tags (tagentry*)> <!-- 全体のエントリ --> <!ELEMENT tagentry (id,name,tagclass)> <!-- タグの各エントリ --> <!ELEMENT id (#PCDATA)> <!-- タグの ID 番号 --> <!ELEMENT name (#PCDATA)> <!-- タグの名前 --> <!ELEMENT tagclass (#PCDATA)> <!-- タグのクラス Ver. 0.3 で追加 -->
Bookmark
この項目は未実装です.
将来は,Bookmark のリストそのものを XML で返すようにする予定だが,現在は,テンプレートを用いた HTML の出力となっている.
DTD
この項目は未実装です.
Proxy の利用
proxy を利用して Web ページのタイトルを自動的に取得する.現在は次のように動作している.
- proxy を使用せず,ページの取得を試みる.
- proxy なしで取得に失敗した場合,proxy を経由してページの取得を試みる.
これは社内ネットワークで proxy の内側に Secure-SBM を設置し,内側と外側の両方のページの取得を可能にするため.
将来は net.pac などのスクリプトを読み込むことも考慮するが,現在のところは計画されていない.
ブラウザの PlugIn
この項目は未実装です.
その他の情報
(ブログの内容は開発途中で記述しているため,現在の実装とは異なっている場合があります.)
バグの報告と要望
バグ(不具合)を見つけたり,改善したい点などの要望やアイディアがある場合は「バグ報告/要望」を読んで報告してください.
