開発のための情報

このページでは,開発に関する情報を記述します.

チェックアウトの方法

どなたでも下記の方法でチェックアウト出来ます.

svn co http://dev.tyzoh.jp/svn/secure-sbm/Secure-SBM/trunk Secure-SBM

ライセンスについて(事前に必ず確認ください)

svn は subversion のコマンドです.以下のコマンドでインストールします(Linux).

yum -y install subversion

開発者について

Secure-SBM に関連して公開しているソフトウェアの開発は主にメンテナと開発メンバーによって行われています.各役割は次の通りです.

メンテナ

開発方針の決定,メンテナンス,レビューを行います.

開発メンバー

メンテナンス,レビューを実施します.

開発に参加するには

まずは,チケットにパッチ/コードを投稿することから始めてみてください.投稿の前には,既に同種の問題/拡張がチケット登録されていて作業中でないかどうかを必ず確認をしてください.

投稿されたパッチ/コードは.メンテナおよび開発メンバーによりレビューされた後,投稿者に対してフィードバックされます. 必ずしもソースコードリポジトリに取り込まれるわけではありませんが,取り込まれる場合はメンテナが手を加えることがあります.

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 ページのタイトルを自動的に取得する.現在は次のように動作している.

  1. proxy を使用せず,ページの取得を試みる.
  2. proxy なしで取得に失敗した場合,proxy を経由してページの取得を試みる.

これは社内ネットワークで proxy の内側に Secure-SBM を設置し,内側と外側の両方のページの取得を可能にするため.

将来は net.pac などのスクリプトを読み込むことも考慮するが,現在のところは計画されていない.

ブラウザの PlugIn

この項目は未実装です

その他の情報

(ブログの内容は開発途中で記述しているため,現在の実装とは異なっている場合があります.)

バグの報告と要望

バグ(不具合)を見つけたり,改善したい点などの要望やアイディアがある場合は「バグ報告/要望」を読んで報告してください.


トップページに戻る