-オープンソースのSNSエンジン OpenPNEプロジェクト-

TIPS

Home

OpenPNE3 DBマスタースレーブ分割の設定方法

06 / 15 火曜日 2010

  • TIPS
  • Mamoru Tejima

OpenPNE3では、”設定だけで”MySQLのmaster-slave構成は利用できないようだ。世間のメジャーはまだOpenPNE2なの?

http://twitter.com/donz80/statuses/16214843210

この質問にお答えします。

OpenPNE3のマスタースレーブ分割を利用するためには、 config/database.yml を以下のように設定します。

all:
  slave_1: # スレーブは slave_* という名称で、マスタよりも先に定義しなければならない
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=slave;host=localhost'
      username: root
      encoding: utf8
      attributes: { 164: true }
      priority: 2 # プライオリティ。この例だと、8分の2の確率でスレーブが利用される
  doctrine:  # デフォルト値を master に変更予定だが、 doctrine でも今後動作する
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=master;host=localhost'
      username: root
      encoding: utf8
      attributes: { 164: true }
      priority: 6  # この例だと、 8 分の 6 の確率でマスタが使用される。

参考
http://trac.openpne.jp/ticket/4036

Ustream小窓を作ってみました

04 / 05 月曜日 2010

川原です!

このごろUstreamというのが盛り上がってきているようですね!
近々、日本語での対応も行われるとの事なので、これからさらに盛り上がりそうです。

そんなこともあり、コミュニティの中で配信を告知して遊びたいと考え、ひとまずUstream小窓
を作ってみました。

動作イメージ

Ustreamの配信URL・ビデオURLを貼るだけで上記のように表示されます。

対応しているURLは以下のとおりです。

配信URL

http://www.ustream.tv/channel/文字列
http://www.ustream.tv/文字列

ビデオURL

http://www.ustream.tv/recorded/数字

導入方法

OpenPNE2

導入方法は2つあります。簡単な前者がオススメです。

小窓キャスト

OpenPNE2.12以降では小窓キャストにより、この小窓に対応できます。

管理画面に入り、SNS設定→小窓キャスト設定から以下のURLを登録するだけです。

http://www.openpne.jp/officialcast/www.ustream.tv/cmd/cmd_cast.xml

jsファイルを設置する

小窓キャストを利用しない場合は、自分でjsファイルを設置することにより対応できます。

以下のjsファイルダウンロードし、public_html/cmd/ へ設置して下さい。
(ファイル名は www.ustream.tv.js である必要があります。)

http://www.openpne.jp/officialcast/www.ustream.tv/cmd/www.ustream.tv.js

OpenPNE3

以下のjsファイルダウンロードし、web/cmd/ へ設置して下さい。
(ファイル名は www.ustream.tv.js である必要があります。)

http://www.openpne.jp/officialcast/www.ustream.tv/cmd/www.ustream.tv.js

使い方あれこれ

  • コミュニティイベントの詳細にUstreamのURLをはって、配信イベント
  • UstreamビデオのSNS内での共有

OpenPNE3プラグインで簡単マッシュアップ!

03 / 15 月曜日 2010

  • TIPS
  • 深町 英太郎

OpenPNE開発チームの深町です。

カヤックさんの多すぎるWebサービスの中に、im.kayac.comというサービスがあります。「I’m Kayac? 自己紹介?」とか思ってたんですが、どうやらInstant Messageの略でIMのようです。

im.kayac.comは、APIにリクエストを投げるだけで他のサービスに通知を飛ばせる便利なサービスです。専用のiPhoneアプリを入れることでiPhoneにポップアップ通知をすることができます。ちなみに僕はiPhoneは持っていません。Touchです。

おぉ、なんか便利そうだ。問題は使い道だなぁ。何に使おう。

製品テストにいいかも?

最近、OpenPNE3の単体テストを走らせていたのですが、時間の長いこと長いこと。その間ぼーっとしてるわけにもいかないのでTumblrでせっせとリブログを繰り返しているのですが、気づいたら終わってる。非効率だ。終わったら通知させるようにしよう。

$ symfony test:unit; curl -d ‘message=OpenPNE3 Unit Tests were done.’ http://im.kayac.com/api/post/nitro_idiot

こうして単体テストを走らせておくと、終わったタイミングで御苑で花見をしている僕のiPhoneがピコンとなるわけです。あ、僕はiPhoneは持ってませんでした。Touchです。

