<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
  <title>hori-uchi.com</title>
  <link rel="alternate" type="text/html" href="http://hori-uchi.com/" />
  <modified>2008-06-04T10:51:12Z</modified>
  <tagline>Perlを中心とした技術系の話などをつらつら</tagline>
  <id>tag:hori-uchi.com,2008://1</id>
  <generator url="http://www.movabletype.org/" version="3.32-ja">Movable Type</generator>
  <copyright>Copyright (c) 2008, horiuchi</copyright>
  <entry>
    <title>友人の奥さんがサロンをオープンしました。</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000456.html" />
    <modified>2008-06-04T10:51:12Z</modified>
    <issued>2008-06-04T19:46:48+09:00</issued>
    <id>tag:hori-uchi.com,2008://1.456</id>
    <created>2008-06-04T10:46:48Z</created>
    <summary type="text/plain">久しぶりの更新かつ、まったくPerlとは関係ありませんが、、 同僚の奥さんが、浦和にまつげエクステ専門サロンをオープンするそうです。 自宅サロンでゆっくり丁寧にカウンセリング、施術をしてくれるそうなので、興味のある方は是非チェックしてみてく...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >久しぶりの更新かつ、まったくPerlとは関係ありませんが、、</p>
<p >同僚の奥さんが、浦和にまつげエクステ専門サロンをオープンするそうです。</p>
<p >自宅サロンでゆっくり丁寧にカウンセリング、施術をしてくれるそうなので、興味のある方は是非チェックしてみてください！</p>
<p ><a href="http://www.mido3.jp/">まつげエクステ専門サロンmido</a></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>adsという文字列を動画のURLに入れてはいけない</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000455.html" />
    <modified>2008-01-24T16:41:14Z</modified>
    <issued>2008-01-25T01:35:49+09:00</issued>
    <id>tag:hori-uchi.com,2008://1.455</id>
    <created>2008-01-24T16:35:49Z</created>
    <summary type="text/plain">ユーザーから動画が見れなくなったという問い合わせが来たので確認すると、自分達の環境では普通に見れる。原因がよくわからない。 詳しく聞いてみるとどうやらIE7 ProというIE 7のAdd-onを入れてから見れなくなったらしい。ということでそ...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>WebDevelopment</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >ユーザーから動画が見れなくなったという問い合わせが来たので確認すると、自分達の環境では普通に見れる。原因がよくわからない。</p>
<p >詳しく聞いてみるとどうやらIE7 ProというIE 7のAdd-onを入れてから見れなくなったらしい。ということでそれを入れてみたところ見事に動画が再生されなくなった。</p>
<p >さらに詳しく調べていくと、IE7 ProのFlash広告をブロックする機能が、プレイヤーが取得しようとする動画を広告とみなしてブロックしてしまい、動画を取得できないため再生できないことがわかった。</p>
<p >ブロックされていた動画のURLがこれ。</p>
<p ><a href="http://www.flipclip.net/ads/logo_animation_a.flv" onClick="window.open(this.href); return false;" >http://www.flipclip.net/ads/logo_animation_a.flv</a></p>
<p >この広告ブロック、広告かどうかの判定をURLにテキストマッチをかける形で行っていて、「/ads/」という部分が判定にひっかかていたみたい。</p>
<p >原因がわかれば対応は簡単!</p>
<p >動画のURLを変更することで無事問題解決しました。</p>
<p >めでたしめでたし。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>「FFmpegで作る動画共有サイト」が発売されます!</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000454.html" />
    <modified>2008-01-18T04:07:47Z</modified>
    <issued>2008-01-18T12:21:13+09:00</issued>
    <id>tag:hori-uchi.com,2008://1.454</id>
    <created>2008-01-18T03:21:13Z</created>
    <summary type="text/plain">動画共有サイトを作ってみたいという方向けの書籍「FFmpegで作る動画共有サイト」が1/29にに毎日コミュニケーションズさんから発売されます! FFmpegとはというところから始まり、インストールから各言語でのFFmpegの使いかた、実際に...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>book</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >動画共有サイトを作ってみたいという方向けの書籍「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/483992466X/horiuchiweblo-22/ref=nosim/">FFmpegで作る動画共有サイト</a>」が1/29にに毎日コミュニケーションズさんから発売されます!</p>
<p >FFmpegとはというところから始まり、インストールから各言語でのFFmpegの使いかた、実際にサイトを構築するところまで入ったてんこ盛りな書籍です。</p>
<p >僕も4章のPerlでFFmpegを使うという部分を書きました。</p>
<p >僕が書いた部分ですが、まずはシンプルにsystem関数を使ってPerlからffmpegを実行する方法をサンプルスクリプトを使って紹介し、そのスクリプトをffmpegコマンドの実行結果を取得したり、タイムアウト処理をすることができるように拡張していくという内容になっています。</p>
<p >拡張していくにあたって、誰でも簡単に試せるよう、CPANモジュールは使わず、標準モジュールと組み込み関数のみを使うようにしました。</p>
<p >ただ、CPANモジュールの便利さも知ってもらいたかったので、ここまでに拡張したスクリプトをCPANモジュールを使って書くとどうなるか?というのを最後に紹介しています。</p>
<p >ここではmizzyさん作の<a href="http://search.cpan.org/~mizzy/FFmpeg-Command/">FFmpeg::Command</a>を使ってサンプルコードを書きました。</p>
<p >今回CPANモジュールを使うコードと使わないコードを書いてみて、改めてCPANモジュールの便利さを痛感しました。</p>
<p >これを読んで、Perlっていいかも、ちょっと試してみようかなと思ってくれる方が少しでも増えたら幸いです。</p>
<br />
<p ><div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/483992466X/horiuchiweblo-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/218OfCjwUzL.jpg" alt="FFmpegで作る動画共有サイト" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/483992466X/horiuchiweblo-22/ref=nosim/" name="amazletlink" target="_blank">FFmpegで作る動画共有サイト</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/483992466X/horiuchiweblo-22" title="FFmpegで作る動画共有サイト" target="_blank">amazlet</a> on 08.01.18</div></div><div class="amazlet-detail">月村 潤 本間 雅洋 堀田 直孝 原 一浩 足立 健誌 尾花 衣美 堀内 康弘 寺田 学 <br />毎日コミュニケーションズ (2008/01/29)<br />売り上げランキング: 15883<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/483992466X/horiuchiweblo-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div></p>
<br />
<p ><blockquote></p>
<p >
    ・予価：2,940円（税込）
</p>
<p >
    ・B5変型判　272ページ
