21
WEB技術勉強会 技術勉強会 技術勉強会 技術勉強会 第 23RYUICHI TANAKA. One operation web clip support tool “Tcliper”.

Web技術勉強会23回目

Embed Size (px)

DESCRIPTION

Web技術勉強会23回目

Citation preview

Page 1: Web技術勉強会23回目

WEB技術勉強会技術勉強会技術勉強会技術勉強会 第第第第23回回回回RYUICHI TANAKA.

One operation web clip support tool “Tcliper”.

Page 2: Web技術勉強会23回目

アジェンダ

� 背景

� 現状の問題と解決策

� Proxyの方法

� 要件定義� 要件定義

� 技術要件

� Greasemonkey

� Perl

� Ruby on Rails

� 今後の課題

Page 3: Web技術勉強会23回目

背景

� 日々の情報収集はLDR+LDClip

� 自宅、イーモバでは快適環境

� LDRで収集→必要な情報はクリップ

� 問題は…会社会社会社会社ッッッッ!!!!� クリップが規制された!

� うちでやろう、冗談じゃない。

� Web屋は常にアンテナを張っておくことが重要

Page 4: Web技術勉強会23回目

解決方法

×ブラウザのブックマーク

� 論外。使い物にならない。

△規制されてないSBMを使う

すでにあるBMを棚卸して統合するのはちょっ� すでにあるBMを棚卸して統合するのはちょっと面倒

○Proxyを使う

� 自宅のサーバをProxy代わりにする

Page 5: Web技術勉強会23回目

Proxyの方法

� Proxyといっても…会社PC

Livedoor

自宅サーバ

自宅経由でPOSTするだけなんですけどね…

Page 6: Web技術勉強会23回目

要件定義

� 最低限必要なことして…

� ワンアクションでクリップワンアクションでクリップワンアクションでクリップワンアクションでクリップ

� クリップデータはクリップデータはクリップデータはクリップデータは自宅自宅自宅自宅にににに溜溜溜溜めめめめ込込込込むむむむ�

� ワンアクションでワンアクションでワンアクションでワンアクションでSMBにににに登録登録登録登録

とにかく簡単にばれずに情報をクリップする

Page 7: Web技術勉強会23回目

技術要件

会社PC 自宅サーバ Livedoor

GreasemonkeyPerl

Ruby on RailsRuby on Rails

・クライアントはFirefox限定でGreasemonkey使用・グリモンがWebサイトから情報を抽出し自宅サーバにPOST

POSTされるプログラムにはPerlを使用(ただし将来はRoRに統合)

・溜め込んだ情報を一覧表示、登録、編集できるページを作成Ruby on Railsで作成。

Page 8: Web技術勉強会23回目

Greasemonkey

// @author summer-lights // @name tcliper// @namespace http://summer-lights.dyndns.ws/tcliper/ // @include * // @description tcliper// @version 1.0.0

author:作者name:アプリ名namespace:ユニークな値を記述include:実行場所description:アプリの説明version:バージョン

UserScript定義

UserScript TipsUserScript Tips

(function(){

})();名前の重複を防ぐため無名関数でラップ

unsafeWindowオブジェクト 対象ページのwindowオブジェクト

GM_xmlhttpRequest({

method: “post”,

headers: {

“Content-Type”:”application/x-www-form-urlencoded”

},

data: xxx,

onload: function(){ … }

});

POSTの例

Page 9: Web技術勉強会23回目

Greasemonkeyグリモンを有効にしておく

Qボタンを押すとワンアクションでクリップ完了

・キーボードイベントをセットしておき、発動するとクリップする・キーはUserScript上で変更可能(お好きなキーをどうぞ)

・TITLE、URL、選択文字列をPOST送信する

Page 10: Web技術勉強会23回目

Perl

use Common::DB;

use Common::ApiAuth;

my $auth = Common::ApiAuth->new({

“apikey” => $apikey,

“referer” => $referer

});

APIキー認証(自作モジュール)

クリップデータを受信

});

my $db = Tcliper::DB->new();

$sql = “INSERT INTO tclipers …”;

@bind = ($title, $url, $comment, $date);