とてもクールなサービスですね。

OpenPNEとの連携

以上、im.kayac.comの紹介でした。カヤックでは製品テストが好きなプログラマを募集しています!

…あ、僕はカヤック社員ではありませんでした。OpenPNE開発者です。

やっぱ他社のサービス紹介だけでもあれなのでOpenPNEとの連携でも考えたほうがいいですよねー :p

opImKayacComPluginってのはどう?

普段僕はOpenPNE3のプラグインなんて作らないのですが、「えー、深町さんひょっとして作れないんじゃないですかぁ?きゃははー」とか言われると嫌なのでチュートリアルがてら作ってみたいと思います。いや、作れるんだって!本気出せば!

今回作るのはフレンドが日記を書いたり、自分のにコメントがついたときにim.kayac.comを使ってiPhoneに通知できるようにするプラグイン「opImKayacComPlugin」です。

0. 実装方針

OpenPNE3で使われているフレームワークsymfonyには「イベントディスパッチャ」という機構があります。これは、拡張可能なプログラムを書ける大変クールな機構です。

OpenPNE3ではこの機構を使って、ページの読み込みの前後(正確にはアクションの前後)で、好きなコードを走らせることができます。たとえばopAshiatoPluginでは、メンバーのホーム・日記などを見たときに”あしあと”をつける処理をしています。

今回も同じ要領で、日記の作成のあとにim.kayac.comに通知を投げる処理を加えたいと思います。

1. config.phpでイベントを受け取る

OpenPNEのプラグインを作るときに、必ず実行させたいコードってたまにありますよね。そういうコードは config/config.php に書くといいです。今回イベントのリスナーは必ず追加したいのでここに書きます。

※追記 : 卜部さんから、sfPluginConfigurationを継承するクラスを作ることで、リスナーと処理を一緒のファイルに書けるよ、というアドバイスをもらいました。以下の例ではconfig/opImKayacComConfiguration.class.php というファイルに記述するといいプログラムになるかもしれません。参考 : http://github.com/ebihara/opPluginChannelServerPlugin/blob/master/config/opPluginChannelServerPluginConfiguration.class.php

・config/config.php

<?php

// 日記が書き込まれたら
// opImKayacComListener::listenToPostDiaryCreate()を実行してね
$this->dispatcher->connect(
  'op_action.post_execute_diary_create',
  array('opImKayacComListener', 'listenToPostDiaryCreate')
);

OpenPNEのアクションが実行されると、アクションの前にop_action.pre_execute_{module}_{action}、アクションの後にop_action.post_execute_{module}_{action}という名前のイベントが発生します。これに対してconnect()を使ってリスナーを登録します。listenじゃなくてconnectなのが紛らわしいです。

opImKayacComListenerクラスはまだ作っていないので、この状態だとエラーになりますが、とりあえずここは放っておきましょう。

2. im.kayac.comに通知を投げるには

まずはim.kayac.comに通知を投げる必要があります。im.kayac.comはPOSTメソッドでHTTPリクエストを飛ばせばいいです。PHPからはfile_get_contents()を使います。

  static public function postToImKayacCom()
  {
    $params = array(
      'password' => 'hogehoge',
      'message' => '[op3] うべー',
    );
    $header = array(
      'Content-Type: application/x-www-form-urlencoded',
      'Content-Length: '.strlen($params),
    );
    $options = array(
      'http' => array(
        'method' => 'POST',
        'header' => implode("\r\n", $header),
        'content' => $params,
      )
    );

    file_get_contents('http://im.kayac.com/api/post/nitro_idiot', false, stream_context_create($options));
  }

Notification on iPod touch

うべー。

こういうstaticなユーティリティ関数を使いたい場合は、慣習としてlib/util/にファイルを置きます。ここではlib/util/opImKayacComPluginToolkit.class.phpというファイルを作りました。

さて、いよいよ受け取ったイベントで通知処理をする段階です。

3. opImKayacComListenerクラスを作る

さて、いよいよメインの処理です。といっても大したことをするわけじゃなくて、さっき作ったopImKayacComPluginToolkit::postToImKayacCom()を呼び出して通知するくらいです。

・lib/opImKayacComListener.class.php

<?php

