7 東京エリア Debian 勉強会予約システムの構想

上川純 一

PIC
____________________________________________________________________

7.1 背景

東京エリア Debian 勉強会では「えんかい君」 を予約システムとして利用していました。 えんかい君はシンプルなユーザインタ フェースで認証もなく、 全員のメールアドレスと名前が閲覧でき、 他人の登録を誰でも削除できるなど、 利用者を信頼したモデ ルになっていました。 後で立ち上がった関西では cotocoto を利用していました。 cotocoto は DFSG の観点では non-free な サービスです。

「えんかい君」 は YLUG などでも利用されていましたが、 不便でした。 東京では、 「えんかい君」 の制限を回避するた め、 課題の提出をメール経由でやっていました。 当初はフリーフォーマットのメールをLATEX形式に上川 がバッチで変換する形式をとっており、 のちにLATEXのソースコードをメールで git format-patch で送 るという運用になっていました。 ただ、 Git で課題提出をしていても、 マージが面倒という問題点がありま した。

2009 年 12 月の勉強会登録には実験的に atnd を利用しました。 atnd は DFSG non-free なサービスですが、 最近流行して いる勉強会等の予約システムです。

DFSG 準拠のアプリケーションのほうが望ましいが、 「えんかい君」 ではうまく運用できないということと、 アプリケーショ ン自体はシンプルな問題であることが予想されたため、 自前で勉強会予約システムを準備してみることにしま した。

7.2 実装目標

Debian 勉強会の予約システムでは何が必要でしょうか。

他にもいろいろあるかもしれませんが、 とりあえずこういうものを目標にしてやってみました。

そして、 DFSG Free であることが望ましいです。

7.3 開発環境の準備

7.3.1 App Engine Python SDK の準備

今回はウェブアプリケーションのフレームワークとして、 Python 版の Google App Engine を利用しました。 開発環境を Debian GNU/Linux sid 上で準備する方法を紹介します。

まず、 Debian GNU/Linux sid の環境を用意します。

次に、 Google App Engine の Python 版の開発環境をダウンロードします。 Google App Engine のサイ ト*18 に いって最新の SDK をダウンロードしてきます。

「Linux/その他のプラットフォーム」 向けの google_appengine_1.3.1.zip をダウンロードしてきま した。

# apt-get install unzip python python-openssl python-webtest python-yaml
$ wget http://googleappengine.googlecode.com/files/google_appengine_1.3.1.zip
$ unzip google_appengine_1.3.1.zip

これでインストールは完了です。 Google App Engine のインストールディレクトリを ./google_appengine, App Engine アプリケーションのソースコードのおいている場所を ./utils/gaeとします。 utils/gae ディレクトリにから dev_appserver.pyを実行すれば、 開発用のウェブサーバが起動します。

hoge@core2duo:appengine/utils/gae$ ../../google_appengine/dev_appserver.py .
INFO     2010-02-16 15:28:08,816 appengine_rpc.py:159] Server: appengine.google.com
Allow dev_appserver to check for updates on startup? (Y/n): n
dev_appserver will not check for updates on startup.  To change this setting, edit /home/hoge/.appcfg_nag
WARNING  2010-02-16 15:28:13,792 datastore_file_stub.py:623] Could not read datastore data from /tmp/dev_appserver.datastore
WARNING  2010-02-16 15:28:13,906 dev_appserver.py:3581] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
INFO     2010-02-16 15:28:13,914 dev_appserver_main.py:399] Running application debianmeeting on port 8080: http://localhost:8080
7.3.2 テストの実行方法

Django の通常のアプリケーションはテスト用の仕組みがあるようなのですが、 appengine にはないようです。 ここでは、 WebTest モジュールを利用して自動テストコードを実装しています。

$ PYTHONPATH=../../google_appengine:../../google_appengine/lib/django/ \
 python testSystem.py

7.4 実装

PIC

7.4.1 認証の仕組み

このアプリケーションでは Google App Engine を利用しています。 ユーザ認証は Google App Engine で標準で提供される Google の認証を流用しています。 パスワードの管理やユーザのメールアドレスの管理などをフレームワークに一任することで 管理を簡単にしています。

7.4.2 データベースの構造

バックエンドのデータベースには、 AppEngine の Datastore を利用しています。 Event と、 Attendance と UserRealName というのを定義しています。

Event は主催者がイベントについて登録した情報を保持しています。 イベント毎に存在しています。

Attendance はユーザがイベントに登録したという情報を保持しています。 イベントに対して登録したユーザの数だけ存在し ます。

UserRealname はユーザの表示名前の情報を保持しています。 各ユーザ毎に存在します。


class Event(db.Model):
    eventid = db.StringProperty()
    owner = db.UserProperty() # the creator is the owner
    owners_email = db.StringListProperty() # allow owner emails to be added if possible
    title = db.StringProperty()
    location = db.StringProperty(multiline=True)
    content = db.StringProperty(multiline=True)
    content_url = db.StringProperty()
    prework = db.StringProperty(multiline=True)
    event_date = db.StringProperty()
    timestamp = db.DateTimeProperty(auto_now_add=True)
    capacity = db.IntegerProperty() # the number of possible people attending the meeting

class Attendance(db.Model):
    eventid = db.StringProperty()
    user = db.UserProperty()
    user_realname = db.StringProperty() # keep a cache of last realname entry.
    prework = db.StringProperty(multiline=True) # obsolete, but used in initial version
    prework_text = db.TextProperty() # Used everywhere, populate from prework if available.
    attend = db.BooleanProperty()
    enkai_attend = db.BooleanProperty()
    timestamp = db.DateTimeProperty(auto_now_add=True)

class UserRealname(db.Model):
    """Backup of user realname configuration so that user doesn’t have to reenter that information."""
    user = db.UserProperty()
    realname = db.StringProperty()
    timestamp = db.DateTimeProperty(auto_now_add=True)
7.4.3 ソースコードの構造

ソースコードは現在下記の構成です。

ソース内部からテンプレートファイルが参照されています。

7.4.4 ウェブページの遷移

ウェブページの遷移とソースコードの対応をみてみます。

PIC

7.5 今後の展望

とりあえずは動いています。 今後、 何が変わるべきか。 今後どういう点が実装されるべきか。 パッチウェル カム。 ____________________________________________________________________________________________

PIC Debian 勉強会資料

2010 年2 月20,21 日  初版第1 刷発行
東 京 エ リ ア Debian 勉強会 (編集・印刷・発行)
__________________________