西川和久の不定期コラム

「去年からSNS作ってます!」




blue.jp

 2005年の1月、『Blogサーバーの引越し(中?)』という記事を書き、最終的にsbと言うブログエンジンを使い、自前でブログサーバーを構築した。現在もそのまま運営しているが、実はあの話には続きがある。

 その後、SNSにも興味を持ち、今話題のmixiやGREEはもちろん、米国のMy Space.comなども会員になり、それなりに遊んでいたのだが、何か違う……。ではブログ同様、自前でサーバーを上げ、カスタマイズすればと、オープンソースのSNS、OpenPNEも試してみたがこれも趣向に合わない。「自分の欲しいSNSが無いなら一から作るか!(笑)」と始めだしたのが、このblueプロジェクトだった。

Text by Kazuhisa Nishikawa


●もう少し仕事にも使えるSNSが欲しい

 実際SNSに参加している人も多いと思うが、機能的には日記、メッセージ、コミュニティ、この3つが大きな柱となり、加えて写真やスケジュール、レビューなども組み込まれている。そして登録制ではなく、会員からの紹介制で成り立ち、[友人]や[友人の友人]と言ったリレーションをベースに、いろいろなコンテンツの[公開][非公開]が選択できる仕掛けもSNSの大きな特徴だ。

 一通り遊んだところで思ったのは「これ、友人同士の雑談だけでなく、ワークグループ的な仕事にも使えば便利かも!?」という事だった。実際そうした使い方をしているユーザーもいる様だが、現実として以下の様な問題点が挙げられる。

  1. [非公開コミュニティ]や[下位コミュニティ]が持てない
  2. スケジュール機能が弱い
  3. 日記のカテゴリは[日記]1つしかなく、公開レベルが1つに固定される
  4. 写真のセキュリティが甘過ぎる
 といった感じだ。部分的にこの条件を満たすSNSはあると思うが全てクリアしているものは無い(と思う)。[非公開]コミュニティとは参加者しか存在が解らないステルス・コミュニティのこと。何かのプロジェクトを行うとき、その存在自体が解ってしまうと都合が悪いケースも考えられる。また、個人専用や本当に仲のいい友人だけで非公開コミュニティを作り、全てのリソースをそこへ集中させることも可能だ。

 [下位コミュニティ]は、例えばコミュニティ名を「××会社」とした場合、下位コミュニティに「東京本店」「大阪支店」など、関連するコミュニティを下位層に持てる機能だ。カメラの部屋、デジタル、銀塩でもいい。検索は上位コミュニティのみ対象にすれば、既存のコミュニティとの兼ね合いもあまり考慮する必要が無くなる。スケジュールは、Ajaxが盛んな昨今、Googleカレンダーとまでは行かないものの、それに近い機能を持ちたい。

 日記に関しては普段ブログを使っていると、さすがにカテゴリが[日記]1つしかないのはいささか辛い。やはり複数のカテゴリを持った上で、それぞれのカテゴリに公開レベルを[ネットに公開][全体][友人まで][友人の友人まで][参加しているコミュニティのみ]など設定したいところだ。これができれば[日記]は全体に公開、[愚痴]は友人まで、[日報]は非公開コミュニティ参加者のみが読めるなどと書き分けることができる。

 最後は写真に関するセキュリティの甘さだ。筆者はてっきり公開レベルに合わせて写真は保護されているものだと思っていたのだが、掲載しているページではなく、画像へのURLを直接ブラウザから入力すると何とログインしなくても表示してしまうのだ。つまりネットに公開しているのと同じ事。何かの拍子に他のサイトへ写真のURLが載ってしまうと誰でも見ることができてしまう。SNSというクローズドな世界の中にあるデータが外の世界で丸見えなのは大問題だと思う。

 これらをもとに、新しいSNSを作るべく企画書(メモ!?)を書いたのが2005年の春先だった。運良く賛同者が集まり軍資金もできたのでblueプロジェクトにGOサインが出た。