</p>
<p >
    ・ISBN978-4-8399-2466-9
</p>
<p >
    ・発売日：2008年01月29日
</p>
<p >
    ■内容紹介
</p>
<p >
    YouTubeやニコニコ動画など、最近のWebサービスでは動画共有サービスが大人気です。その多くのサイトで、動画投稿時の変換に利用されているのがオープンソースの動画変換ソフト（エンジン）「FFmpeg」です。
</p>
<p >
    FFmpegは、様々な動画・音声形式の変換に対応しており、動画共有サービス立ち上げの際に必須の技術ですが、これまでまとまった解説書がありませんでした。本書は、動画共有サイトの開発を日常的に行っている著者による、FFmpegを利用して動画共有サービスを構築するための技術解説書になります。
</p>
<p >
    本書では、動画に関する基本的な解説から、FFmpegのインストールや使い方、Perl、PHP、Python、Javaの4つのプログラム言語での利用方法、字幕を入れられるFlashを使った動画プレイヤーの制作方法、Pythonを使った動画共有サイトの構築まで、サンプルを交えて解説します。本書で解説するのは、比較的小規模での動画共有サイトの作り方となりますが、サーバサイドの工夫次第では、大規模な動画共有サイトにも発展させることも可能です。
</p>
<p >
    動画共有サイトの開発環境は多岐に渡り、本書はそのエッセンスをまとめたもので、すべての環境や手順は解説してません。また、本書の開発環境は、著者が日常的に利用している環境で、必ずしも一般的な環境ではないかもしれません。ただ、実際に動画共有サイト構築のために、著者自身が試行錯誤しながら身につけた知識や技術は、FFmpegを利用した動画共有サイト構築の際に、必ず参考になると考えています。
</p>
<p >
    著者：原一浩・寺田学・本間雅洋・足立健誌・堀内康弘・堀田直孝・月村潤・尾花衣美
</p>
<p ></blockquote></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>FlipClipでクリップ検索用フィード公開しました。</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000452.html" />
    <modified>2007-02-01T11:34:00Z</modified>
    <issued>2007-02-01T19:53:31+09:00</issued>
    <id>tag:hori-uchi.com,2007://1.452</id>
    <created>2007-02-01T10:53:31Z</created>
    <summary type="text/plain">最近どこもかしこもAPI公開なご時勢ですが、FlipClipもクリップ検索用のフィードをAPI第1段として公開しました。 FlipClip開発者向け情報のページ http://www.flipclip.net/developer/ フィード...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>FlipClip</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >最近どこもかしこもAPI公開なご時勢ですが、<a href="http://www.flipclip.net/">FlipClip</a>もクリップ検索用のフィードをAPI第1段として公開しました。</p>
<br />
<p >FlipClip開発者向け情報のページ</p>
<p ><a href="http://www.flipclip.net/developer/"><a href="http://www.flipclip.net/developer/" onClick="window.open(this.href); return false;" >http://www.flipclip.net/developer/</a></a></p>
<br />
<p >フィードと言うよりAPIといったほうが世間の受けはよさそうな気がしますが、フィードはフィードなんで、フィードという名前にしときました。</p>
<br />
<p >今のところ、以下のクリップを取得できます。</p>
<ul >
<li > 一般公開クリップ</li>
<li > 特定ユーザーのクリップ</li>
<li > 特定ユーザーの友だちのクリップ</li>
<li > 特定ユーザーのお気に入りクリップ</li>
<br />
</ul>
<p >フィードのフォーマットはAtomフィード、JSONフィード、RSS2.0を用意しました。</p>
<p >フォーマットの指定はクエリパラメータでできるんですが、別の方法として、Acceptヘッダを使った指定ができるようにしてあります。</p>
<p >リソースを取得するためのURLがあって、そのURLに対してこのフォーマットでくれというと、その形式で返す、というようにRESTっぽくしたかったので、つけました。</p>
<br />
<p >それと、絞り込み機能を充実させています。</p>
<p >タグやフリーワード、カテゴリ、撮影日時に位置情報など、対応できそうなのにはひととおり対応してみました。</p>
<br />
<p >また、ソートもいろいろな基準でできるようにしてあります。</p>
<p >フィードなんで基本日付以外でソートできるのは、よろしくないような気もしましたが、</p>
<p >使い勝手を考えて、再生回数とか投票の数などでソートできるようにしてあります。</p>
<br />
<p >もうひとつ、フィードの認証も実装してあります。</p>
<p >認証にはWSSEを採用しました。</p>
<p >フィードのリクエストの際にWSSEヘッダを付与してリクエストを送れば、</p>
<p >認証されたユーザの権限でクリップが取得できるようになります。</p>
<p >たとえば、自分のクリップなら、プライバシー設定に関係なくすべて取得できますし、</p>
<p >自分の友だちのクリップで友だち公開なクリップも取得できます。</p>
<br />
<p >使ってみて、気づいた点、使いにくい点などありましたら、お知らせいただけるとうれしいです。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>mysqldumpで文字化けしないためのメモ</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000450.html" />
    <modified>2006-12-05T06:29:41Z</modified>
    <issued>2006-12-05T11:07:42+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.450</id>
    <created>2006-12-05T02:07:42Z</created>
    <summary type="text/plain">ローカルの開発環境で使っていたMySQLなんですが、何も考えずデフォルトの設定で使っていたら、mysqldumpした際に、データが文字化けして、ちょっとは待ったのでメモ。 MySQLのバージョンは4.1.20。 文字化けする原因は、mysq...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>mysql</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >ローカルの開発環境で使っていたMySQLなんですが、何も考えずデフォルトの設定で使っていたら、mysqldumpした際に、データが文字化けして、ちょっとは待ったのでメモ。</p>
