狠狠撸

狠狠撸Share a Scribd company logo
ページャ実装マニアックス


                     2010年10月16日
                      株式会社はてな
                      id:hakobe932


                 1
2010年10月17日日曜日
自己绍介
    ? id:hakobe932
       ??  株式会社はてな
                 アプリケーションエンジニア
          ?      1年目 (バイト含めると3年目)

       ?   京都ネイティブ

       ?   はてなココ

       ?   http://d.hatena.ne.jp/hakobe932
                          2
2010年10月17日日曜日
言语
       ?    Perl

       ?    JavaScript

       ?    Objective-C

       ?    Java

       ?    Ruby)

       ?    Scala
                          3
2010年10月17日日曜日
id:nagayama さん
        3回くらいまちがわれましたが
                別人です



2010年10月17日日曜日
ページャ




2010年10月17日日曜日
ページャ




2010年10月17日日曜日
ページャ




                        スクリーンショットと
                        ページャぶぶんの拡大
2010年10月17日日曜日
ページャは
                 さまざまなところで
                   使われてる


2010年10月17日日曜日
はてなにおける
          108のページャ実装を
                 紹介します


2010年10月17日日曜日
ページャの多様性
                 を知りましょう



2010年10月17日日曜日
#1 Hatena::Bookmark::Pager
    Data::Pageに機能追加
     my	 $pager	 =	 Hatena::Bookmark::Pager->new;
     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
                                                                                        	 
     $pager->total_entries(10000);
     $pager->entries_per_page(20);
     $pager->current_page(1);

     $pager->next_page;
     $pager->last_page;
     $pager->next_uri;	 #	 "次へ"	 リンク
     $pager->htmlfy;	 	 	 #	 ページャHTML

                                            11
2010年10月17日日曜日
#2 Hatena::Diary::PagerMaker
     HTMLを直接生成する
       ページャの利用目的の大半はHTMLの生成


     Hatena::Diary::PagerMaker->new($page)->make(
     	  10000,	 	 	 	 	 	 	 #	 total_data_count
     	  of	 =>	 40,	 	 	 	 #	 offset
     	  lt	 =>	 20,	 	 	 	 #	 limit
     );
     #	 $pageのなかにHTMLがセットされる


                          12
2010年10月17日日曜日
#3 Hatena::UgoMemo::Pager
 データを生成する方法をページャに渡す

     1.Queryオブジェクトを生成
     my	 $query	 =	 cmoco('Movie')->query(
     	 	 	 	 where	 =>	 {
     	 	 	 	 	 	 	 	 user_id	 =>	 $user_id,	 
     	 	 	 	 },
     	 	 	 	 order	 =>	 'created	 DESC',
     );

     ※Query を抽象化したオブジェクト

                            13
2010年10月17日日曜日
#3 Hatena::UgoMemo::Pager
      2.Queryオブジェクトからページャを作成

     $pager	 =	 Hatena::UgoMemo::Pager->new(
     	 	 	 	 page	 	 	 	 	 =>	 $page,
     	 	 	 	 per_page	 =>	 $per_page,
     	 	 	 	 query	 	 	 	 =>	 $query,	 
     	 	 	 	 #	 pager自体がqueryを持っている
     );

      3.使います

     $pager->items;	 #	 ページャが特定のページの
     $pager->next;	 	 	 	 #	 データを生成する!
     $pager->prev;
                         14
2010年10月17日日曜日
よりみち: ページャの生成
    ORMから生成

     my	 $res	 =	 moco('Entry')->pager_search(
     	 	 	 	 where	 	 =>	 {	 uid	 =>	 $uid,	 },
     	 	 	 	 order	 =>	 'updated	 desc',
     	 	 	 	 offset	 =>	 20,
     	 	 	 	 limit	 	 =>	 20,
     );
     $res->{result};	 #	 SELECT	 の結果
     $res->{pager};	 #	 現在のページの情報をもつ




                         15
