A Day In The Boy's Life -65ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Google+が発表されましたね。(招待されてないので使ってないですけど)

こういう、新しいソーシャルネットワークのプラットフォームが発表されるたびに話題がそっちに持っていかれたりもするんですが、個人的にはあまり飛びつかないタイプの人です。

ミーハーなところもあるんで、とりあえず使ってみたいって思いはあったりしますが。


で、個人的にはそういった新しいSNSのプラットフォームに乗り換えたくない理由を考えてみると、自分はコミュニティを築くのが下手くそな人間だからというのがあったりします。



新しいプラットフォームと新しいコミュニティ


当然、新しいプラットフォームが出てきたらその中でのつながりが求められるわけです。

SNSなら当然つながってなんぼってのがありますし。

ただ、自分はリアルでの知り合いとネット上のサービスでつながっているということが少ない人間です。

ネット上だけの付き合いに比べたら、その中でリアルの知り合いというのは1%にも満たなかったりします。


こうなってくると、例え仲良くしてもらっているネット上での付き合いの人から新しいプラットフォームへ招待されたとしても、それ以外の人と付き合うケースが減ることになるわけです。

Google WAVEが出たときも運良く早めに招待してもらいましたが、うまくコミュニティを作ることができませんでした。

どちらかというと、先に書いたようにGoogleが新しく打ち出したプラットフォームってどんなだろう?という興味の方が先行して飛びついたような感じです。


新しいプラットフォームへ移行することで新しいつながりも出てくるでしょうが、既にあるつながりの場を捨ててまで新しいプラットフォームで再びコミュニティを築いていこうとするほどのメリットがあまり考えられません

コミュニケーション取るだけならTwitterでもいいじゃんとか思ったりもします。


ネット上でコミュニティを築くのがうまい人であれば、新しいプラットフォームに乗り換えてもうまくやっていけるんでしょうけど、私のように下手くそな人は、そこでコミュニティを築き上げるエネルギーを上回るほどのメリットがどうにも見えてこなかったり。

もちろん、みんな乗り換えましたという事態になればそっちに移るかもしれませんけど。


どちらかというと、SNS間をうまく横串でコミュニケーション取れるようなサービスの方がありがたかったりします。

もちろんそうなると、プラットフォームを移る理由も薄れたりもしますけどね。



新しいプラットフォームでのつながりやすさ


私のようにネット上でコミュニティを築くのが苦手という人は結構多い気がします。

Twitterでフォローしている人は知り合いだけって人は結構まれだったりもしますし。

(著名人になるほどそういう傾向がありますけど)


ネット上で成功している人って、コミュニティを築くのがうまい人だったりもするんですが、みんながみんなそうではないですよね。

つながりを持つことが簡単といっても、そんなに気を使わないといけないこと?ってぐらい億劫になっている人もいたりします。

Twitterのゆるいつながりは、そういったものを解消してくれたりしますけど、最近のSNSでは実名を明かすとか、やたらと詳しいプロフィールを入れる事を求められたりするものがあったりもします。


それによって、個と個を強く結びつけることで生まれる高いコミュニケーションというものもあると思いますが、全ての人がそれを望んでるわけでもないとも思うわけです。

Googleのようにネット上でのパーソナライズ化を進めようとしているのって、まさにその辺で自分が求めているものと逆行している感じはしたりしますけど。

(技術的なところは共感するんですが、その隅々まで整理しているところは気持ち悪さが出てきたり)


インターネットによって互いに結びつくことが容易になり、知らない人とでもコミュニケーションが気軽にとれるって世界が出来たのに、そこでのつながりまでリアルのように挨拶とか名刺交換ばりに個人を名乗りあわなくてはならないというのは、その気軽さが薄れてしまう部分もあります。

新しいプラットフォームに移ると、そのコミュニティを築くのだけでも敷居が高いのに、さらに妙なルールに縛られえると余計に面倒に思えてきたりもします。

そのためにプラットフォームの敷居を下げれば人は集まるかもしれませんが、集まったら集まったで生じる問題も多々あるわけで、それを統制するルールが出来て面倒になったりと、この辺はSNSの宿命なのかもしれませんが。


結局、そのプラットフォーム上で求めているのは斬新な機能性でも、洗練されたUIでもなくそのコミュニティの築きやすさな気がしています。

それを補うものとして機能があるというのはもちろんなんですけど、機能をウリに出されてもその先のつながりというものが機能からは到底想像が出来なかったりもします。

新しいユーザー体験といわれても、それを使う相手がいなかったり。

その機能をうまく利用できるのは、そこで十分なコミュニティを築くことが出来ている人だけなのかなと思ったりするわけです。



まとめ