<p >MySQLのバージョンは4.1.20。</p>
<p >文字化けする原因は、mysqldumpがデフォルトでは、文字コードをUTF-8で出力するようになっていて、フィールドの型がUTF-8でない場合は、自動でUTF-8に変換するためのようです。</p>
<p >僕が使っていたDBは文字コードについて特に何も設定していなかったので、デフォルトの文字コードであるlatin1になっていました。</p>
<p >なので、これもmysqldumpするとlain1 -> UTF-8な変換が自動で行われ文字化けしたということのようです。納得。</p>
<p >この自動変換を行わないようにすれば解決するはず。ということで調べてみると、--default-character-setというオプションを使うとよいことがわかりました。これを使ってデフォルトの文字コードをDBの文字コードとあわせてやることで、自動変換が行われなくなり、文字化けしないようです。</p>
<p >で、結局以下のコマンドで文字化けせずdumpすることができました。</p>
<pre>
mysqldump --default-character-set=latin1 -uroot --all-databses > db.dump
</pre>
<p >これでデータ自体は文字化けしなくなりますが、これをそのまま、UTF-8なDBに取り込むと、取り込んだデータが文字化けしてしました。</p>
<p >ダンプしたデータを見てみると、所々にSET NAMES latin1とかDEFAULT CHARSET=latin1のように「latin1]の文字が。。</p>
<p >これが原因だったようで、ワンライナーでlatin1をutf8に変更してからインポートしたところ、文字化けせずに取り込むことができました。</p>
<pre>
perl -pi -e 's/latin1/utf8/' db.dump
</pre>]]>
      
    </content>
  </entry>
  <entry>
    <title>SledgeでもRESTfulなアプリケーションを書きたい！</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000449.html" />
    <modified>2006-11-25T00:24:46Z</modified>
    <issued>2006-11-25T00:48:03+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.449</id>
    <created>2006-11-24T15:48:03Z</created>
    <summary type="text/plain">今日参加した第9回XML開発者の日の川村さんによる「Ruby on RailsにみるRESTfulアプリケーションの方向性」の話を聞いて、SledgeでもRESTfulなコードを簡単に書きたいと思いたち、ちょっとパッチを書いてみました。  ...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>Sledge</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >今日参加した<a href="http://www.asahi-net.or.jp/~eb2m-mrt/kaihatsu9.html">第9回XML開発者の日</a>の川村さんによる「Ruby on RailsにみるRESTfulアプリケーションの方向性」の話を聞いて、SledgeでもRESTfulなコードを簡単に書きたいと思いたち、ちょっとパッチを書いてみました。</p>
