SlideShare a Scribd company logo
エロサイト管理者の憂鬱Ⅱ
- How I build, operate, monetize, and tune up small web applications -



                         yusukebe
                       Yokohama.pm
                         2009/9/9
yusukebe
•   Yusuke Wada / 和田裕介
•   1981年12月23日生
•   神奈川県鎌倉市鎌倉山
•   株式会社ワディット代表取締役
•   株式会社オモロキCTO
•   「yusukebe the Erogeek!」
yusukebe
•   Yusuke Wada / 和田裕介
•   1981年12月23日生
•   神奈川県鎌倉市鎌倉山
•   株式会社ワディット代表取締役
•   株式会社オモロキCTO
•   「yusukebe the Erogeek!」
“Kailas”
•   Yet Another BPM Framework
•   9/10 13:45 -
•   ワディットコーポレートトラック
•   Masanori will talk!
What I’ve done.

• About 10 web applications
• About 10 ero sites
Total PV



600,000 pv over
     / 1day
yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909
How I
      BUILD
     OPERATE
     MONETIZE
     TUNE UP
these small web applications.
Why I make small web applications?
•   楽しい
•   セルフ・ブランディング
•   勉強
•   お金
•   全て一人でできる!
    – 企画・開発・運用・マーケティング・プロモーション
1. BUILD
Off course

using Perl !
Perl
• use Catalyst (5.7系)
• use Mouse (not Moose)
• use DBIx::Class
Catalyst application ディレクトリ構成
yusuke@dev:~/work/myapp/MyApp$ tree .
.
|-- db
|   |-- myapp.sql
|   `-- update_schema.pl
|-- cli
|-- myapp_web.yml
|-- lib
|-- root
|   |-- favicon.ico
|   `-- static
|        `-- images
|-- script
`-- t
    |-- 01app.t
    |-- 02pod.t
    |-- 03podcoverage.t
    `-- 11_api.t
Catalyst application ディレクトリ構成
yusuke@dev:~/work/myapp/MyApp$ tree lib/
lib/
`-- MyApp
     |-- API
     |   `-- Role.pm
     |-- API.pm
     |-- CLI
     |-- Schema
     |-- Schema.pm
     |-- Web
     |   |-- Controller
     |   |   `-- Root.pm
     |   |-- Model
     |   |   `-- API.pm
     |   `-- View
     |       `-- TTSite.pm
     `-- Web.pm
use Mouse in the service layer
package Twib::API;
use Mouse;
with 'Twib::API::Role';

no Mouse;

sub get_popular_links {
    my ( $self, $args, $page, $rows ) = @_;
    $args ||= {};
    $page ||= 1;
    $rows ||= 20;
    return $self->schema->resultset('Link')
      ->search( $args,
        { order_by => 'tweet_count DESC', page => $page, rows => $rows } );
}

1;
__END__
./db/update_schema.pl
#!/usr/bin/perl

use   strict;
use   warnings;
use   FindBin;
use   DBIx::Class::Schema::Loader qw/make_schema_at/;

my $schema_class = "Twib::Schema";
my $connect_info = [ 'dbi:mysql:twib:localhost', 'root', '' ];

make_schema_at(
    $schema_class,
    {
        components =>
          [qw/UTF8Columns InflateColumn::DateTime/],
        dump_directory => File::Spec->catfile( $FindBin::Bin, '..', 'lib' ),
        debug          => 1,
    },
    $connect_info,
);
__END__
たくさん作って自分なりのスタイルを作る
         こと




   素早い開発が可能に!
フロントエンドは
ライブラリを有効活用しよう!
JavaScript
• jQuery
• jQuery UI
• Shadowbox
CSS
• jQuery UI
• YUI
できないHTMLデザインは
他の人の力で解決しよう
yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909
HTML Themes
• WooThemes
  – http://www.woothemes.com/
• Open Source Web Design
  – http://www.oswd.org
2. OPERATE
Hardware
• ec2: 5 instances ( 6 cores )
• 自宅: 1 front / 1 fs / 1 db / 2 app servers


                       Software