●現在のblue

 システム的な話は後回しにして、まずは現在のblueの特徴的な画面キャプチャを並べたのでご覧頂きたい。blue.jpのドメイン名に合わせ、明るめのブルーを基調にシンプルなデザインへ仕上げた。

現在のログイン画面
現在のログイン画面
[ネットに公開]している日記から最新10件をログインする前の画面で表示し、レビューで紹介されているものは15件、公開レベルとは無関係に商品だけ並べた。RSS配信も同様だ
ログイン直後の[home]画面
ログイン直後の[home]画面
自分のポータルに相当する部分。色々な新着一覧が出ている。5(標準)件~最大20件まで[設定変更]で調整可能。またdojoというJavascriptライブラリを使い、各項目ドラッグ&ドロップで並び替えができる
他の人が見た時の[Top]画面
他の人が見た時の[Top]画面
公開している日記、フォトアルバム、ファイル、投票、今日の予定、紹介文などが、相手とのリレーションで表示が変化する。この部分は現在各5件に固定。友人一覧は最近ログインした順で並んでいる
Ajax化したスケジューラ
Ajax化したスケジューラ
ブルーが自分の予定、オレンジは友人の予定(標準設定)、ピンクが参加してるコミュニティのイベント、緑は特定の友人だけ色指定できる機能。ドラッグ&ドロップやリサイズなどで予定の変更が可能
コミュニティの[Top]画面
コミュニティの[Top]画面
下位コミュニティの存在が解る。また、会員のコミュニティだけに公開している、日記、フォトアルバム、ファイル、投票、今日の予定などもあれば一覧で表示される。いろいろな属性に関しては、オーナーが設定する
フォトアルバム
フォトアルバム
階層化可能なフォトアルバム。写真の公開属性に関してはフォトアルバム単位で行う。ファイルに付いても同様だ。サムネイルをクリックすると長辺最大640ドットまでの画像が表示される。オリジナルは長辺2,048ドットまで
メッセージ
メッセージ
一般的なウェブメールの機能をほぼ全て持っている。今後の課題としては、スケジュールの次にAjax化したい部分である。準備が出来次第、ID@blue.jpで普通にpop/smtpでもアクセス可能になる予定だ
日記の管理画面
日記の管理画面
多くのSNSとは違い、レビューは日記の1カテゴリになっている。レビューにチェックすると、フォトアルバムから写真を選ばず、Amazonからの商品写真を選択できる様になる。日記管理もAjax化したい部分だ
日記の一覧表示
日記の一覧表示
どちらかと言えば普通のブログっぽく見える。写真は幅の関係から3枚まで。早いタイミングで[ネットに公開]している日記については、外部からブログとしてアクセス出来る様にしたい

 画面キャプチャには入りきらなかったが、[友人管理]というものがあり、そこで友人個別の新着の表示/非表示、スケジュールにオーバーラップ表示する/色の変更/しないなど、友人の数が増えて来たとき整理するための機能も入っている。キャプションに書いたdojoというJavascriptライブラリは最近導入したものだ。まだblueの一部にしか使っていないもののAjaxにも対応し(スケジュールは独自仕様)、Widgets形式でいろいろな部品を簡単に埋め込んでいくことが可能だ。まだテスト版であるが更にスプレッドシートWidgetsまで存在する。今後こういったアプリケーションを組み込めるのも魅力的である。

 ファイルに関しては仕事で使うのならどうしても欲しい機能だ。ただ無制限にしてしまうといろいろ問題が発生する可能性があるので、1ファイル最大2MBまでとした。これならばオフィス系のちょっとしたファイルは保管でき、音楽は一曲入れるにも容量不足。丁度いいサイズだ。冒頭で問題にしたファイルや写真のセキュリティはきっちり確保している。外部からはもちろん、内部からでもログイン中でかつ公開レベルのリレーションが一致しない限り、URLを直接入れても絶対に表示できない様、サーブレットでリダイレクトする形式をとった。ただセキュリティを確保できた分、サムネイル1枚表示するのも、その画像にセットしている公開レベルと、今見ている人のリレーションを調べているため、データベースにはそれなりの負担がかかている。

 このblue、ネット上で汎用的に使うのが前提であったが、社内のLANへ設置しコミュニケーションツールとして使うのも面白いと思う。現時点ではシステムもコンパクトにまとまっているため、数百人程度までの規模であれば、ノートPCに少し多めにメモリを搭載すれば十分動く環境となる。日記を日報、コミュニティを部や課、プロジェクトなどに置き換えれば、グループウェアとして欠けているのは会議室予約程度だろう。

 と、今だからこそさらりと書けるが、実はこの約半年大変な日々だったのだ……。

