SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
ページャ実装マニアックス


                     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::CachedQueryOffset_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::PageOffsetLimit_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::CachedQueryOffset

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

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

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


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

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

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



2010年10月17日日曜日

Weitere ähnliche Inhalte

Mehr von Yohei Fushii

node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装Yohei Fushii
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
Enhance Anime Watching with Programming
Enhance Anime Watching with ProgrammingEnhance Anime Watching with Programming
Enhance Anime Watching with ProgrammingYohei Fushii
 
Perlで学ぶコルーチン
Perlで学ぶコルーチンPerlで学ぶコルーチン
Perlで学ぶコルーチンYohei Fushii
 

Mehr von Yohei Fushii (6)

node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Enhance Anime Watching with Programming
Enhance Anime Watching with ProgrammingEnhance Anime Watching with Programming
Enhance Anime Watching with Programming
 
Unite with script
Unite with scriptUnite with script
Unite with script
 
Perlで学ぶコルーチン
Perlで学ぶコルーチンPerlで学ぶコルーチン
Perlで学ぶコルーチン
 
初めてのMoose
初めてのMoose初めてのMoose
初めてのMoose
 

Kürzlich hochgeladen

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Kürzlich hochgeladen (9)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

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

  • 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::CachedQueryOffset_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::PageOffsetLimit_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::CachedQueryOffset Cache付きPager ページングするデータの総数をmemdキャッシュ #7 Hatena::Bookmark::Pager::Binary 余計に一件とってくることで次があるかを判定 #8 Hatena::Diary::Pager::Lite 次があるかの判定は外部に任せて、軽量に動作 25 2010年10月17日日曜日