class opImKayacComListener
{
  static public function listenToPostDiaryCreate()
  {
    opImKayacComPluginToolkit::postToImKayacCom('nitro_idiot');
  }
}

ここで通知するユーザの選択もできます。たとえば、自分が日記を書いたときまでiPhoneに通知されたらうざいですよね。その場合は sfContext::getInstance()->getUser()->getMemberId() でアクセスしているユーザのMemberIdを取得して判定することができます。

さぁ、これで日記を投稿すれば僕に通知がくるようになりました。最後まで書いてると上司から肩を叩かれそうなのでチュートリアルはここまで!

まとめ

・必ず実行したいコードは config/config.php に書く
・ユーティリティ関数はlib/util以下に置く
・イベントディスパッチャを使えば既存の機能を簡単に拡張できる

さらに改良するには

ただ、このままだと僕(nitro_idiot)にしか通知を送れません。POSTするURLのユーザ名を引数で受け取ることでそれぞれのユーザに通知することができます。

その場合、それぞれのユーザにim.kayac.comのアカウントを設定させる必要もあります。これはconfig/doctrine/schema.yml に新規テーブルの記述を加えて、config/member_config.yml と lib/form/MemberConfigForm/MemberConfigImKayacComForm.class.php を追加すれば実現できます。

他には日記コメントがついたら知りたい!とか、メッセージをすぐ確認したい!とかにも同じように対応することができます。

今あるOpenPNEのプラグインは、opDiaryPluginとかopMessagePluginとか、大きなものが多いですが、これくらい小さなものでも面白いものが作れるとわかっていただけたでしょうか?

今日作ったプラグインは…

今日作ったopImKayacComPluginはもちろんオープンソースです!

http://github.com/fukamachi/opImKayacComPlugin

この記事のコードからかなり変わっちゃっていますが、原型は同じなので参考にしていただけると幸いです。わからないことがあれば公式SNSやTwitter宛に気軽に聞いてください :)

OpenPNE3でのiPhone対応をたくらんでみる

07 / 01 水曜日 2009

開発チームの川原です。

この前、とあるイベントでOpenPNEはiPhone対応はしないのですか?
というご意見をいただきました。

ということで、週末を使ってiPod touch / iPhone的な
OpenPNE3のインターフェイスを作ってみようかとたくらんでみました。

OpenPNE + iPhone

OpenPNE + iPhone

と、まだログイン画面しか作られていませんが、iPhoneインターフェイスライクなものになっています!

iuiという、iPhone用のライブラリを利用しています。
http://code.google.com/p/iui/

週末を利用して作っているのでペースは遅いかもしれませんが、完成したら
本線の方の取り込みについて考えたいと思います。

https://trac.openpne.jp/svn/OpenPNE3/branches/kawahara/iui
上で作業しているので、興味があったら是非いじってみてください!

*ちなみに、川原はiPhoneや iPod touchを持っていない上に、Mac使いではないのでWindows版のSafariでしか動作検証がされていません。

OpenPNE3 機能対応状況をまとめました

06 / 26 金曜日 2009

開発チームの海老原です。
現時点における OpenPNE3 の機能実装状況をまとめました。

今村さんがまとめてくれたスプレッドシート(OpnePNE3の機能一覧)をアップデートし、更新した項目の備考欄に「○○月対応予定項目」を追記しました。現時点で対応が遅れている項目については、備考欄が赤字になっています。

現時点で対応が遅れている項目は、

  • 日記コメント記入履歴(opDiaryPlugin)
  • 日記メール投稿(opDiaryPlugin)
  • 日記コメントメール投稿(opDiaryPlugin)
  • トピック・イベント検索(opCommunityTopicPlugin)
  • 写真付き書き込み(opCommunityTopicPlugin)
  • メッセージ検索(opMessagePlugin)
  • SNS設定 – お気に入りフィード使用設定(管理機能)
  • SNS設定 – ログイン制限(管理機能)
  • SNS設定 – アフィリエイト用タグ(管理機能)
  • SNS内名称設定(管理機能)
  • 画像・書込み管理(管理機能)
  • 携帯版配色変更(管理機能)

となります。

未実装機能の実装やプラグイン開発にご協力いただける方は、こちらのエントリをご覧ください。一緒に OpenPNE 3 を盛り上げていきましょう!

opWikiPlugin を作ってみよう #1

