ページャ実装マニアックス
- 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日日曜日
- 7. ページャ
スクリーンショットと
ページャぶぶんの拡大
2010年10月17日日曜日
- 8. ページャは
さまざまなところで
使われてる
2010年10月17日日曜日
- 9. はてなにおける
108のページャ実装を
紹介します
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日日曜日
- 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日日曜日