•   debian etch
•   apache2.2 + mod_perl
•   MySQL
•   gearman, Q4M
自宅サーバールーム(納戸)

App / sc1435




  Bokete App                            DB



  Front

                                         App / Q6600



Router                                    FS

                               iSCSI

                                       2 UPS
自宅                              ec2


             Front
           Apache 2.2


                                      Amazon S3


               App
     Apache 2.2 with mod_perl




              DB                        FS
            MySQL 5                     NFS
from httpd.conf on Front

<VirtualHost *:80>
    ServerName twib.jp
    DocumentRoot /home/yusuke/www/pulpsite/Twib/root
    AllowEncodedSlashes On
    RewriteEngine On
    RewriteRule ^/(static/|favicon.ico) - [L]
    RewriteRule ^/(.*)$ http://192.168.1.22:8102/$1 [P,L]
    ExpiresActive On
    <FilesMatch ".(jpg|gif|png|ico|css|js)$">
        ExpiresDefault "access plus 365 days"
    </FilesMatch>
</VirtualHost>
from httpd.conf on App
KeepAlive Off
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 192.168.1.11 127.0.0.1

Listen 8102
PidFile /var/run/apache2/twib.pid

StartServers           1
MinSpareServers        4
MaxSpareServers       12
MaxClients            24
MaxRequestsPerChild   10000

PerlSwitches -I/home/yusuke/www/pulpsite/Twib/lib
SetHandler perl-script
PerlHandler Twib::Web
Using S3 as Front-end Server
3. MONITIZE
収入源は基本的にアフィリエイト

 – DTI, sbs, DMM, Amazon, Rakuten, etc.
 – AdSense


• 気楽でいい
• 成果報酬
• 継続報酬
単純だけど基本原理




運用コスト
          収入
           =
         アクセス
運用コストを下げれば儲かる
         =
   サーバーの台数を減すんだ
         =
1 台でまかなえる処理数を増やす
         =
ソフトウェアチューニング!
4. TUNE UP
Basic tuning
• ゆーすけべー日記「YourAVHost その後」
 – YourAVHostのページ内に含まれる画像を全て mod_perl の apache でサーブしていた
 – そこで画像を全て static なコンテンツを扱う apache2 でサーブさせようとしたが、キャッ
   シュの設定、具体的には mod_expire の設定を何もしていなかった




 – mod_perl で処理する必要の無い静的コンテンツは mod_perl で扱うな
 – 静的コンテンツには mod_expire で Expires ヘッダーをつけてキャッシング
   させよ
use Worker; # on Twib




        Stream
                                                   Fecher
        Reader                         Q4M
use AnyEvent::Twitter::Stream;



                                                         Web App

                                                            DB
use HTTP::Engine;
yusuke@dev:~/work/XXX/trunk$ tree lib/
lib/
|-- XXX
|    |-- API.pm
|    |-- C
|    |   |-- Root.pm
|    |   `-- Video.pm
|    |-- ModPerl.pm
|    |-- Router.pm
|    |-- Schema
|    |   |-- CaptchaImage.pm
|    |   |-- Download.pm
|    |   `-- Video.pm
|    `-- Schema.pm
|-- SimpleApp
|    |-- Controller.pm
|    |-- ModPerl.pm
|    |-- Server.pm
|    `-- View.pm
`-- WWW
     `-- YourFileHost
         `-- Break.pm
それPla


それPlack
でやりなよ




          Plack
          HACKS
“Noe” based on Plack
Other tips
• use Cache::FileCache; # on ec2
• 意図的なdbの非正規化
• mod_perl の Cow なメモリ共有を増やす
More…
そこで
(内緒だよ♡)
おかげで
ルータ交換しました^ ^ ;
今後
• 継続するサービスを
 – コンテンツ
 – 運用
• 更なる省力化
 – Front-end レイヤーでの File Cache
Wrap up
• Building a small web application is fun.
• アプリケーションの最適化は奥が深い
• けれども個人で様々な工夫ができる!
  – 開発
  – 運用
  – マネタイズ
  – チューニング
Make your own web
  applications !
       END

More Related Content

yusukebe in Yokohama.pm 090909