●ベースはJavaとOracle

 現在、多くのSNSはPHPやPerlで書かれている。だからJavaを使ったというわけではなく、開発を担当した会社がJava屋だったので、「そう言えばJavaで書かれたSNSは見たこと無いし、面白いかも!」的な乗りで採用。この頃の筆者は企画とマシン環境の維持だけが役割だったのでコーディングとは無関係。アイディアが実現するのであれば開発言語には拘っていなかったのだ。また、データベースは、持っていたOracle 8i(UltraSPARC 4CPUライセンス for Solaris)を使うことになった。アプリケーションサーバーは当初、eXo platformを使いプロトタイプを組んでいたが、夏頃Sun Java Application Server Platform Editionに変更、実際にプロトタイプが動き出したのは2005年の秋過ぎだった。

SUN Enterprise 420R
SUN Enterprise 420R
真ん中の大きいマシンが、SUN Enterprise 420R。UltraSPARC II/450MHz×4、メモリ4GB。Oracle 8iが動いていた。約6年前ならエンタープライズサーバーだったのだが今となっては……。
当時のログイン画面
当時のログイン画面
既に画面キャプチャがこれしか残っていない。NetBeans 5.0のMac版から起動したところ。SNSにありがちなパネル1枚のログイン画面だ。写真は昔ハワイで撮ったもの。blueのイメージとピッタリだった
当時の[Home]画面
当時の[Home]画面
まだ全くデザインが入らずほとんど素の状態。[No Photo]の写真を何時も入れ替えて遊んでいた。今とは似ても似つかないものの、既にちょっと懐かしい。画面から[投票]と[ファイル]の機能もあることが解る

 丁度1年ほど前の状態が上の写真や画面キャプチャの通りである。機能面で一通り動き出したので身内のごく数人ほどで実験運用し2005年が終了。しかし、明けて2006年。いろいろな環境が激変した。

●10年ぶりにソースコード書いてます

 2006年に入り、諸事情から開発会社が抜けてしまいソースコードは筆者の管理となった。と言って次の開発会社も見つからずズルズル時間だけが経過……。もともと筆者はプログラマであったものの、スキルは10年前で止まっている。最後に書いたコードは、昔懐かしいViper VLBの日本語Windows 3.0ビデオドライバまで。つまりC言語は解るが、C++やオブジェクト指向、まともなデータベースすら触っていない。blueに関しては画面周りのJSPはちょっと触っていたがお遊び程度。JavaやSQLなどとても扱える代物では無かった。

 しかし自分でやる以外手段が無く、既存のコードを眺め、インターネットで検索しながら一から勉強し始めた。まず開発環境の構築からだ。先の画面キャプチャでNetBeans 5.0になっているが、もともとはBorland JBuilder 2005が使われていた。有料ということもあり、他の環境へ乗り換え。Eclipse、Sun Java Studio Creator 2、NetBeans 5.0と片っ端からチェックし、デバッグ環境まで含めNetBeans 5.0に落ち着いた。さすがにアプリケーションサーバーも純正ということもあり、組み合わせがバッチリだったのだ。自力でWARを出せる様になったのが今年の2月末だった。ソースコードは大小合わせて700本弱。1人で全て把握するにはギリギリの範囲だ。