<pre class="perl">
 --- Sledge/Pages/Base.pm.orig   2006-11-25 00:40:59.000000000 +0900
 +++ Sledge/Pages/Base.pm        2006-11-25 09:27:50.000000000 +0900
 @@ -8,6 +8,9 @@
  use strict;
  use base qw(Class::Accessor Class::Data::Inheritable);
 
 +use vars qw($MethodQueryKey);
 +$MethodQueryKey  = '_method';
 +
  __PACKAGE__->mk_accessors(
      'r',                       # Apache::Request or Sledge::Request::CGI
      'session',                 # Sledge::Session
 @@ -81,10 +84,16 @@
      eval {
         $self->init_dispatch($page);
         $self->invoke_hook('BEFORE_DISPATCH') unless $self->finished;
 -       if ($self->is_post_request && ! $self->finished) {
 +       if ( $self->is_put_request && ! $self->finished) {
 +           my $putmeth = 'put_dispatch_' . $page;
 +           $self->$putmeth() if $self->can($putmeth);
 +       } elsif ( $self->is_delete_request && ! $self->finished) {
 +           my $deletemeth = 'delete_dispatch_' . $page;
 +           $self->$deletemeth() if $self->can($deletemeth);
 +       } elsif ($self->is_post_request && ! $self->finished) {
             my $postmeth = 'post_dispatch_' . $page;
             $self->$postmeth() if $self->can($postmeth);
 -       }
 +    }
         unless ($self->finished) {
             my $method = 'dispatch_' . $page;
             $self->$method();
 @@ -188,6 +197,16 @@
      return $self->r->method eq 'POST';
  }
 
 +sub is_put_request {
 +    my $self = shift;
 +    return ($self->r->method eq 'PUT' || ($self->r->method eq 'POST' &&  lc($self->r->param($MethodQueryKey)) eq 'put'));
 +}
 +
 +sub is_delete_request {
 +    my $self = shift;
 +    return ($self->r->method eq 'DELETE' || ($self->r->method eq 'POST' && lc($self->r->param($MethodQueryKey)) eq 'delete'));
 +}
 +
  sub make_content {
      my $self = shift;
      # template output, then fillin forms
</pre>
<p >これを使って書いたPagesクラスのサンプルはこんな感じです。</p>
<pre class="perl">
package MyProj::Pages::Items;
use strict;
use base qw(MyPfoj::Pages);
sub dispatch_index {
    my $self = shift;
    my $item_id = int $self->r->param('id');
    if ( $item_id ){
        # アイテム単体を返すコードを記述
    } else {
        # アイテムリストを返すコードを記述
    }
}
sub post_dispatch_index {
    my $self = shift;
    # アイテムを追加するコードを記述
}
sub put_dispatch_index {
    my $self = shift;
    # アイテムを更新するコードを記述
}
sub delete_dispatch_index {
    my $self = shift;
    # アイテムを削除するコードを記述
}
</pre>
<p >MyProj::Pages::Itemsクラスがアイテムをあらわすリソースに対応していて、</p>
<p >各メソッドにあわせて、CRUDの操作を実行するという風に書けてすっきりする気がします。</p>
<p >ブラウザからはPUT,DELETEリクエストはできないので、_method=putまたはdeleteとクエリパラメータを使うことで代用しています。</p>
<p >こんなのいかがでしょうか？</p>]]>
      <![CDATA[<p >
 
</p>]]>
    </content>
  </entry>
  <entry>
    <title>Akamaiで認証付きコンテンツを配信する方法</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000448.html" />
    <modified>2006-10-22T16:27:11Z</modified>
    <issued>2006-10-22T20:18:04+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.448</id>
    <created>2006-10-22T11:18:04Z</created>
    <summary type="text/plain">IPAに脆弱性として提出されていた、ミクシィにアップロードされた画像がURLを直接たたけばログインしていなくても閲覧できる件が技術的には改修せず、ヘルプにその旨を記載することで決着したという話題について、その理由のひとつに画像の配信は一部、...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>Technology</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >IPAに脆弱性として提出されていた、ミクシィにアップロードされた画像がURLを直接たたけばログインしていなくても閲覧できる件が技術的には改修せず、ヘルプにその旨を記載することで決着したという話題について、その理由のひとつに画像の配信は一部、CDN（akamai）を使っているため、そこに認証をかけるのが難しいのではというものを見かけました。</p>
<p >このakamaiなのですが、実は、僕が開発運用している動画共有サイト<a href="http://www.flipclip.net/">FlipClip</a>でも、日ごとに増え続けるサーバへの負荷、トラフィックに対応すべく、動画の配信にこれを使えないかと検討してまして、先日akamaiの人にきていただいて話を聞いてみました。</p>
<p >このとき一番聞きたかったのがまさに今回のミクシィの件で話にでてきた「認証のかかったコンテンツをakamaiで配信できるのか？」という点でした。</p>
<p >というのもFlipClipでは動画・サムネールの配信はすべてmod_perlアプリケーションから動的に行っていて、動画に設定されたプライバシーからユーザのアクセス権を判定し、OKならば動画・サムネールを吐き出すという処理をおこなっているからです。</p>
<p >この質問に対してのakamaiの方からの回答は、3つの方法があるというものでした。</p>
<ol >
<li > akamai-FlipClip間でルールを決めて作成したCookieを使ってアクセス権を制御する方法</li>
<li > akamai-FlipClpi間でルールを決めて作成したクエリパラメータを使ってアクセス件を制御する方法</li>
<li > akamaiはIf-Modifiedヘッダ付きのリクエストを毎回FlipClipに送りつけ、認証はFlipClipに任せる方法</li>
</ol>
<p >1のCookieを使う方法と2のクエリパラメータを使う方法は、どちらもあらかじめakamaiとFlipClipの間で認証OKかNGかをakamaiが理解できるクッキー、クエリパラメータ生成ルールを決めておき、それを動画・サムネールのリクエストと一緒に送りつけると、それを元にakamaiが認証を行い、キャッシュがあればakamaiからコンテンツを返すという方法だそうです。</p>
<p >この方法の利点としては、</p>
<ul >
<li > akamaiが認証を行うので、動画のリクエストの際に、FlipClipまでリクエストが飛んでこず、FlipClipのサーバへの負荷はかなり減る</li>
</ul>
<p >という点があげられるんですが、欠点として、</p>
<ul >
<li > 認証箇所が2箇所（akamaiでの認証だけでなく、FlipClipでもCookieやクエリパラメータを生成する際に認証が必要）になってしまうため、セキュリティ的にリスクが大きくなってしまう</li>
<li > akamaiのためにそれ用の実装をしないといけない</li>
<li > 仮にクエリパラメータがばれたら誰でもアクセスできることになる</li>
<li > そもそもクエリパラメータをつけるなんてかっこ悪い</li>
</ul>
<p >という点があり、ちょっと微妙な感じだなーと感じました。</p>
<p >3の毎回FlipClip側に認証を求める方法ですが、これは、akamaiは認証は行わず、akamaiに動画・サムネールのリクエストが送られてきたら、そのリクエストにIf-Modified-SinceヘッダをつけてFlipClipのサーバに転送してくれるという方法だそうです。</p>
<p >これの利点は、</p>
<ul >
<li > アクセス制御はFlipClip側1箇所で行うので、ここだけを考えればいい。</li>
<li > 同じ動画・サムネールへのリクエストが多いという傾向があれば、キャッシュのヒット率があがり、FlipClipサーバからのトラフィックをぐんと軽減することが期待できる</li>
</ul>
<p >欠点としては、</p>
<ul >
<li > FlipClip側がIf-Modified-Sinceヘッダを理解できるようにしないといけない</li>
<li > 動画・サムネールへのアクセスがほどよく分散されているような傾向の場合は、キャッシュヒット率があまりあがらず、本サーバ側の負荷軽減は小さくなる</li>
<li > リクエストごとにFlipClip側にリクエストが飛ぶので、クッキーやクエリパラメータを使った方法よりは、サーバの負荷がかかる</li>
</ul>
<p >という点があげられますが、</p>
<p >1つ目の欠点は、すでにIf-Modified-Sinceは理解するようになっているので、問題なし。</p>
<p >2つ目の欠点は、FlipClipの動画の配信傾向を見ていると、パレートの法則にほぼ従っていて、1日に配信される動画のうち20％の動画の再生数が全体の再生数の約90％を占めているという状況なので、キャッシュのヒット率はかなり高くなりそうなので、問題なし。</p>
<p >3つ目の欠点はリクエストは毎回FlipClipのサーバまで飛んできますが、上記のとおりキャッシュがうまく働いてくれそうなので、FlipClipサーバはほとんど、302をレスポンスとして返すだけで済むはずで、負荷、トラフィックはかなり減らすことが期待できそうなので、まあ問題なし。</p>
<p >ということで、この方法はいいかもという感想でした。</p>
<p >このようにakamai経由でも認証付きコンテンツの配信はできそうなのですが、なぜミクシィがそれをできないのかというと単純にこの修正で影響を受ける箇所が多すぎて、直すに直せないってことなんじゃないかなーとか、静的に返していたコンテンツを動的にアプリケーションから吐き出すようにすると、パフォーマンスがでないと考えているのかなーとか考えちゃいますがほんとのところはどうなんでしょうねぇ。</p>
<br />
<p >via: <a title="スラッシュドット ジャパン | ミクシィ、画像に認可制御なしの欠陥を改修できず、ヘルプで弁解" href="http://slashdot.jp/security/06/10/17/1958219.shtml">スラッシュドット ジャパン | ミクシィ、画像に認可制御なしの欠陥を改修できず、ヘルプで弁解</a></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>Firefoxの「選択した部分のソースを表示」はJavaScriptで動的に生成したHTMLも表示される</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000447.html" />
    <modified>2006-10-04T01:43:28Z</modified>
    <issued>2006-10-04T10:24:04+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.447</id>
    <created>2006-10-04T01:24:04Z</created>
    <summary type="text/plain">これ知りませんでした。「選択した部分のソースを表示」しても、普通にその部分の生のソースが出てくるだけかと思い込んでました。 最近はJemplateなんかを使って動的にHTMLを生成するというのをやることが多いんですが、これ、HTMLのメンテ...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >これ知りませんでした。「選択した部分のソースを表示」しても、普通にその部分の生のソースが出てくるだけかと思い込んでました。</p>
<p >最近はJemplateなんかを使って動的にHTMLを生成するというのをやることが多いんですが、これ、HTMLのメンテがしづらいとデザイナーさんからはすこぶる評判がわるかったんです。</p>
<p >これで少しはメンテが楽になるかなー。</p>
<p >via: <a title="subtechグループ - マングローブ - JavaScriptなんかでいじられた後の現在のソースを表示" href="http://subtech.g.hatena.ne.jp/h2u/20061002/1159762557">subtechグループ - マングローブ - JavaScriptなんかでいじられた後の現在のソースを表示</a></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>巨大なFLVを再生中に他のリンクをクリックしてもなかなか移動できない現象を回避する方法</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000446.html" />
    <modified>2006-10-03T15:02:23Z</modified>
    <issued>2006-10-03T23:28:04+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.446</id>
    <created>2006-10-03T14:28:04Z</created>
    <summary type="text/plain">FlipClipでクリップを見ていると、再生の途中で画面内のリンクをクリックして他のページに移動しようとしても、なかなか移動できなくてイライラすることがあったので、これを回避する方法がないものかと考えていたのですが、今日試した方法が有効だっ...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>WebDevelopment</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >FlipClipでクリップを見ていると、再生の途中で画面内のリンクをクリックして他のページに移動しようとしても、なかなか移動できなくてイライラすることがあったので、これを回避する方法がないものかと考えていたのですが、今日試した方法が有効だったので紹介します。</p>
<p >この現象は、再生している動画のサイズが大きい場合によく起こる現象で、リンクをクリックしてもブラウザはこの大きな動画の再生に忙しいのか、なかなか画面を切り替えてくれません。</p>
<p >そこで考えたのが、クリックした時に、再生している動画をけしてしまうという方法です。</p>
<p >試した方法は簡単で、リンクなどをクリックしてページが切り替わるタイミングで、再生中のフレームを含むdiv要素のinnnerHTMLを空にしてしまうというものです。</p>
<p >コードのイメージはこんな感じです。</p>
<pre>
 &lt;script type="text/javascript"&gt;&lt:!--
 Event.observe(window, 'beforeunload', function(){
     $('clipPlayer').innerHTML='';
 });
 --&gt;&lt;/script&gt;
</pre>
<p >最初はbeforeunloadではなくunloadで試してみましたが、タイミングが遅いらしく、効果がありませんでした。</p>
<p >beforeunloadはブラウザによっては動かないといった情報をどこかで見たような気がしたのですが、IE, FireFox, Safariでうまく動いたので、互換性に問題なしと判断し、FlipClipでもこの方法を早速採用しました。</p>
<p >画面の移動がスムースになって、いい感じです。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>特定のネットワークからは無制限に、外からのアクセスはパスワードを要求</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000445.html" />
    <modified>2006-10-03T14:27:58Z</modified>
    <issued>2006-10-03T23:14:44+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.445</id>
    <created>2006-10-03T14:14:44Z</created>
    <summary type="text/plain">今までapacheでアクセス制限かけるときはIP制限ならIP制限だけ、標準認証なら標準認証だけしか設定したことがなかったし、それで事足りていたのでなにも困ることはなかったんですが、社内のネットワークやサーバ間で通信する相手からのアクセスは無...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>apache</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >今までapacheでアクセス制限かけるときはIP制限ならIP制限だけ、標準認証なら標準認証だけしか設定したことがなかったし、それで事足りていたのでなにも困ることはなかったんですが、社内のネットワークやサーバ間で通信する相手からのアクセスは無制限に行いたいけど、その他のネットワークからのアクセスはパスワードで制限したいという状況になったので、ちょっと調べてみたら、結構簡単にできました。</p>
<pre>
Require valid-user
Allow from 192.168.1
Satisfy Any
</pre>
<p ><a href="http://httpd.apache.org/docs/2.0/ja/mod/core.html#satisfy">Apacheのドキュメント</a>に普通に書いてありました。マニュアルはちゃんとよんどかないとだめですね。</p>
<p >それにしてもSatisfy Anyってわかりやすい書き方ですね。どっちか満たせばOKって、覚えやすい。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>フリップ・クリップも絶賛社員募集中です！</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000444.html" />
    <modified>2006-09-30T08:35:22Z</modified>
    <issued>2006-09-30T16:05:00+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.444</id>
    <created>2006-09-30T07:05:00Z</created>
    <summary type="text/plain">naoyaさんのバイト募集に便乗して、弊社の社員募集を出してみます。 弊社はFlipClipという動画共有サービスを運営している会社です。 http://www.flipclip.net/ 動画共有サービスというとYouTubeがまっさきに...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >naoyaさんのバイト募集に便乗して、弊社の社員募集を出してみます。</p>
<p >弊社はFlipClipという動画共有サービスを運営している会社です。</p>
<p ><a href="http://www.flipclip.net/" onClick="window.open(this.href); return false;" >http://www.flipclip.net/</a></p>
<p >動画共有サービスというとYouTubeがまっさきに思いつくと思いますが、</p>
<p >YouTubeをイメージしてもらって、そこからEvilさを引いて、かわいらしさをプラスするとFlipClipのイメージに近くなるかなーと思います。</p>
<p >ただ、YouTubeの真似をして、日本版YouTubeを作る気はありません。</p>
<p >ブログによって、誰でも自分の意見を世界に発信できるようになったように、</p>
<p >FlipClipを使うと、誰でも動画を簡単に世界に発信できるようになるといわれるようなサービスに</p>
<p >したいと思っています。そのために動画を公開する人が使いやすかったり、便利だったりする機能を</p>
<p >どんどん強化していきたいと考えています。</p>
<p >フリップ･クリップでは、上記のようなサービスの開発に興味があり、</p>
<p >以下のようなことができる方を募集しています。</p>
<ul >
<li > PerlでWebアプリを開発したことのあるエンジニア（Sledge経験者大歓迎。Linux,Apache,MySQLに詳しい方さらに大歓迎）</li>
<li > ActionScriptがバリバリかけるFlashエンジニア</li>
<li > XHTML+CSSなコーディングがバリバリできるデザイナー、コーダー</li>
<li > GFSのような世界中の動画を管理できるような巨大ストレージシステムを構築したいと考えている方</li>
<li > 巨大なトラフィックをさばけるようなサーバの構築・運用をしたいと考えている方</li>
</ul>
<p >弊社の会社概要は以下のとおりです。</p>
<p ><a href="http://www.flipclip.net/company" onClick="window.open(this.href); return false;" >http://www.flipclip.net/company</a></p>
<p >現在、Perlエンジニアが僕を含めて2名、デザイン・コーディング・広報まで担当している、デザイナーが1名、営業･マーケティング担当が1名の4名がメインで活動しています。</p>
<p >そして、関連会社のアトムにFlash、デザイン、サーバ構築運用の部分を手伝ってもらっています。</p>
<p >社員はみんな、動画を使ってあんなことできないか、こんなことできないか、あーでもないこーでもないと議論しながら、面白いアイデアはどんどん実装していこうというスタンスで開発を進めています。</p>
<p >FlipClipはすべてPerlで書かれていて、フレームワークにSledgeを採用しています。</p>
<p >OSは、CentOS4.3で、WebサーバはApache+mod_perl, DBにMySQL, SMTPサーバにPostfixを採用しています。</p>
<p >動画の変換部分もffmpegやQuickTimeなど様々なソフトウェアを組み合わせて自前で構築しています。</p>
<p >ソースコードの管理にはSubversionを使っています。</p>
<p >簡単に弊社を紹介させていただきましたが、ちょっとでも興味をもたれた方は、</p>
<p >horiyasu at gmail.com までご連絡ください。</p>
<br />
<p >via: <a title="naoyaのはてなダイアリー - バイト募集してます。" href="http://d.hatena.ne.jp/naoya/20060929/1159515528">naoyaのはてなダイアリー - バイト募集してます。</a></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>MT3.3でBerkeley DBからPostgreSQLへの移行する際の注意点</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000443.html" />
    <modified>2006-09-29T18:53:38Z</modified>
    <issued>2006-09-30T03:13:27+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.443</id>
    <created>2006-09-29T18:13:27Z</created>
    <summary type="text/plain">MTのエントリが多くなりすぎて、再構築ができなくなったと友達から連絡をもらい、確認したところ、DBにBerkeleyDBを使っていたので、それを改善すべくDBをBerkeleyDBからPostgreSQLに移行してみました。 その際、MTの...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>Weblog</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >MTのエントリが多くなりすぎて、再構築ができなくなったと友達から連絡をもらい、確認したところ、DBにBerkeleyDBを使っていたので、それを改善すべくDBをBerkeleyDBからPostgreSQLに移行してみました。</p>
<p >その際、<a href="http://www.sixapart.jp/movabletype/manual/3.3/02_system_admin_guide/upgrade/changing_database.html">MTのマニュアル</a>にしたがってやってみたところ、そのままではうまくいかなかったので、行った作業をメモ的に残しておきます。</p>
<h3 ><a href="http://hori-uchi.com/archives/000443.html#20PostgreSQLe381aee8a8ade5ae9a" id="20PostgreSQLe381aee8a8ade5ae9a" >*</a> PostgreSQLの設定</h3>
<p >まず、<a href="http://www.sixapart.jp/movabletype/manual/3.3/02_system_admin_guide/installation/database_option_postgresql.html">マニュアル</a>をみてPostgreSQLの設定をしました。</p>
<p >基本マニュアルどおりに進めて、mt-config.cgiの設定を変更し、</p>
<p >データベースの作成をおこないました。</p>
<p >DBの文字コードはUTF-8だったので、DB作成の際、文字コードを指定しました。</p>
<pre>
createdb -E UNICODE --owner xxxxx
</pre>
<h3 ><a href="http://hori-uchi.com/archives/000443.html#20e7a7bbe8a18ce382b9e382afe383aae38397e38388e38292e5ae9fe8a18c" id="20e7a7bbe8a18ce382b9e382afe383aae38397e38388e38292e5ae9fe8a18c" >*</a> 移行スクリプトを実行</h3>
<p >次にマニュアルどおりMT付属の移行スクリプトを実行したところ、DBの文字コードと違う文字コードのデータを入れようとした旨のエラーメッセージが出て、移行スクリプトを完了できませんでした。</p>
<p >文字コードの違うデータというのは、トラックバックPingのデータで、トラックバック元のブログの文字コードがUTF-8ではないものがエラーではじかれているようでした。</p>
<p >これは、文字コードが違うPingを探し出して削除するのは面倒くさかったので、移行スクリプトのほうを修正して、インサートに失敗しても処理を続行するようにして、回避しました。</p>
<p >修正点は以下のとおり。saveに失敗してもdieしないようにしただけです。MTの方で、DBへのアクセスが高度に抽象化されているので、修正は非常に簡単です。</p>
<pre>
 --- ./mt-db2sql.cgi.org       Sat Sep 30 00:54:15 2006
 +++ ./mt-db2sql.cgi  Sat Sep  9 20:09:45 2006
 @@ -141,8 +141,8 @@
                  $obj->allow_comments(0)
                      if defined $obj->allow_comments && $obj->allow_comments eq '';
              }
 -            $obj->save
 -                or die $obj->errstr;
 +            $obj->save;
 +               # or die $obj->errstr;
          }
 
          # fix up the category parents