Twitterのおすすめユーザーのように、プラットフォーム側としてもそのつながりをサポートする機能は提供されだしています。

つながってなんぼと書いたように、その機能の面白みにたどり着くためには、ある程度のコミュニケーションがそこで取ることで体験してもらわないとしょうがないでしょうし。

ただ、あまりにもつながりを薦めてきたりすると気持ち悪さも出てきたりするので、そのさじ加減って難しいもんなんでしょうね。


とまぁ、少しネガティブな要素で書いてみましたが、下手くそと書いたようにコミュニティを築くのは自分が苦手な部分でもありますので、その辺は今後改善していきたいなとは思っていたりもします。

ネット上でのつながりが決してうすぺらなものだけでなく、そこで強いつながりを持てればどんなプラットフォームに移ろうとも関係を保てたりはしますしね。




ブログサービスの中のよくある機能として、記事の見出し部分だけを見せてそれ以降は「続きを読む」をクリックしたら表示されるというようなものがあります。

結構多くのブログサービスでそのような機能が実装されていたりしますが、このAmebaブログではその機能が存在しません。


って事で、少し見せかけなんですが、その「続きを読む」機能を実現する方法を書いてみます。


- 実現したイメージ
A Day In The Boy's Life-Amebloで続きを読むを実現する方法


この記事自体、それを実装しているんですがパーマネントリンクを開くとそれが表示されません。

一番わかりやすい方法は、2011年07月03のアーカイブ を開いてみてください。


ちょうどこの下に、「続きを読む...」のリンクが開いており、クリックすると全てが表示される(そして、「続きを読む」リンクは削除されている)と思います。



記事を隠し、続きを読むリンクを配置するJavaScript


実際はjQueryで書いているんですが、まず下記のソースをフリープラグインに書き込み保存します。


$(document).ready(function() {
    var page_url = location.href;
    var entries = $(".foot a:contains('記事URL')");

    for (i = 0; i < entries.length; i++) {
        var url = entries[i];

        if (!page_url.match(/^.+\/entry[\-0-9]*\.html$/g )) {
            var article = $(".entry > .contents > .subContents").eq(i).find("p.continue");
            if (article.size() > 0) {
                article.nextAll().hide();
                article.html("<a href='" + url + "'>続きを読む...</a><br /><br />");
            }
        }
    }
});


続いて、各記事の続きを読むを表示したい位置に下記のタグを埋め込んでおきます。

タグの挿入は、エントリを書く際に「HTMLタグを表示」からタグ編集モードにして書いておきます。


<p class="continue" />


このタグの表示位置に「続きを読む...」が表示され、それ以降の記事が非表示となります。



続きを読むを実装するJavaScriptの詳解


そんなに難しいことはしていませんが、


var entries = $(".foot a:contains('記事URL')");

にて、各記事のパーマネントリンクを取得してます。

続いて、パーマネントリンクを開いていない場合のみ、その記事内に先ほど埋め込んだ、continueクラスを持つPタグの情報を探すようにしています。


var article = $(".entry > .contents > .subContents").eq(i).find("p.continue");

さらに、上記のPタグが見つかった場合は


article.nextAll().hide();

で、そのPタグ以降の記事データを非表示にしています。


2011.07.04 追記

私のブログの場合、プログラムの表示用にSyntaxHighlighterを使っているんですが、その場合に隠した要素が表示されるという現象が出てしまいました。

まぁ要素を隠しただけで実際は存在するので、SyntaxHighlighterによってCSSが書き換えられて再度表示されてしまいます。

ってことで、下記のように要素自体を削除することで対応しました。


article.nextAll().remove();


その上で、


article.html("<a href='" + url + "'>続きを読む...</a><br /><br />");

にて、空のPタグを「続きを読む...」というリンクを作成して入れ替えるようにしています。

記事を非表示にする部分より、続きを読むリンクを作成する条件やリンクのパーマネントを埋め込む方が時間かかったりしましたが・・・。


で、ここまで書いてて何なんですが、あくまで非表示にするってだけなので、これをすることによってページ表示のパフォーマンスがあがるとかそういう効果はありません。

一般的には、サマリを表示することで読者に見やすくさせたりする以外に、記事をコンパクトにまとめることで表示スピードを上げたりする効果もでるのでしょうが、あくまで記事を全部読み込んだ後に、特定部分を非表示にしているだけです。


まぁ、トップページを見せる場合などは少しは見やすくなるかもしれませんがね。





最近、著名なPHPのフレームワークの1つであるSymfony に触れる機会が出てきたので、利用可能な環境までのセットアップ方法を簡単にメモしておきます。

なお、セットアップした環境はCentOS5.6(さくらVPS)で行っています。



STEP1: Symfonyインストール