2010年10月17日日曜日
よりみち: ページャの生成
   Controllerの情報とQueryから生成
     package	 Hoge::App::Users;
     use	 base	 qw(Hoge::App);
     sub	 query	 {	 
     	 	 	 	 #	 Query	 オブジェクトを返す
     }
     1;

     pacakge	 Hatena::Hoge::Engine::Users;
     use	 Hoge::Engine	 -Base;
     __PACKGE__->app_class(qw(Hoge::App::Users);
     sub	 default	 :Public	 {
     	 	 	 	 my	 $r	 =	 shift;
     	 	 	 	 $r->app->pager;	 #	 ページャができてる
     }
     1;                        16
2010年10月17日日曜日
現在 3/108


2010年10月17日日曜日
あと105個もあるの?



2010年10月17日日曜日
ページャに関わる要素
   ? ページングの対象
    ?    SQL の 結果

   ?
    ?    配列内のデータ
         ページングの基準
    ?    件数

   ?
    ?    日付
         ページングの性能
    ?    キャッシュ付き
    ?    SQLをなるべく引かない

                     + サービスごとの差異
                     19
2010年10月17日日曜日
Hatena2::Fotolife::Pager_Hatena2::Fotolife::Pager::EntryTime_Hatena2::Fot
   olife::Pager::Lite_Hatena2::Fotolife::Pager::Util_Hatena2::Fotolife::PagerMa
   ker_Hatena2::Group::PagerMaker_Hatena::A::GroupPagerMaker_Hatena::A
   ::GroupPagerMakerMobile_Hatena::A::PagerMaker_Hatena::Bookmark::Ho
   mePage_Hatena::Bookmark::Pager_Hatena::Bookmark::Pager::Binary_Hate
   na::Bookmark::Pager::Binary::Mobile_Hatena::Bookmark::Pager::Calendar_
   Hatena::Bookmark::Pager::Calendar::Mobile_Hatena::Bookmark::Pager::Qu
   eryContinuation_Hatena::Coco::Pager::CachedQueryO?set_Hatena::Diary::
   Pager_Hatena::Diary::Pager::Lite_Hatena::Diary::PagerMaker_Hatena::Haik
   u2::MoCo::Pager_Hatena::Haiku2::Pager_Hatena::Haiku2::SimplePager_Hat
   ena::Happie::Pager_Hatena::Hatena::PagerMaker_Hatena::Keyword::Pager_
   Hatena::Let::MoCo::Pager_Hatena::Message::Admin::Pager_Hatena::Messa
   ge::Pager_Hatena::Monolith::MoCo::Page_Hatena::Monolith::MoCo::PageArr
   ay_Hatena::Monolith::MoCo::PageO?setLimit_Hatena::Monolith::MoCo::Pag
   eTimeline_Hatena::My::Pager_Hatena::PagerMaker_Hatena::UgoMemo::Pa
   ger_Hatena::UgoMemo::Pager::ArrayRef_Hatena::UgoMemo::Pager::Many_
   Hatena::UgoMemo::Pager::Merged_Hatena::UgoMemo::Pager::PagerByMui
   dList_Hatena::UgoMemo::Pager::Search_Hatena::UgoMemo::Pager::Search
   Solr_Hatena::UgoMemo::Pager::Slice_Hatena::WWW::SimplePager_Updu::P


2010年10月17日日曜日
それでは
                 気をとりなおして



2010年10月17日日曜日
4/108 から


2010年10月17日日曜日
#4 Hatena::UgoMemo::Pager::Merged

   Queryの列を渡して全体をページング

     Hatena::UgoMemo::Pager::Merged->new(
     	 	 	 	 page	 	 	 	 	 =>	 $page,
     	 	 	 	 per_page	 =>	 $per_page,
     	 	 	 	 queries	 	 =>	 @queries,
     );
     内部では、それぞれから必要な数をとって来て
     mergeしてsortしてる


                        23
2010年10月17日日曜日
#5Hatena::UgoMemo::Pager::ArrayRef

      ArrayRefからページャを生成

     my	 $entries	 =	 [$e1,	 $e2,	 $e3,	 ...	 $e100];
     Hatena::UgoMemo::Pager::ArrayRef->new(
     	 	 	 	 page	 	 	 	 	 	 	 =>	 $page,
     	 	 	 	 per_page	 	 	 =>	 $per_page,
     	 	 	 	 array	 	 	 	 	 	 =>	 $entries,
     );




                            24
2010年10月17日日曜日
#6 Hatena::Coco::Pager::CachedQueryO?set

   Cache付きPager
     ページングするデータの総数をmemdキャッシュ

  #7 Hatena::Bookmark::Pager::Binary

   余計に一件とってくることで次があるかを判定


  #8 Hatena::Diary::Pager::Lite

    次があるかの判定は外部に任せて、軽量に動作

                       25
2010年10月17日日曜日
以降108まで続く...



2010年10月17日日曜日

More Related Content

ページャ実装マニアックス

  • 1. ページャ実装マニアックス 2010年10月16日 株式会社はてな id:hakobe932 1 2010年10月17日日曜日
  • 2. 自己绍介 ? id:hakobe932 ?? 株式会社はてな アプリケーションエンジニア ? 1年目 (バイト含めると3年目) ? 京都ネイティブ ? はてなココ ? http://d.hatena.ne.jp/hakobe932 2 2010年10月17日日曜日
  • 3. 言语 ? Perl ? JavaScript ? Objective-C ? Java ? Ruby) ? Scala 3 2010年10月17日日曜日
  • 4. id:nagayama さん 3回くらいまちがわれましたが 別人です 2010年10月17日日曜日
  • 7. ページャ スクリーンショットと ページャぶぶんの拡大 2010年10月17日日曜日
  • 8. ページャは さまざまなところで 使われてる 2010年10月17日日曜日
  • 9. はてなにおける 108のページャ実装を 紹介します 2010年10月17日日曜日
  • 10. ページャの多様性 を知りましょう 2010年10月17日日曜日
  • 11. #1 Hatena::Bookmark::Pager Data::Pageに機能追加 my $pager = Hatena::Bookmark::Pager->new; $pager->total_entries(10000); $pager->entries_per_page(20); $pager->current_page(1); $pager->next_page; $pager->last_page; $pager->next_uri; # "次へ" リンク $pager->htmlfy; # ページャHTML 11 2010年10月17日日曜日
  • 12. #2 Hatena::Diary::PagerMaker HTMLを直接生成する ページャの利用目的の大半はHTMLの生成 Hatena::Diary::PagerMaker->new($page)->make( 10000, # total_data_count of => 40, # offset lt => 20, # limit ); # $pageのなかにHTMLがセットされる 12 2010年10月17日日曜日
  • 13. #3 Hatena::UgoMemo::Pager データを生成する方法をページャに渡す 1.Queryオブジェクトを生成 my $query = cmoco('Movie')->query( where => { user_id => $user_id, }, order => 'created DESC', ); ※Query を抽象化したオブジェクト 13 2010年10月17日日曜日
  • 14. #3 Hatena::UgoMemo::Pager 2.Queryオブジェクトからページャを作成 $pager = Hatena::UgoMemo::Pager->new( page => $page, per_page => $per_page, query => $query, # pager自体がqueryを持っている ); 3.使います $pager->items; # ページャが特定のページの $pager->next; # データを生成する! $pager->prev; 14 2010年10月17日日曜日
  • 15. よりみち: ページャの生成 ORMから生成 my $res = moco('Entry')->pager_search( where => { uid => $uid, }, order => 'updated desc', offset => 20, limit => 20, ); $res->{result}; # SELECT の結果 $res->{pager}; # 現在のページの情報をもつ 15 2010年10月17日日曜日
  • 16. よりみち: ページャの生成 Controllerの情報とQueryから生成 package Hoge::App::Users; use base qw(Hoge::App); sub query { # Query オブジェクトを返す } 1; pacakge Hatena::Hoge::Engine::Users; use Hoge::Engine -Base; __PACKGE__->app_class(qw(Hoge::App::Users); sub default :Public { my $r = shift; $r->app->pager; # ページャができてる } 1; 16 2010年10月17日日曜日
  • 19. ページャに関わる要素 ? ページングの対象 ? SQL の 結果 ? ? 配列内のデータ ページングの基準 ? 件数 ? ? 日付 ページングの性能 ? キャッシュ付き ? SQLをなるべく引かない + サービスごとの差異 19 2010年10月17日日曜日
  • 20. Hatena2::Fotolife::Pager_Hatena2::Fotolife::Pager::EntryTime_Hatena2::Fot olife::Pager::Lite_Hatena2::Fotolife::Pager::Util_Hatena2::Fotolife::PagerMa ker_Hatena2::Group::PagerMaker_Hatena::A::GroupPagerMaker_Hatena::A ::GroupPagerMakerMobile_Hatena::A::PagerMaker_Hatena::Bookmark::Ho mePage_Hatena::Bookmark::Pager_Hatena::Bookmark::Pager::Binary_Hate na::Bookmark::Pager::Binary::Mobile_Hatena::Bookmark::Pager::Calendar_ Hatena::Bookmark::Pager::Calendar::Mobile_Hatena::Bookmark::Pager::Qu eryContinuation_Hatena::Coco::Pager::CachedQueryO?set_Hatena::Diary:: Pager_Hatena::Diary::Pager::Lite_Hatena::Diary::PagerMaker_Hatena::Haik u2::MoCo::Pager_Hatena::Haiku2::Pager_Hatena::Haiku2::SimplePager_Hat ena::Happie::Pager_Hatena::Hatena::PagerMaker_Hatena::Keyword::Pager_ Hatena::Let::MoCo::Pager_Hatena::Message::Admin::Pager_Hatena::Messa ge::Pager_Hatena::Monolith::MoCo::Page_Hatena::Monolith::MoCo::PageArr ay_Hatena::Monolith::MoCo::PageO?setLimit_Hatena::Monolith::MoCo::Pag eTimeline_Hatena::My::Pager_Hatena::PagerMaker_Hatena::UgoMemo::Pa ger_Hatena::UgoMemo::Pager::ArrayRef_Hatena::UgoMemo::Pager::Many_ Hatena::UgoMemo::Pager::Merged_Hatena::UgoMemo::Pager::PagerByMui dList_Hatena::UgoMemo::Pager::Search_Hatena::UgoMemo::Pager::Search Solr_Hatena::UgoMemo::Pager::Slice_Hatena::WWW::SimplePager_Updu::P 2010年10月17日日曜日
  • 21. それでは 気をとりなおして 2010年10月17日日曜日
  • 23. #4 Hatena::UgoMemo::Pager::Merged Queryの列を渡して全体をページング Hatena::UgoMemo::Pager::Merged->new( page => $page, per_page => $per_page, queries => @queries, ); 内部では、それぞれから必要な数をとって来て mergeしてsortしてる 23 2010年10月17日日曜日
  • 24. #5Hatena::UgoMemo::Pager::ArrayRef ArrayRefからページャを生成 my $entries = [$e1, $e2, $e3, ... $e100]; Hatena::UgoMemo::Pager::ArrayRef->new( page => $page, per_page => $per_page, array => $entries, ); 24 2010年10月17日日曜日
  • 25. #6 Hatena::Coco::Pager::CachedQueryO?set Cache付きPager ページングするデータの総数をmemdキャッシュ #7 Hatena::Bookmark::Pager::Binary 余計に一件とってくることで次があるかを判定 #8 Hatena::Diary::Pager::Lite 次があるかの判定は外部に任せて、軽量に動作 25 2010年10月17日日曜日