$db->register($sql, @bind);

クリップデータを登録

※将来的にPerlからRuby on Railsに統合予定?

Page 11: Web技術勉強会23回目

tcliper@Ruby on Railsクリップデータを表示、SBMに登録

Paginate

タイトル

サムネイル

タイトル

コメント

Page 12: Web技術勉強会23回目

Railsをサブディレクトリ構成で公開する

Railsはアプリケーションサーバが必要になるため、Apache単独動作するPHPやPerlと同じようにはいかない

Apacheの場合

test.php

test.pl

mongrelの場合

test_controller

test/index.rhtml

/usr/local/apache2/htdocs

http://localhost/test.php

でアクセスできる

/home/rails

http://localhost/index.rhtml

のようにしてもアクセスできない

test_controller

Railsでは、通常「http://localhost:3000/」のような形でアクセスする。サブドメイン方式「http://rails.localhost:3000/」にするのは比較的容易。ただし、サブディレクトリ方式「http://localhost:3000/rails」にするのは工夫が必要。

Page 13: Web技術勉強会23回目

Railsをサブディレクトリ構成で公開する

/usr/local/apache2/htdocs

tcliperの構成RailsだけどApacheで公開しているのと同じディレクトリ構成にする

diarysys4/tmap/

Apacheのドキュメントルート以下にRailsプロジェクトディレクトリを配置

searchsys/

Apacheで公開しているプロジェクト

/usr/local/apache2/htdocs/tcliper

tcliperプロジェクト

①Apache(Port80)経由でアクセス可能(200)。②Apache(Port80)経由ではForbidden(403)。mongrel(Port3000)経由でアクセス可能

Page 14: Web技術勉強会23回目

Railsをサブディレクトリ構成で公開する

tcliperプロジェクト

①mongrel経由ではhttp://localhost:3000/

になる

②だが理想は、http://localhost:3000/tcliper

でアクセスすること

/usr/local/apache2/htdocs/tcliper②

③なおかつ、複数のRails

アプリを動作させる必要がある(すでにサーバで別のRailsアプリが動作中)

chocolab/Choco.Labプロジェクト

(Ruby on Rails)

結論から言うと…

(1)mod_proxyのののの導入導入導入導入(2)routes.rbのののの設定設定設定設定(3)mongrel_cluster.ymlのののの設定設定設定設定

(mongrel単体単体単体単体のののの場合場合場合場合、、、、mongrelのののの起動起動起動起動オプションのオプションのオプションのオプションの設定設定設定設定とととと同義同義同義同義)

でいける。

Page 15: Web技術勉強会23回目

mod_proxy

mod_proxyの設定をhttpd.confに記述

<IfModule mod_proxy.c>

ProxyRequests Off

ProxyPass /tcliper/ http://192.168.0.103:3001/tcliper/ProxyPassReverse /tcliper/ http://192.168.0.103:3001/tcliper/

# 他のRailsアプリも同様の記述をここにする</IfModule>

※mod_proxy_balancerやPassenger、mod_railsなどで同様の設定が可能。このあたりの説明は以前の勉強会資料にて記述してあるので割愛。また、インストール方法についても省略。

http://mydomain.jp/tcliper(Port80)にアクセスすると、http://192.168.0.103:3001/tcliperにリバースしてくれる。

ただし、当然ながらRailsアプリの実体はhttp://192.168.0.103:3001/

にいるので、このままではアクセスできない。

Page 16: Web技術勉強会23回目

routes.rbconfig/route.rbの設定を変更する

map.connect ‘’, :controller => ‘tcliper’, :action => ‘index’

Railsアプリのアクセス方法は通常、以下のようになる。(※)

http://mydomain.jp/tcliper/index

http://IPアドレス:ポート番号/コントローラ名/アクション名

上部で示した設定にすると、コントローラ名、アクション名を省略することができる

※action名が「index」の場合、URLの指定、routes.rbの:actionの指定を省略できるが、あえてわかりやすいようにするためにindexを記述している。

上部で示した設定にすると、コントローラ名、アクション名を省略することができる

http://mydomain.jp/