SymfonyはPEARからインストールする方法が最も手っ取り早いため、PEAR経由でインストールします。

デフォルトのPEARのチャンネルにはSymfonyのパッケージが存在しないため、まずはSymfonyのプロジェクト用のチャンネルを登録しておきます。


# pear channel-discover pear.symfony-project.com

次に、現在利用可能なSymfonyのバージョンを確認します。


# pear remote-list -c symfony
Channel symfony Available packages:
===================================
Package         Version
pake            1.1.4
symfony         1.4.11
YAML            1.0.5
EventDispatcher 1.0.0

配布されているSymfonyのバージョン(上記の場合、バージョン1.4.11)と、Symfonyに必要な関連パッケージ(pakeやYAMLなど)のバージョンが表示されます。

そして、最後にSymfonyをインストール。


# pear install symfony/symfony

Symfonyをインストールした後は、インストール用のディレクトリ(ここでは、symfonyというディレクトリ名)を作成しておきます。


# cd /var/www/
# mkdir symfony

開発環境であれば、Apacheのドキュメントルート以下にディレクトリを作成することも出来ますが(使い始めるまで最も手軽な方法)、余計なプログラムにアクセス可能となるためセキュリティ上は非常によろしくない状態となるため、それ以外の適当なディレクトリ内に作成しておきます。


Symfony用のディレクトリ作成が終わったら、所有者と権限を変更します。


# chown apache:apache symfony/
# chmod 775 symfony/

apacheユーザーは、その名の通りApacheの実行ユーザーです。


このステップの最後として、Apacheの設定ファイルを変更します。