Eclipse
Eclipse
Javaの開発環境ならこちらの方が一般的かも知れない。はじめの環境設定が面倒であるが、動き出せば非常に快適だ。ただデバッグが出来なかったので採用しなかった
Sun Java Studio Creator 2
Sun Java Studio Creator 2
当時の知識では何をどうやっても正常にWARが作れなかった。今なら出来るかも知れないがもう環境を固定してしまったのでノーチェックとなっている
NetBeans 5.0
NetBeans 5.0
最終的にこのNetBeansに決まった。現在は5.5βで開発している。しかも開発環境はiMac。ベースがUnixなのでWindowsよりいろいろ便利だからである

 ここからが地獄の特訓開始! 何しろ動いているのはベースの部分だけ。機能が足らないのは当然として、セキュリティ面も甘いまま。やった部分をざっと挙げると、ブラウザの[戻る]で戻れない対策、LDAP対応、携帯対応、セキュリティ強化、スケジュールのAjax対応、RSS対応、画面デザイン、XSS脆弱性対策、部分的にドラッグ&ドロップ可能にしユーザビリティの向上、いろいろなブラウザに対応すべくJavascriptやHTMLの調整、その他テストユーザーの意見を取り入れた細かい機能追加とバグ修正……と、JavaやSQLを勉強しつつOSの環境もチューニング。気の遠くなる作業だった。但し、スケジュールのAjax化は筆者が手に負える代物ではなかったので、DOS/V Super Driversなどで一緒に仕事をしたLeptonに協力してもらった。

 開発時に非常に役に立ったのが、当時β版だったVMware Serverである。ベースとなるOSをある時期からCentOSへ変更し、そのタイミングで全ての環境をVMware Server上へ構築した。理由はいたって簡単。何かの拍子に環境が壊れても、スナップショットを再ロードすれば直ぐ元に戻る上、OSのインストールは既にある仮想マシンの仮想HDD数GBをコピー1発で完了。複数の仮想マシンも1台のPCから全て面倒が見れる。時間も手間もかからないのだ。

VMware Server 1
VMware Server 1
VMware Management Interfaceの画面。全部で4つの仮想マシンがある。マシンはDELL Power Edge 4600。Xeon 2.2GHz×2に4GBのメモリ、500GB/RAID1を搭載
Sun Java Studio Creator 2
VMware Server 2
仮想マシンの1つでLDAP Serverを構成。同時にLDAPに対応しているqpopperとpostfixも動いている。ホストOSはWindows 2003 Serverを使用した
Oracle 10g XE
Oracle 10g XE
後述するOracle 10g XEをOracle8iの代用で使えるか? の実験用に作った仮想マシン。この環境はノートPCでデモ用にも使った。全てゲストOSはCentOS 4が入っている

 8月まではこの環境に写真、ファイル、メール関連のストレージ用として1TBのNASを接続し動かしていたが、今はリアルサーバーとなっている。

 当たり前の話であるがblueからは一銭も稼ぎはなく、撮影や原稿、その他通常の仕事をやりつつなので、ここ半年空いた時間は全てblueに。自分は何屋なのか解らなくなっていた(笑)。そうこうしている間に、テストユーザーの枠を広げ現在約100人でテスト運用中だ。