06 / 12 金曜日 2009

  • TIPS
  • Kousuke Ebihara

OpenPNE開発チームの海老原です。

不定期ではありますが、 OpenPNE 3.2.x に向けたプラグインの作成チュートリアルを連載していこうと思います。

はじめに

OpenPNE 3 向けのプラグイン作成チュートリアルには、川原君の「プラグインの作り方」シリーズが存在しますが、これは OpenPNE 3 開発の初期の段階から執筆されたもので、いまでは内容が古くなってしまっています。プラグインのリリースをどうおこなえばよいかといったようなプログラミング以外に関するトピックもなく、このチュートリアルだけでプラグイン作成の全貌を把握することは難しくなってきたといえます。

また、現在開発を進めている OpenPNE 3.2 系は、ORM の Doctrine 化にはじまり、数多くの大きな機能改善がおこなわれます(その様子は開発版である OpenPNE 3.1.x を追うことで知ることができます)。
これらの改善は OpenPNE 3.0 ではおこなえなかったことや不充分だったことを実現するためのものであり、非常に意義のあることです。
しかし、開発者が自分自身でチェンジログからそれぞれの変更を充分に理解し、自作のプラグインに反映させていくのは極めて大変な作業です。

これらの状況を解決することが、このチュートリアルの目的です。つまり読者は、

  • ・最新の OpenPNE に向けたプラグイン作成方法を知ることができる
  • ・プラグイン開発工程全体の流れを知ることができる
  • ・OpenPNE3.2 の新機能や変更点を知ることができる
  • というメリットを享受することができます。
    続きを読む

OpenPNE 3.1 を CentOS 5 にインストールしてみました

05 / 30 土曜日 2009

OpenPNE開発チームの小川です。

前回はレンタルサーバに OpenPNE 3 をインストールする例を紹介しましたが、今回は自分で管理しているサーバへのインストール例として OpenPNE 3.1.0 を最小セットアップ状態の CentOS 5.3 にインストールする手順をご紹介します。

OpenPNE 3.1 の一般的なインストール方法は、OpenPNE3.1 セットアップ手順 をご覧ください。

続きを読む

OpenPNE3 をさくらのレンタルサーバにインストールしてみました

05 / 13 水曜日 2009

OpenPNE開発チームの小川です。

OpenPNE 3 のリリース以来、「OpenPNE 3 ってレンタルサーバでも動くの?」という質問をたくさんもらっていましたので、今回はその実証のため OpenPNE 3.0.4 を「さくらのレンタルサーバ」のスタンダードで設置してみました。

結論としてはまったく問題なく設置できたましたので、その手順を紹介します。

続きを読む

OpenPNE3の機能について

04 / 20 月曜日 2009

OpenPNE開発チームの今村です。

OpenPNE3の機能一覧表を作成いたしました。
OpenPNE3のことをもっと知りたいという方々へ参考になれば幸いです。

まだまだ未実装の機能が多々ありますが開発チームも頑張っていきます!
また、未実装で興味のある機能があれば是非プラグイン作成にチャレンジしてみてください。
是非、一緒にOpenPNE3を盛り上げていきましょう!!

機能をまとめたスプレッドシートのリンク先OpnePNE3の機能一覧

OpenPNE3プラグインの作り方#6

12 / 22 月曜日 2008

この記事は OpenPNE3.0.x のものです。現在の最新安定版では動作しない箇所が存在します。

開発チームの川原です!

(過去の記事)
OpenPNE3プラグインの作り方#1
OpenPNE3プラグインの作り方#2
OpenPNE3プラグインの作り方#3
OpenPNE3プラグインの作り方#4
OpenPNE3プラグインの作り方#5

My News作りは今回で最終回です!

あと残されている基本的な作業は

  • フォームによるポストに対するアクションの作成
  • プロフィール画面にMy Newsを表示する

この2つになるかと思います。

まずは、アクションを作ります。
第2回目でテスト動作に使用した
plugins/opSamplePlugin/apps/pc_frontend/modules/hello/actions/actions.class.php
に投稿がされた時のアクションを記していきます。

前回、ポスト先のアクション名は updateNews としていたはずです。
そのため、このファイルで宣言している helloActions クラスに
新たなメソッドを宣言します。
メソッド名は executeアクション名()
(アクション名の最初は大文字に変える)にします。