なお、ここでは「SymfonyをDocumentRoot以外で動かす 」に書いたように、Apacheのドキュメントルートを丸ごとSymfony用に使うのではなく、ドキュメントルートは別のプログラムやコンテンツファイルが配置されており、URLを分ける(http://www.example.com/apps/ )ことでSymfonyのディレクトリへアクセスできるように設定しています。


Alias /apps/sf "/usr/local/lib/php/data/symfony/web/sf"
<Directory "/usr/local/lib/php/data/symfony/web/sf">
    AllowOverride All
    Allow from All
</Directory>
Alias /apps/ "/var/www/symfony/web/"
<Directory "/var/www/symfony/web">
    AllowOverride All
    Allow from All
</Directory>

※ 編集後にApache再起動


続いて、Symfonyのwebディレクトリ内にある.htaccessファイルを編集します。(下記は編集箇所)


  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ /apps/index.php [QSA,L]

サイト全体でSymfonyのアプリケーションを動かすというような場合は、特に標準のやり方 で問題ないでしょうが、既存のサイトへSymfonyを追加し、全てを移行できないといった場合は、こちらのやり方を取ってた方が便利だったりします。



STEP2: プロジェクト、アプリケーション、モジュールの作成


Symfonyのインストールが完了したら、プロジェクトの作成を行います。


$ cd /var/www/symfony/
$ symfony generate:project itboy --orm=Propel

itboyと書いている箇所が、プロジェクト名となりますので、適当なプロジェクト名に変換して実行してください。

--orm=Propelというのは、DBのアクセス方法を指定しています。

Symfonyは、PropelDoctrine という2つのORM(O/Rマッパー)が利用できます。

要は、SQLを長々と書かなくても独自のメソッドを通してテーブルにアクセスし、CRUDを実現することが出来るというものです。(もちろんSQLを直接書くこともできます)


Symfonyバージョン1.4ではデフォルトでDoctrineが採用されているため、Propelを使いたい場合は上記のようにプロジェクト作成時にオプションで指定しておく必要があります。


プロジェクトの作成が完了したら、インストールディレクトリ内に様々なディレクトリが作成されています。


$ ls
apps cache config data lib log plugins symfony test web

続いて、アプリケーションの作成です。

アプリケーションは、その名の通りSymfony内で動かすアプリ用のディレクトリを作成してくれます。


$ symfony generate:app frontend

ここでは、frontendという名前のアプリケーションを作成しています。

例えばこれをフロントのアプリケーションとし、別に管理サイト用のアプリケーションを作りたい場合は、backendという名前のアプリケーションを作ったりします。

または、後述するモジュール名で分けてしまうということも可能です。


アプリケーションを作成したら、インストールディレクトリにあるappsディレクトリ如何にアプリケーション名のディレクトリが作成されます。


$ ls apps/
frontend

アプリケーションを作成した後は、モジュールを作成します。

モジュールは、そのアプリケーション内の機能を分別するためのものです。


$ symfony generate:module frontend user

generate:moduleの後に、アプリケーション名(frontend)とモジュール名(user)を指定して実行します。

先に書いたように、ユーザー用と管理用の2つの機能がある場合は、userとadminといったモジュールを作成して、機能を分けてサイトを構築できたりします。


同じアプリケーション名でモジュールを複数作成した場合、共通のライブラリを利用するといった場合に便利に使えます。

アプリケーションディレクトリの直下にはlibというディレクトリがあり、このディレクトリはSymfonyのオートロード機能を使って明示的に呼び出す(requireなど)必要なくアクセスできます。


$ ls apps/frontend/lib/
myUser.class.php 

一方で、アプリケーションを分けてしまった場合、そのままでは他のアプリケーションで利用しているライブラリを使うことができません。

Symfonyのオートロード機能は、アプリケーション内のlibディレクトリか、Symfony直下のlibディレクトリにしか働きません。

逆に、Symfony直下のlibディレクトリはSymfony全体から呼び出し可能なため、全てのアプリケーションで利用するといった汎用的なライブラリを配置すべきディレクトリとなっています。

この辺りが、アプリケーションを複数作るかモジュールで分割するかの違いになってくるのではないでしょうか。


モジュールを作成すると、初期のアクションファイル、テンプレートファイルが作成されます。


$ ls apps/frontend/modules/user/actions/
actions.class.php
$ ls apps/frontend/modules/user/templates/
indexSuccess.php

ここまでで、Webサイトにアクセスしてみるとモジュール作成までが完了したというメッセージが表示されたSymfonyのデフォルトページが出力されるはずです。


- http://www.example.com/apps/user/index


A Day In The Boy&#39;s Life-Symfony-1



STEP3: Hello Worldの出力


最後にHellow Worldを出力してみます。

先ほどアクセスしたURLは、下記のような構造になっています。


http://ドメイン名/apps/アプリケーション用indexファイル/モジュール名/アクション名


アプリケーション用indexファイルが今回省略されている理由は後述します。
アクション名は、STEP2でモジュールを作成した際にできるactions.class.php内に定義されています。


<?php

/**
 * user actions.
 *
 * @package    itboy
 * @subpackage user
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class userActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    $this->forward('default', 'module');
  }
}


デフォルトでは、このアクションにアクセスした場合、デフォルトのモジュール(先ほど画面)に処理がフォワードされるようになっています。

アクション名は、「executeアクション名」という命名規則で定義します。

このフォワードの処理を削除しテンプレートにHello Worldを出力してみます。


class userActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    $this->setVar('word', 'Hello World!');
  }
}

続いて、テンプレートファイルの編集です。

デフォルトのIndexアクションに対応するテンプレートファイルが、1つ上のtemplatesディレクトリ内に存在します。

これを編集します。


<?php echo $word; ?>


これで再度、http://www.example.com/apps/user/index にアクセスしてみると画面上に「Hello World!」という文字が出力されているはずです。


テンプレートファイルは、「アクション名Success.class.php」という名前で作成します。

アクションが呼び出されると自動的にそのアクション名に紐づくテンプレートファイルが自動で呼び出されます。

明示的にテンプレートファイルを指定したい場合は、下記のようにアクションファイルを記述します。


  public function executeHoge(sfWebRequest $request)
  {
    $this->setVar('word', 'Hello World!');
    $this->setTemplate('index');
  }


上記では、新しくHogeアクションを作りました。

デフォルトだと「hogeSuccess.class.php」という名前のテンプレートが呼び出されるはずですが、明示的にindexSuccess.class.phpを呼び出すように指定しています。


最後に、URL上にアプリケーション名が指定されていない理由の説明です。

最初にアプリケーションを作成すると、Symfonyのインストールディレクトリ直下にあるwebディレクトリ内にindex.phpが作成されます。


$ ls web/
css  frontend_dev.php  images  index.php  js  robots.txt  uploads

このindex.phpは省略可能になっているのですが、実際のURLで以下のようにもアクセスができます。


http://www.exapmle.com/apps/index.php/user/hoge


試しにもう1つアプリケーションを追加してみます。


$ symfony generate:app backend
$ ls apps/
backend  frontend

この状態で、webディレクトリを確認してみるとbackend.phpファイルが増えています。


$ ls web/
backend.php      css               images     js          uploads
backend_dev.php  frontend_dev.php  index.php  robots.txt

同様の手法でbackendアプリケーションにadminモジュールの追加してみます。


$ symfony generate:module backend admin

この状態で、アクションファイル・テンプレートファイルを編集してアクセスする際のURLは下記のようになります。


http://www.example.com/apps/backend.php/admin/index


ファイル数がかなり多く、またDBアクセスやセッション、ライブラリの作成方法など覚えないといけないことも多いですが、構造を把握しまえば比較的容易にSymfony上でアプリケーションが構築できるのではないでしょうか。