×
  • Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
 

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

on

  • 3,644 views

 

Statistics

Views

Total Views
3,644
Views on SlideShare
2,028
Embed Views
1,616

Actions

Likes
2
Downloads
2
Comments
0

7 Embeds 1,616

http://d.hatena.ne.jp 1540
http://hakobe932.hatenablog.com 67
http://www.freerss.net 4
http://webcache.googleusercontent.com 3
http://static.slidesharecdn.com 2
More...

Accessibility

Categories

Upload Details

Uploaded via SlideShare as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • ページャ実装マニアックス 2010年10月16日 株式会社はてな id:hakobe932 12010年10月17日日曜日
    • 自己紹介 ❖ id:hakobe932 •‣ 株式会社はてな アプリケーションエンジニア ‣ 1年目 (バイト含めると3年目) • 京都ネイティブ • はてなココ • http://d.hatena.ne.jp/hakobe932 22010年10月17日日曜日
    • 言語 • Perl • JavaScript • Objective-C • Java • Ruby) • Scala 32010年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 112010年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がセットされる 122010年10月17日日曜日
    • #3 Hatena::UgoMemo::Pager データを生成する方法をページャに渡す 1.Queryオブジェクトを生成 my $query = cmoco(Movie)->query( where => { user_id => $user_id, }, order => created DESC, ); ※Query を抽象化したオブジェクト 132010年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; 142010年10月17日日曜日
    • よりみち: ページャの生成 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日日曜日
    • よりみち: ページャの生成 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日日曜日
    • 現在 3/1082010年10月17日日曜日
    • あと105個もあるの?2010年10月17日日曜日
    • ページャに関わる要素 ❖ ページングの対象 • SQL の 結果 ❖ • 配列内のデータ ページングの基準 • 件数 ❖ • 日付 ページングの性能 • キャッシュ付き • SQLをなるべく引かない + サービスごとの差異 192010年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::P2010年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してる 232010年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, ); 242010年10月17日日曜日
    • #6 Hatena::Coco::Pager::CachedQueryOffset Cache付きPager ページングするデータの総数をmemdキャッシュ #7 Hatena::Bookmark::Pager::Binary 余計に一件とってくることで次があるかを判定 #8 Hatena::Diary::Pager::Lite 次があるかの判定は外部に任せて、軽量に動作 252010年10月17日日曜日
    • 以降108まで続く...2010年10月17日日曜日