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

6,686 views

Published on

Published in: Technology, Education
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,686
On SlideShare
0
From Embeds
0
Number of Embeds
1,655
Actions
Shares
0
Downloads
6
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

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

  1. 1. ページャ実装マニアックス 2010年10月16日 株式会社はてな id:hakobe932 12010年10月17日日曜日
  2. 2. 自己紹介 ❖ id:hakobe932 •‣ 株式会社はてな アプリケーションエンジニア ‣ 1年目 (バイト含めると3年目) • 京都ネイティブ • はてなココ • http://d.hatena.ne.jp/hakobe932 22010年10月17日日曜日
  3. 3. 言語 • Perl • JavaScript • Objective-C • Java • Ruby) • Scala 32010年10月17日日曜日
  4. 4. id:nagayama さん 3回くらいまちがわれましたが 別人です2010年10月17日日曜日
  5. 5. ページャ2010年10月17日日曜日
  6. 6. ページャ2010年10月17日日曜日
  7. 7. ページャ スクリーンショットと ページャぶぶんの拡大2010年10月17日日曜日
  8. 8. ページャは さまざまなところで 使われてる2010年10月17日日曜日
  9. 9. はてなにおける 108のページャ実装を 紹介します2010年10月17日日曜日
  10. 10. ページャの多様性 を知りましょう2010年10月17日日曜日
  11. 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 112010年10月17日日曜日
  12. 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がセットされる 122010年10月17日日曜日
  13. 13. #3 Hatena::UgoMemo::Pager データを生成する方法をページャに渡す 1.Queryオブジェクトを生成 my $query = cmoco(Movie)->query( where => { user_id => $user_id, }, order => created DESC, ); ※Query を抽象化したオブジェクト 132010年10月17日日曜日
  14. 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; 142010年10月17日日曜日
  15. 15. よりみち: ページャの生成 ORMから生成 my $res = moco(Entry)->pager_search( where => { uid => $uid, }, order => updated desc, offset => 20, limit => 20, ); $res->{result}; # SELECT の結果 $res->{pager}; # 現在のページの情報をもつ 152010年10月17日日曜日
  16. 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; 162010年10月17日日曜日
  17. 17. 現在 3/1082010年10月17日日曜日
  18. 18. あと105個もあるの?2010年10月17日日曜日
  19. 19. ページャに関わる要素 ❖ ページングの対象 • SQL の 結果 ❖ • 配列内のデータ ページングの基準 • 件数 ❖ • 日付 ページングの性能 • キャッシュ付き • SQLをなるべく引かない + サービスごとの差異 192010年10月17日日曜日
  20. 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::P2010年10月17日日曜日
  21. 21. それでは 気をとりなおして2010年10月17日日曜日
  22. 22. 4/108 から2010年10月17日日曜日
  23. 23. #4 Hatena::UgoMemo::Pager::Merged Queryの列を渡して全体をページング Hatena::UgoMemo::Pager::Merged->new( page => $page, per_page => $per_page, queries => @queries, ); 内部では、それぞれから必要な数をとって来て mergeしてsortしてる 232010年10月17日日曜日
  24. 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, ); 242010年10月17日日曜日
  25. 25. #6 Hatena::Coco::Pager::CachedQueryOffset Cache付きPager ページングするデータの総数をmemdキャッシュ #7 Hatena::Bookmark::Pager::Binary 余計に一件とってくることで次があるかを判定 #8 Hatena::Diary::Pager::Lite 次があるかの判定は外部に任せて、軽量に動作 252010年10月17日日曜日
  26. 26. 以降108まで続く...2010年10月17日日曜日

×