</pre>
<p >この修正版のスクリプトを再度実行したところ、今度は問題なく、データの移行が完了しました。</p>
<h3 ><a href="http://hori-uchi.com/archives/000443.html#e38080e382b7e383bce382b1e383b3e382b9e381aee4bd9ce68890e38081e69bb4e696b0" id="e38080e382b7e383bce382b1e383b3e382b9e381aee4bd9ce68890e38081e69bb4e696b0" >*</a>　シーケンスの作成、更新</h3>
<p >これで万事OKかと思ったんですが、この状態でエントリを作成しようとすると、以下のようなエラーがでて、作成できなくなってしまいました。</p>
<pre>
Saving entry failed: ERROR: ExecInsert: Fail to add null value in not null attribute entry_id
</pre>
<p >このエラーでググッてみると、どうやらDB内にシーケンスがないためのようです。</p>
<p >先ほどの移行用スクリプトだと、テーブルは作成されてもシーケンスは作成してくれないみたいです。</p>
<p >そうとわかれば、後はシーケンスを手動で作成するだけです。</p>
<p >以下のSQLを実行し、シーケンスを作成し、格納されている値を現在の最大値にセットしたところ、問題なく動くようになりました。</p>
<pre>
CREATE SEQUENCE mt_author_id;
CREATE SEQUENCE mt_blog_id;
CREATE SEQUENCE mt_category_id;
CREATE SEQUENCE mt_comment_id;
CREATE SEQUENCE mt_config_id;
CREATE SEQUENCE mt_entry_id;
CREATE SEQUENCE mt_fileinfo_id;
CREATE SEQUENCE mt_ipbanlist_id;
CREATE SEQUENCE mt_log_id;
CREATE SEQUENCE mt_notification_id;
CREATE SEQUENCE mt_objecttag_id;
CREATE SEQUENCE mt_permission_id;
CREATE SEQUENCE mt_placement_id;
CREATE SEQUENCE mt_plugindata_id;
CREATE SEQUENCE mt_tag_id;
CREATE SEQUENCE mt_tbping_id;
CREATE SEQUENCE mt_template_id;
CREATE SEQUENCE mt_templatemap_id;
CREATE SEQUENCE mt_trackback_id;
select setval('mt_author_id',(select max(author_id) from mt_author));
select setval('mt_blog_id',(select max(blog_id) from mt_blog));
select setval('mt_category_id',(select max(category_id) from mt_category));
select setval('mt_comment_id',(select max(comment_id) from mt_comment));
select setval('mt_config_id',(select max(config_id) from mt_config));
select setval('mt_entry_id',(select max(entry_id) from mt_entry));
select setval('mt_fileinfo_id',(select max(fileinfo_id) from mt_fileinfo));
select setval('mt_ipbanlist_id',(select max(ipbanlist_id) from mt_ipbanlist));
select setval('mt_log_id',(select max(log_id) from mt_log));
select setval('mt_notification_id',(select max(notification_id) from mt_notification));
select setval('mt_objecttag_id',(select max(objecttag_id) from mt_objecttag));
select setval('mt_permission_id',(select max(permission_id) from mt_permission));
select setval('mt_placement_id',(select max(placement_id) from mt_placement));
select setval('mt_plugindata_id',(select max(plugindata_id) from mt_plugindata));
select setval('mt_tag_id',(select max(tag_id) from mt_tag));
select setval('mt_tbping_id',(select max(tbping_id) from mt_tbping));
select setval('mt_template_id',(select max(template_id) from mt_template));
select setval('mt_templatemap_id',(select max(templatemap_id) from mt_templatemap));
select setval('mt_trackback_id',(select max(trackback_id) from mt_trackback));
</pre>
<p >以上BerkeleyDBからPostgreSQLへの移行の際の注意点をまとめると、</p>
<ul >
<li > 文字コードの問題でエラーがでるため、移行スクリプトを修正して、エラーを無視するようにする。</li>
<li > シーケンスは作成されないので手動で作成する。</li>
</ul>
<p >の2つを注意しないといけないようです。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>コネクションプーリング都市伝説は正しそう</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000442.html" />
    <modified>2006-07-31T01:53:07Z</modified>
    <issued>2006-07-31T10:41:38+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.442</id>
    <created>2006-07-31T01:41:38Z</created>
    <summary type="text/plain">またちょっと古いねたですが、WEB+DB PRESS vol.33でnipotanさんが書いてたコネクションプーリング都市伝説を読んだ時、ほんとのところどっちが速いのかってのをabでベンチマークをとってみました。 ベンチマークとったときにエ...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>WebDevelopment</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >またちょっと古いねたですが、WEB+DB PRESS vol.33でnipotanさんが書いてたコネクションプーリング都市伝説を読んだ時、ほんとのところどっちが速いのかってのをabでベンチマークをとってみました。</p>