●Oracle 8iからOracle 10g Express Editionへ変更!?

 実はつい最近、日記の画面キャプチャからも解るようにOracle 8iからOracle 10g Express Edition(Oracle 10g XE)にデータベースを変更した。このあたりの事情に詳しい人なら「それは無いだろう……」と言う話になると思うが、これには理由がある。Oracle 10g XEは、Oracle 10gのフリーバージョンで商用利用もOK。ただし1CPU、メモリ(SGAとPGAの合計)1GB、データファイル4GBの制限(物理的マシンにリソースがあっても使わない)がかかっている。片や2つ前のバージョンとは言えUltraSPARC×4まで以外は無制限のものだ。ところがこのUltraSPARC限定が一番厳しかったのだ。

 現在手元にあるマシンはSUN Enterprise 420R(UltraSPARC II/450MHz×4)。これにGigabit Ethernetを付けて使っていたものの、マシンが遅くそもそも1GBの転送速度が出なかった。データベースの転送速度が遅いのは致命的で結果、blue全体の動きに切れが全く無い。ではアプリケーションサーバーなど全てのサーバーを420R 1台に乗せ、localhostで接続すれば転送速度はそれなりに稼げるが、今度はJSPのプリコンパイルなどに途方もない時間がかかってしまう。いずれにしても遅いのだ。 条件を満たす最新のマシンだとSun Fire Tシリーズがあげられるが、まだ真っ赤のシステムに100万円を軽く超える物を購入する予算は既に無い。遅いまま使い続けるか? いっそPCサーバーにデータベースを移行しようか? の決断が必要になる。

 そこで発表当初から平行してテストで使ってきたOracle 10g XEの登場となる。確かに制限はあるものの、データ容量は4GB。blueではそのほとんどがテキストデータしか入っておらず、インスタンスも1つ。10月末の段階で会員約100人、毎日書き込みがあるアクティブユーザーは10%(これについてはパソコン通信時代から全体の5~10%という定説がある)、データはたったの10MBだ。単純計算で4万人、控えめに見積もってもデータファイルに関しては1万人まで耐えられる計算となる。いずれにしてもこの規模になると現状のPCサーバーや環境ではパワー不足で総入れ替え、それなりの予算が必要だ。本物のOracle 10gを購入するのも何とかなるだろう。ある意味賭けではあるが、Oracle 10g XEを使ったこの手のサイトも(多分)無く、話題性という意味では面白いのではないだろうか!? このOracle 10g EX、もともとの設定はAL32UTF8(全角だと3byte必要)なのだが、VARCHAR2の最大値4,000byteでは日記として使うのに若干不足気味なので、JA16SJIS(全角で2byte)でcreate databaseし直している。

●まだまだ欲しい機能が一杯

携帯の[home]画面

携帯の[home]画面
パケット代を考慮しデザイン上は画像を一切使っていない

 今日時点で既に普通に使える段階になっており、特に全コンテンツに設定可能な公開レベルやスケジュールの評判はかなり良い。小規模であるがα版として一般公開しているので、事実上、本記事が最初のプレスリリースにもなる。このタイミングで一定期間に限り、登録制にすれば会員数は稼げるものの、本来のリレーションが崩れてしまうため現状維持で通す事にした。興味のある方は筆者や既存ユーザーに連絡して頂ければ幸いである。

 現在最大の課題は、携帯電話から写真投稿できない、筆者がいないと誰もメンテナンス出来ない、この2点だ。前者に関してはPCがメインで携帯がサブ的な扱いであれば十分な機能を持っている。しかし携帯だけのユーザーはさすがに写真が登録できないのでは面白くないと思い、登録画面側であえて対応していない。また筆者がいないとトラブルなどの対応が全くできないのも問題だ。撮影など早朝から出掛けてしまうと1日戻らないなど日常茶飯事。この手のサイトとしては致命的だろう。

 とは言え、ここには書けないblueをベースにした更なるアイディアはいろいろあり、もっと積極的に機能拡張を行いたい。しかしリソースが不足しているもの事実。まずはこれを何とかしたいところだ。協力者求む!

□blue.jpのホームページ
http://blue.jp/
□関連記事
【2005年1月27日】【西川】Blogサーバーの引越し(中?)
http://pc.watch.impress.co.jp/docs/2005/0127/nishikawa.htm

バックナンバー

(2006年10月30日)

[Text by 西川和久]


【PC Watchホームページ】


PC Watch編集部 pc-watch-info@impress.co.jp ご質問に対して、個別にご回答はいたしません

Copyright (c) 2006 Impress Watch Corporation, an Impress Group company. All rights reserved.