<?php
// (コメント行省略)..

class helloActions extends sfActions
{
  // (コメント行省略)..
  public function executeIndex($request)
  {
    return sfView::SUCCESS;
  }

  public function executeUpdateNews($request)
  {
    // POSTリクエストかどうかを確認する
    if ($request->isMethod(sfRequest::POST))
    {
      // member_news から 自分のメンバーIDが一致する1行を取りだす
      $criteria = new Criteria();
      $criteria->add(MemberNewsPeer::MEMBER_ID,$this->getUser()->getMember()->getId());
      $memberNews = MemberNewsPeer::doSelectOne($criteria);

      // 前回作成した memberNewsFormの初期値として先ほど取りだした1行をセットする
      $memberNewsForm = new MemberNewsForm($memberNews);

      // POSTされたパラメータを取得する
      $param = $request->getParameter(‘member_news’);
      $param[‘member_id’] = $this->getUser()->getMember()->getId();

      // パラメータをバインドする
      $memberNewsForm->bind($param);

      // 入力された値が妥当かどうかを確かめる
      if ($memberNewsForm->isValid())
      {
        // データベースに保存
        $memberNewsForm->save();
      }
    }
    // 最後に自分のホームにリダイレクトする
    return $this->redirect(‘@homepage’);
  }
}

アクションでは、
$this->getUser()->getMemer()
で自分のメンバー情報が取得できることを覚えておくと今後ラクになると思います。
(自分の情報がセットされた クラスMember のインスタンスです。
 また、テンプレートでは $sf_user で $this->getUser() が取得できます。
 よって、 $sf_user->getMember() で自分のメンバー情報が取得できます。)

アクション部はこういった感じです。
ホームにあるMy Newsのフォームでポストすることにより
正しく登録できることが確認できるでしょうか?

最後に、プロフィール画面から他人が見られるようにします。
第4回のように、テンプレート拡張を利用します。

パーシャルを追加します。

plugins/opSamplePlugin/apps/pc_frontend/modules/hello/templates

_sampleParts2.php を追加します。
これを、My Newsが表示されるものにします。
下のように編集してください。

<?php
// idパラメータ(プロフィールページを表示するとき指定しているメンバーID)
// を取得します。自己プロフィールのように id がない場合は、自分のメンバーIDを $memberIdに代入する
$memberId = $sf_request->getParameter(‘id’, $sf_user->getMember()->getId());

// member_news テーブルから取得した $memberIdと一致する1行を取り出す
$criteria = new Criteria();
$criteria->add(MemberNewsPeer::MEMBER_ID, $memberId);
$memberNews = MemberNewsPeer::doSelectOne($criteria);

$body = “”;
// もし行が存在した場合は、contentフィールドの内容を$bodyに代入する
if ($memberNews)
{
  $body = $memberNews->getContent();
}

// Partsヘルパー(OpenPNE3独自のヘルパー)に含まれる
// include_box関数を使って $body を出力する
// include_boxの仕様は前回の記事で説明
include_box(‘MyNews’,’MyNews’,nl2br($body));


plugins/opSamplePlugin/apps/pc_frontend/modules/member/config/view.yml

を次のようにします。

homeSuccess:
…(省略)…
      target: [after]

profileSuccess:
  customize:
    sampleParts2:
      template: [hello, sampleParts2]
      parts: [profile]
      target: [before]

templateに今回作成した、 sampleParts2 を指定します。
プロフィールの上に表示したいので、 targetはbeforeです!

設定ファイル編集後はやっぱり symfony cc でキャッシュ削除をします。
これでプロフィール画面は次のようになるはずです。

後はフォームのtextareaの幅を調節すれば、現行の My News同様に扱うことができるでしょう。
(ついでに更新日時を表示するのを忘れていた!)

今回はかなりシンプルなアプリを作成してみましたが、
symfonyはprotype.jsを利用することができるので
凝ればAjaxでバリバリ動くリッチなWebアプリを作ることだって可能です。

symfony1.2の日本語資料も最近ようやく増え始めてきたので
ぜひOpenPNE3を使って、面白いアプリを作ってみてください。

「こんなの作ってみた!」という嬉しい報告をお待ちしています。

以後も、プラグイン開発関連の情報は引き続き発信していきたいと思いますので、
よろしくお願いします。

ページの先頭に戻る