<p >ベンチマークとったときにエントリを書こうと思ってたんですが、モチベーションがあがらず今になっちゃいました。。</p>
<p >以下がベンチマークの結果です。</p>
<p ><h3>プーリングを有効にした場合</h3></p>
<pre>
Server Hostname:        rakuda.localhost
Server Port:            80
Document Path:          /
Document Length:        12323 bytes
Concurrency Level:      20
Time taken for tests:   107.840 seconds
Complete requests:      1000
Failed requests:        0
Broken pipe errors:     0
Total transferred:      12579000 bytes
HTML transferred:       12323000 bytes
Requests per second:    9.27 [#/sec] (mean)
Time per request:       2156.80 [ms] (mean)
Time per request:       107.84 [ms] (mean, across all concurrent requests)
Transfer rate:          116.65 [Kbytes/sec] received
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.0      0     1
Processing:   640  2140  486.9   1999  4674
Waiting:      639  2139  486.9   1999  4673
Total:        640  2140  486.9   1999  4674
ERROR: The median and mean for the initial connection time are more than twice the standard
       deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
  50%   1999
  66%   2066
  75%   2141
  80%   2267
  90%   2650
  95%   3388
  98%   3774
  99%   3941
 100%   4674 (last request)
</pre>
<p ><h3>コネクションプーリングを無効にした場合</h3></p>
<pre>
Server Hostname:        rakuda.localhost
Server Port:            80
Document Path:          /
Document Length:        12323 bytes
Concurrency Level:      20
Time taken for tests:   104.939 seconds
Complete requests:      1000
Failed requests:        0
Broken pipe errors:     0
Total transferred:      12579000 bytes
HTML transferred:       12323000 bytes
Requests per second:    9.53 [#/sec] (mean)
Time per request:       2098.78 [ms] (mean)
Time per request:       104.94 [ms] (mean, across all concurrent requests)
Transfer rate:          119.87 [Kbytes/sec] received
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.1      0     3
Processing:   353  2081  502.0   1969  5219
Waiting:      351  2081  502.0   1969  5219
Total:        353  2081  502.0   1969  5219
Percentage of the requests served within a certain time (ms)
  50%   1969
  66%   2033
  75%   2117
  80%   2192
  90%   2503
  95%   3011
  98%   4032
  99%   4571
 100%   5219 (last request)
</pre>
<p >これ以外にもいくつかパスを替えてベンチマークをとったところ、いずれも若干ですがプーリングしないほうが早かったので、現在はプーリングしないほうで運用しています。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>Sledgeのセッション用テーブルはMyISAMにしています。</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000441.html" />
    <modified>2006-07-31T01:29:57Z</modified>
    <issued>2006-07-31T09:44:46+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.441</id>
    <created>2006-07-31T00:44:46Z</created>
    <summary type="text/plain">naoyaさんのエントリーnaoyaのはてなダイアリー - MyISAM vs InnoDBに反応して、久々にエントリを書いてみます。 FlipClipは、すべてMyISAMで運用しているんですが、理由はあんまりなくて、デフォルトでMyIS...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>WebDevelopment</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >naoyaさんのエントリー<a title="naoyaのはてなダイアリー - MyISAM vs InnoDB" href="http://d.hatena.ne.jp/naoya/20060729/1154139996#tb">naoyaのはてなダイアリー - MyISAM vs InnoDB</a>に反応して、久々にエントリを書いてみます。</p>
<p >FlipClipは、すべてMyISAMで運用しているんですが、理由はあんまりなくて、デフォルトでMyISAMだからってのが大きいのと、スナップショットを取るのにmysqlsnapshotに手を加えたものを使っているので、InnoDBにするとそれを使えなくなるというのが主な理由です。それにまだDBがボトルネックだうはーってな状態になったことがないってのもあります。</p>
<p >それでも少し前にサーバのチューニングをそろそろ考えたほうがいいかなーということを考えたことがありまして、</p>
<p >その時にチューニングの候補に考えたものの一つが、Sledgeのセッション用のテーブルをMyISAMからInnoDBに替えてみるということでした。</p>
<p >セッションテーブルはスナップショットを取る必要ないですし、InnoDBにして早くなったらラッキーってのと、Sledgeのセッション用のテーブルは1リクエストで必ず1回書き込みが行われるので、読み込みと書き込みが同程度発生するので、更新系が多い場合はInnoDBがよいというのにあてはまるかなと思ったからです。</p>
<p >そこで実際にSledgeで作ったアプリケーションを使ってセッションテーブルをInnoDBにした場合と、MyISAMにした場合でどれほど性能に差がでるかabを使って簡単にベンチマークしてみました。</p>
<p >以下がabを使って同時10リクエストで合計1000リクエスト実行した際の結果です。</p>
<p ><h3>MyISAMの場合</h3></p>
<pre>
Benchmarking rakuda.localhost (be patient)
Server Software:        Apache/1.3.36
Server Hostname:        rakuda.localhost
Server Port:            80
Document Path:          /
Document Length:        14911 bytes
Concurrency Level:      10
Time taken for tests:   110.009 seconds
Complete requests:      1000
Failed requests:        0
Broken pipe errors:     0
Total transferred:      15167000 bytes
HTML transferred:       14911000 bytes
Requests per second:    9.09 [#/sec] (mean)
Time per request:       1100.09 [ms] (mean)
Time per request:       110.01 [ms] (mean, across all concurrent requests)
Transfer rate:          137.87 [Kbytes/sec] received
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.0      0     1
Processing:   292  1096  223.5   1031  1976
Waiting:      291  1096  223.5   1031  1976
Total:        292  1096  223.5   1031  1976
ERROR: The median and mean for the initial connection time are more than twice the standard
       deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
  50%   1031
  66%   1071
  75%   1109
  80%   1145
  90%   1338
  95%   1753
  98%   1832
  99%   1888
 100%   1976 (last request)
</pre>
<p ><h3>InnoDBの場合</h3></p>
<pre>
Benchmarking rakuda.localhost (be patient)
Server Software:        Apache/1.3.36
Server Hostname:        rakuda.localhost
Server Port:            80
Document Path:          /
Document Length:        14911 bytes
Concurrency Level:      10
Time taken for tests:   110.730 seconds
Complete requests:      1000
Failed requests:        0
Broken pipe errors:     0
Total transferred:      15167000 bytes
HTML transferred:       14911000 bytes
Requests per second:    9.03 [#/sec] (mean)
Time per request:       1107.30 [ms] (mean)
Time per request:       110.73 [ms] (mean, across all concurrent requests)
Transfer rate:          136.97 [Kbytes/sec] received
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.0      0     0
Processing:   765  1102  273.9   1010  2476
Waiting:      765  1102  273.9   1010  2476
Total:        765  1102  273.9   1010  2476
Percentage of the requests served within a certain time (ms)
  50%   1010
  66%   1059
  75%   1120
  80%   1180
  90%   1466
  95%   1787
  98%   1973
  99%   2198
 100%   2476 (last request)
</pre>
<br />
<p >結果としてMyISAMもInnoDBも速度的にはほとんど変わらなかった(ちょっとMyISAMのほうが速かった)ので、今まで通りMyISAMでいいかという結論に達しました。</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>タグを頻繁に切るようなプロジェクトでのsvkの使い方。これでいいのか?</title>
    <link rel="alternate" type="text/html" href="http://hori-uchi.com/archives/000439.html" />
    <modified>2006-06-24T19:55:02Z</modified>
    <issued>2006-06-25T04:13:17+09:00</issued>
    <id>tag:hori-uchi.com,2006://1.439</id>
    <created>2006-06-24T19:13:17Z</created>
    <summary type="text/plain">ここ最近はsvkを使ってバージョン管理をしているんですが、svk help introで見ることができるイントロで紹介されているように 、 # リポジトリをミラー svk mirror svn://svn.example.com/proje...</summary>
    <author>
      <name>horiuchi</name>
      
      <email>horiuchi@vcube.com</email>
    </author>
    <dc:subject>Technology</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://hori-uchi.com/">
      <![CDATA[<p >ここ最近はsvkを使ってバージョン管理をしているんですが、svk help introで見ることができるイントロで紹介されているように 、</p>
<pre class="code">
# リポジトリをミラー
svk mirror svn://svn.example.com/project_x //mirror/project_x
# リポジトリを同期
svk sync //mirror/project_x
# ローカルリポジトリを作成
svk copy //mirror/project_x //project_x
</pre>
<p >として、同期したproject_xのリポジトリをそのままローカルリポジトリにするという方法でしばらく使っていました。最初はこれで問題ないように思えたんですが、元のリポジトリでブランチやタグを切った後、svk pull //project_xして、リポジトリの同期をとると、ブランチやタグがファイルの実体としてコピーされているようだということに気づきました。</p>
<p >僕の会社でのsubversionの使いかたは、trunkで開発を進めて、リリースの準備ができたら、ブランチを切り(例えば branches/RB-2.3)、実際にリリースする時にはタグを切る(例えば tags/REL-2.3.0)という形をとっているので、結構タグを切ることが多いです。</p>
<p >これだとタグを切るたびにsvk pullするとそのプロジェクト分のファイル容量が消費されてしまい、すごくディスクを無駄にしているような気がしていました。</p>
<p >そこで考えたのが以下の方法。</p>
<pre class="code">
# リポジトリをミラー。ここは同じ
svk mirror svn://svn.example.com/project_x //mirror/project_x
# リポジトリを同期。ここも同じ
svk sync //mirror/project_x
# trunk,brancheのローカルリポジトリをそれぞれ作成。ここを変更
svk copy //mirror/project_x/trunk //project_x-trunk
svk copy //mirror/project_x/branches/RB-2.3 //project_x-rb2.3
</pre>
<p >ローカルリポジトリを作成する際にリポジトリそのままではなく、トランクとブランチをそれぞれローカルレポジトリとして作成してみました。</p>
<p >今はこの方法で開発をはじめてますが、pull, push,なんかも問題なくできますし、トランクの作業コピー上で、svk smerge //project_x-rb2.3として、リリースブランチの修正をトランクにマージすることもできているので、問題はなさそうです。</p>
<p >もうひとつ、考えられる方法として、mirrorする際に、trunkをミラーするという方法もできそうですが、なんかこの方法だと管理が複雑になりそうだったので上記の方法をとりました。</p>
<p >svkは結構柔軟にいろいろできるっぽいので、他のひとがどういう風に使っているのかちょっとしりたいなーと思いました。</p>]]>
      
    </content>
  </entry>

</feed>