一見、これで終わりなようだが、まだ終わらない。Railsのアプリ自体は動作するが、静的ファイル(public/)へのルーティングができていない。つまり、画像、JavaScript、CSSが読み込まれない。

リバースプロキシ状態では以下のようになる。

http://mydomain.jp/tcliper/

http://mydomain.jp/tcliper/tcliper/index

コントローラ名。アクション名を省略しないと、

Page 17: Web技術勉強会23回目

mongrel_cluster.yml

mongrel_cluster.ymlの最後に以下の記述を追加

prefix: /tcliper

これにより、Rails内部のルートパスも書き換わるため、publicディレクトリにも正常にアクセスが可能になる。

※mongrel_clusterの導入についても以前の勉強会の資料を参照のこと

Page 18: Web技術勉強会23回目

Rails開発は…

これまでPHP、Perlによる開発をしてきた立場からすると…

開発は確かに楽(コード量が少なくて済むのは確か)

(ローカル開発環境万歳)

(当然、習得のコストはかかるよ)( )

(でも、フレームワークはやっぱ楽ですね)

(CakePHPとかまんまRailsじゃん…と今ならそう思う)

(Catalystはよーわからん)

でも…

デプロイ超めんどいローカル開発環境とパスが違うので、書き換えする必要あり。サブドメインでやる予定ありません。だからめんどい。

Page 19: Web技術勉強会23回目

Rails開発Tips

少しでもデプロイを楽にしたい⇒パスを自動的に書き換える設定を1か所に集約させる

# System mode

# [production] or [development]

mode: production

①config/tcliper.yml(独自作成設定ファイル)

modeがproductionならサーバ、developmentならローカル。

②-1application_helper.rb(ここに記述していいのかどうか微妙だが)②-1application_helper.rb(ここに記述していいのかどうか微妙だが)

(中略)private

def env_config(mode = “production”)

static_root = “/tcliper/public”

env = {

“production” => {

“path_to_js” => static_root + “javascripts”,

},

“development” => {

“path_to_js” => “javascripts”,

}

}

return env[mode]

end

静的ファイルパスをmodeによって変更する。処理はapplication_helperに記述。

Page 20: Web技術勉強会23回目

Rails開発Tips

②-3 tcliper_controller.rb

Class TcliperController < ApplicationController

インスタンス変数にパスを格納してViewで使う

②-2 application_helper.rb(続き)

def common_config

config = YAML.load_file(“config/tcliper.yml”)

my_config = env_config(config[“mode”])

@path_to_js = my_config[“path_to_js”]

(中略)end

application_helperを呼び出してClass TcliperController < ApplicationController

Include ApplicationHelper

Include TcliperHelper

def index

common_config

(中略)end

end

application_helperを呼び出してパスの設定を実行する

②-4 view/layouts/base.rhtml

<html>

<haad>

<%= javascript_include_tag @path_to_js + ‘common.js’ %>

(中略)</html>

HTML上で読み込む

※実は、上記だけではすべて書き換わらない。rhtml、CSS上で直接画像を読み込むときのパスはいちいち書き換える必要あり。要するにめんどくさい。だが、それ以上にローカル開発環境の恩恵は大きいのが実情。

Page 21: Web技術勉強会23回目

今後の課題

� まだ、ため込んだクリップデータを表示しただけ。目的は達成できていない。

� 今後は、一発クリップ機能を実装予定。� LDCからタグ一覧を引っ張ってくる� ブックマークレットは使わない

� 画面遷移により、一発でクリップはできないため

� 認証連携が必要� 一発クリップにはLDの認証を越える必要がある� 案としては、Mechnize+ScraperかクロスサイトAjaxかLivedoor Auth連携のどれかでブラウザ� 案としては、Mechnize+ScraperかクロスサイトAjaxかLivedoor Auth連携のどれかでブラウザに認証Cookieを保存する

� タイムアウト処理は…問題が起きたら考える

� Firefoxアドオン移植� そのうち

� Perl→RoR移植� すぐできそう

� スーパー一発クリップ機能� 一覧表示をすっ飛ばして直接LDCにクリップ。わりとすぐできそう。ただし、タグ付とかできない気がする。