Quick Upload

Loading...
Flash Player 9 (or above) is needed to view slideshows. We have detected that you do not have it on your computer.To install it, go here
Post to Twitter Post to Twitter
Share on Facebook
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

Jifty

from gslin, 2 years ago Add as contact

1450 views | 0 comments | 0 favorites | 0 embeds (Stats)

Desc: Jifty by Audrey Tang in OSDC.tw 2007

Embed customize close
 

Categories

Tags

Groups/Events

More Info

This slideshow is Public

Views: 1450 Comments: 0 Favorites: 0 Downloads: 53

View Details: 1450 on Slideshare 0 from embeds
Flagged as inappropriate Flag as inappropriate

Flag as inappropriate

Select your reason for flagging this slideshow as inappropriate.

If needed, use the feedback form to let us know more details.

Slideshow Transcript

  1. Slide 1: Jifty 1
  2. Slide 2: ⚁ 2
  3. Slide 3: 2007/04/01 3
  4. Slide 4: 2007/04/01 ⚁ 3
  5. Slide 5: 2007/04/01 ⚁ 
YAPC::Asia
 ⚁ 3
  6. Slide 6: 2007/04/01 ⚁ 
YAPC::Asia
 ⚁ :
 ! ⚁ 3
  7. Slide 7: <@ij1iao>
JIT
 4
  8. Slide 8: <@ij1iao>
JIT
 4
  9. Slide 9: <@ij1iao>
JIT
 4
  10. Slide 10: 5
  11. Slide 11: ⚁ 5
  12. Slide 12: ⚁ ? ⚁ 5
  13. Slide 13: ⚁ ? ⚁ :
 ! ⚁ 5
  14. Slide 14: 
 6
  15. Slide 15: 
 7
  16. Slide 16: 
 7
  17. Slide 17: 
 8
  18. Slide 18: 9
  19. Slide 19: ⚁ 9
  20. Slide 20: ⚁ ⚁ 9
  21. Slide 21: ⚁ ⚁ ,
 ! ⚁ 9
  22. Slide 22: Pick! 10
  23. Slide 23: Pick! “ ” 10
  24. Slide 24: Pick! 11
  25. Slide 25: Pick! 11
  26. Slide 26: Pick! 12
  27. Slide 27: Pick! 12
  28. Slide 28: Pick! 13
  29. Slide 29: Pick! 13
  30. Slide 30: Pick! 14
  31. Slide 31: ... 15
  32. Slide 32: ... ! 16
  33. Slide 33: 17
  34. Slide 34: Jifty 18
  35. Slide 35: Jifty 18
  36. Slide 36: Jifty 
=
 18
  37. Slide 37: Jifty 
=
 
=
 18
  38. Slide 38: Jifty
=
JFDI 19
  39. Slide 39: Jifty
=
JFDI Just
F*cking
Do
It 19
  40. Slide 40: Jifty
=
JFDI Just
F*cking
Do
It 
JFDI 19
  41. Slide 41: Jifty
=
JFDI Just
F*cking
Do
It 
JFDI 
Doxory! 19
  42. Slide 42: 20
  43. Slide 43: • $
cpan 20
  44. Slide 44: • $
cpan • cpan>
notest
install
Jifty 20
  45. Slide 45: • $
cpan • cpan>
notest
install
Jifty “notest”
 . 20
  46. Slide 46: 21
  47. Slide 47: • $
jifty
app
‐‐name
Doxory 21
  48. Slide 48: • $
jifty
app
‐‐name
Doxory • Creating
new
application
Doxory Creating
directory
lib Creating
directory
lib/Doxory Creating
directory
bin Creating
directory
etc Creating
directory
doc Creating
directory
log Creating
directory
var Creating
directory
var/mason Creating
directory
share Creating
directory
share/po Creating
directory
share/web Creating
directory
share/web/templates Creating
directory
share/web/static Creating
directory
lib/Doxory/Model Creating
directory
lib/Doxory/Action Creating
directory
t Creating
configuration
file
Doxory/etc/config.yml 21
  49. Slide 49: 22
  50. Slide 50: bin/jifty 22
  51. Slide 51: bin/jifty etc/config.yml 22
  52. Slide 52: bin/jifty etc/config.yml Makefile.PL 22
  53. Slide 53: 23
  54. Slide 54: • $
jifty
server 23
  55. Slide 55: • $
jifty
server • INFO
‐
You
can
connect
to
your
server
at 






http://localhost:8888/ 23
  56. Slide 56: ! 24
  57. Slide 57: ! 
Doxory. 

(Users)
 ? 24
  58. Slide 58: 25
  59. Slide 59: • $
cd
Doxory 25
  60. Slide 60: • $
cd
Doxory • $
jifty
model
‐‐name
User 25
  61. Slide 61: • $
cd
Doxory • $
jifty
model
‐‐name
User • Writing
file
t/00‐model‐User.t Writing
file
lib/Doxory/Model/User.pm 25
  62. Slide 62: • $
cd
Doxory • $
jifty
model
‐‐name
User • Writing
file
t/00‐model‐User.t Writing
file
lib/Doxory/Model/User.pm • $
vim
lib/Doxory/Model/User.pm 25
  63. Slide 63: • package
Doxory::Model::User; • use
Jifty::DBI::Schema; • 
 • use
Doxory::Record
schema
{ • 
 • 
 • }; 26
  64. Slide 64: • package
Doxory::Model::User; • use
Jifty::DBI::Schema; • 
 • use
Doxory::Record
schema
{ • 
 • column
name
=> • 



label
is
'Username', • 



hints
is
'Other
people
see
this
when
you
ask
questions.', • 



is
distinct, • 



is
mandatory; • 
 • column
email
=> • 



label
is
'Email', • 



hints
is
'We
will
not
sell
it
to
anybody.
Honest.', • 



default
is
'', • 



is
distinct, • 



is
immutable; • 
 • }; 27
  65. Slide 65: 28
  66. Slide 66: • $
jifty
schema
‐‐setup 28
  67. Slide 67: • $
jifty
schema
‐‐setup • INFO
‐
Generating
SQL
for
application
Doxory... INFO
‐
Using
Doxory::Model::User INFO
‐
Using
Jifty::Model::Session INFO
‐
Using
Jifty::Model::Metadata INFO
‐
Set
up
version
v0.0.1,
jifty
version
0.701170 28
  68. Slide 68: • $
jifty
schema
‐‐setup • INFO
‐
Generating
SQL
for
application
Doxory... INFO
‐
Using
Doxory::Model::User INFO
‐
Using
Jifty::Model::Session INFO
‐
Using
Jifty::Model::Metadata INFO
‐
Set
up
version
v0.0.1,
jifty
version
0.701170 • $
jifty
server
& 28
  69. Slide 69: • $
jifty
schema
‐‐setup • INFO
‐
Generating
SQL
for
application
Doxory... INFO
‐
Using
Doxory::Model::User INFO
‐
Using
Jifty::Model::Session INFO
‐
Using
Jifty::Model::Metadata INFO
‐
Set
up
version
v0.0.1,
jifty
version
0.701170 • $
jifty
server
& • INFO
‐
You
can
connect
to
your
server
at 






http://localhost:8888/ 28
  70. Slide 70: • $
jifty
schema
‐‐setup • INFO
‐
Generating
SQL
for
application
Doxory... INFO
‐
Using
Doxory::Model::User INFO
‐
Using
Jifty::Model::Session INFO
‐
Using
Jifty::Model::Metadata INFO
‐
Set
up
version
v0.0.1,
jifty
version
0.701170 • $
jifty
server
& • INFO
‐
You
can
connect
to
your
server
at 






http://localhost:8888/ • $
open
http://localhost:8888/ 28
  71. Slide 71: 29
  72. Slide 72: 29
  73. Slide 73: 30
  74. Slide 74: 30
  75. Slide 75: 31
  76. Slide 76: 31
  77. Slide 77: 32
  78. Slide 78: 32
  79. Slide 79: 33
  80. Slide 80: AudreyT 33
  81. Slide 81: AudreyT 33
  82. Slide 82: 34
  83. Slide 83: 
(Choice)
 . 34
  84. Slide 84: 35
  85. Slide 85: $
jifty
model
‐‐name
Choice 35
  86. Slide 86: $
jifty
model
‐‐name
Choice Writing
file
t/00‐model‐Choice.t Writing
file
lib/Doxory/Model/Choice.pm 35
  87. Slide 87: $
jifty
model
‐‐name
Choice Writing
file
t/00‐model‐Choice.t Writing
file
lib/Doxory/Model/Choice.pm $
vim
lib/Doxory/Model/Choice.pm 35
  88. Slide 88: • package
Doxory::Model::Choice; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{ • 
 • column
name
=> • 



label
is
'I
need
help
deciding...', • 



render
as
'textarea'; • 
 • column
a
=> • 



label
is
'On
the
one
hand', • 



render
as
'textarea',
is
mandatory; • column
b
=> • 



label
is
'On
the
other
hand', • 



render
as
'textarea',
is
mandatory; • column
asked_by
=> • 



label
is
'Asked
by', • 



default
is
defer
{
Jifty‐>web‐>current_user‐>id
}, • 



references
Doxory::Model::User; • 
 • }; 36
  89. Slide 89: 37
  90. Slide 90: • $
jifty
schema
‐‐drop‐database
‐‐setup 37
  91. Slide 91: • $
jifty
schema
‐‐drop‐database
‐‐setup • INFO
‐
Generating
SQL
for
application
Doxory... INFO
‐
Using
Doxory::Model::User INFO
‐
Using
Doxory::Model::Choice INFO
‐
Using
Jifty::Model::Session INFO
‐
Using
Jifty::Model::Metadata INFO
‐
Set
up
version
v0.0.1,
jifty
version
0.701170 37
  92. Slide 92: • $
jifty
schema
‐‐drop‐database
‐‐setup • INFO
‐
Generating
SQL
for
application
Doxory... INFO
‐
Using
Doxory::Model::User INFO
‐
Using
Doxory::Model::Choice INFO
‐
Using
Jifty::Model::Session INFO
‐
Using
Jifty::Model::Metadata INFO
‐
Set
up
version
v0.0.1,
jifty
version
0.701170 • $
open
http://localhost:8888/ 37
  93. Slide 93: 38
  94. Slide 94: 38
  95. Slide 95: 39
  96. Slide 96: 39
  97. Slide 97: 40
  98. Slide 98: 40
  99. Slide 99: 41
  100. Slide 100: 41
  101. Slide 101: 42
  102. Slide 102: 42
  103. Slide 103: 43
  104. Slide 104: ! ... ? 43
  105. Slide 105: ✍ 44
  106. Slide 106: 45
  107. Slide 107: •$
vim
etc/config.yml 45
  108. Slide 108: •$
vim
etc/config.yml . 45
  109. Slide 109: •‐‐‐ •framework: •

Plugins: •



‐
SkeletonApp:
{} •



‐
REST:
{} •



‐
Halo:
{} •



‐
ErrorTemplates:
{} •



‐
CompressedCSSandJS:
{} •
 •
 • 46
  110. Slide 110: •‐‐‐ •framework: •

Plugins: •



‐
SkeletonApp:
{} •



‐
REST:
{} •



‐
Halo:
{} •



‐
ErrorTemplates:
{} •



‐
CompressedCSSandJS:
{} •



‐
Authentication::Password:
{} •

SkipAccessControl:
1 • 47
  111. Slide 111: •‐‐‐ •framework: •

Plugins: •



‐
SkeletonApp:
{} •



‐
REST:
{} •



‐
Halo:
{} •



‐
ErrorTemplates:
{} •



‐
CompressedCSSandJS:
{} •



‐
Authentication::Password:
{} •

SkipAccessControl:
1 • 
(ACL). 47
  112. Slide 112: 48
  113. Slide 113: •$
vim
lib/Doxory/Model/User.pm 48
  114. Slide 114: •$
vim
lib/Doxory/Model/User.pm 
User.pm
 
mixin. 48
  115. Slide 115: • package
Doxory::Model::User; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{ • 
 • column
name
=> • 



label
is
'Username', • 



hints
is
'Other
people
see
this
when
you
ask
questions.', • 



is
distinct, • 



is
mandatory; • 
 • column
email
=> • 



label
is
'Email', • 



hints
is
'We
will
not
sell
it
to
anybody.
Honest.', • 



default
is
'', • 



is
distinct, • 



is
immutable;
 • }; • 49
  116. Slide 116: • package
Doxory::Model::User; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{ • 
 • column
name
=> • 



label
is
'Username', • 



hints
is
'Other
people
see
this
when
you
ask
questions.', • 



is
distinct, • 



is
mandatory; • 
 • column
email
=> • 



label
is
'Email', • 



hints
is
'We
will
not
sell
it
to
anybody.
Honest.', • 



default
is
'', • 



is
distinct, • 



is
immutable;
 • }; • use
Jifty::Plugin::User::Mixin::Model::User; • use
Jifty::Plugin::Authentication::Password::Mixin::Model::User; 50
  117. Slide 117: 51
  118. Slide 118: 51
  119. Slide 119: 52
  120. Slide 120: 52
  121. Slide 121: 53
  122. Slide 122: From: Doxory <> Date: April 3, 2007 5:43:07 PM JST To: jesse@bestpractical.com Subject: Doxory! ( ) Doxory . , : http://127.0.0.1:8888/let/jesse%40bestpractical.com/confirm_email/78f28e934cf6c058 53
  123. Slide 123: From: Doxory <> Date: April 3, 2007 5:43:07 PM JST To: jesse@bestpractical.com Subject: Doxory! ( ) Doxory . , : http://127.0.0.1:8888/let/jesse%40bestpractical.com/confirm_email/78f28e934cf6c058 53
  124. Slide 124: 54
  125. Slide 125: 54
  126. Slide 126: 55
  127. Slide 127: ... ( ?) 55
  128. Slide 128: ❁ 56
  129. Slide 129: 57
  130. Slide 130: •$
vim
lib/Doxory/Dispatcher.pm 57
  131. Slide 131: •$
vim
lib/Doxory/Dispatcher.pm Dispatcher
 
(View). 57
  132. Slide 132: 58
  133. Slide 133: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; 58
  134. Slide 134: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ 58
  135. Slide 135: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; 







$top‐>child(
'Choices'
=>
url
=>
'/choices'
); 58
  136. Slide 136: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; 







$top‐>child(
'Choices'
=>
url
=>
'/choices'
); • 



} 58
  137. Slide 137: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; 







$top‐>child(
'Choices'
=>
url
=>
'/choices'
); • 



} • 



elsif
($1
!~
/^login|^signup/)
{ 







tangent
'login'; 



} }; 58
  138. Slide 138: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; 







$top‐>child(
'Choices'
=>
url
=>
'/choices'
); • 



} • 



elsif
($1
!~
/^login|^signup/)
{ 







tangent
'login'; 



} }; • #
on
'/'







=>
show
'/'; 58
  139. Slide 139: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; 







$top‐>child(
'Choices'
=>
url
=>
'/choices'
); • 



} • 



elsif
($1
!~
/^login|^signup/)
{ 







tangent
'login'; 



} }; • #
on
'/'







=>
show
'/'; • #
on
'/choices'
=>
show
'choices'; 58
  140. Slide 140: 59
  141. Slide 141: 
“/”
 . 59
  142. Slide 142: 60
  143. Slide 143: •$
vim
lib/Doxory/View.pm 60
  144. Slide 144: •$
vim
lib/Doxory/View.pm 


 TT2
 ! 
Mason
 ! 60
  145. Slide 145: 61
  146. Slide 146: • package
Doxory::View; use
Jifty::View::Declare
‐base; 61
  147. Slide 147: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} 61
  148. Slide 148: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; 61
  149. Slide 149: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; 61
  150. Slide 150: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ 61
  151. Slide 151: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ • 







my
$action
=
new_action(
class
=>
'CreateChoice'
); 61
  152. Slide 152: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ • 







my
$action
=
new_action(
class
=>
'CreateChoice'
); • 







render_action(
$action
=>
['name',
'a',
'b']
); 61
  153. Slide 153: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ • 







my
$action
=
new_action(
class
=>
'CreateChoice'
); • 







render_action(
$action
=>
['name',
'a',
'b']
); • 







form_submit(
label
=>
'Ask
the
Crowd!'
); 61
  154. Slide 154: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ • 







my
$action
=
new_action(
class
=>
'CreateChoice'
); • 







render_action(
$action
=>
['name',
'a',
'b']
); • 







form_submit(
label
=>
'Ask
the
Crowd!'
); • 



}
} 61
  155. Slide 155: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{ 



h1
{
'Ask
a
question!'
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ • 







my
$action
=
new_action(
class
=>
'CreateChoice'
); • 







render_action(
$action
=>
['name',
'a',
'b']
); • 







form_submit(
label
=>
'Ask
the
Crowd!'
); • 



}
} • }; 61
  156. Slide 156: 62
  157. Slide 157: 62
  158. Slide 158: 63
  159. Slide 159: column
a
=> 



label
is
'On
the
one
hand', 



render
as
'textarea', 



is
mandatory; 63
  160. Slide 160: 64
  161. Slide 161: 64
  162. Slide 162: 65
  163. Slide 163: 
“choices”
 . 65
  164. Slide 164: •$
vim
lib/Doxory/View.pm 66
  165. Slide 165: 67
  166. Slide 166: • package
Doxory::View; use
Jifty::View::Declare
‐base; 67
  167. Slide 167: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; 67
  168. Slide 168: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; • template
choices
=>
page
{ 67
  169. Slide 169: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; • template
choices
=>
page
{ • 



h1
{
'My
Choices'
} 



dl
{ 67
  170. Slide 170: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; • template
choices
=>
page
{ • 



h1
{
'My
Choices'
} 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); 67
  171. Slide 171: • package
Doxory::View; use
Jifty::View::Declare
‐base; • template
'/'
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; • template
choices
=>
page
{ • 



h1
{
'My
Choices'
} 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); • 







while
(my
$c
=
$choices‐>next)
{ 











dt
{
$c‐>name,
'
(',
$c‐>asked_by‐>name,
')'
} 











dd
{
b
{
$c‐>a
}
em
{
'vs'
}
b
{
$c‐>b
}
} 







} 



} }; 67
  172. Slide 172: 68
  173. Slide 173: ...
 ?
 68
  174. Slide 174: ☑ 69
  175. Slide 175: 70
  176. Slide 176: • $
jifty
model
‐‐name
Vote 70
  177. Slide 177: • $
jifty
model
‐‐name
Vote • Writing
file
t/00‐model‐Vote.t Writing
file
lib/Doxory/Model/Vote.pm 70
  178. Slide 178: • $
jifty
model
‐‐name
Vote • Writing
file
t/00‐model‐Vote.t Writing
file
lib/Doxory/Model/Vote.pm • $
vim
lib/Doxory/Model/Vote.pm 70
  179. Slide 179: • package
Doxory::Model::Vote; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{ • 
 • column
choice
=> • 



references
Doxory::Model::Choice; • 
 • column
voter
=> • 



references
Doxory::Model::User; • column
suggestion
=> • 



valid
are
qw(
a
b
skip
); • column
comments
=> • 



label
is
'Comments?', • 



render
as
'textarea’; • 
 • }; 71
  180. Slide 180: 72
  181. Slide 181: 72
  182. Slide 182: 73
  183. Slide 183: 
“pick”
 . 73
  184. Slide 184: •$
vim
lib/Doxory/Dispatcher.pm 74
  185. Slide 185: •$
vim
lib/Doxory/Dispatcher.pm 
/pick
 . 74
  186. Slide 186: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; • 







$top‐>child(
'Pick!'
=>
url
=>
'/pick'
); • 







$top‐>child(
'Choices'
=>
url
=>
'/choices'
); • 



} • 



elsif
($1
!~
/^login|^signup/)
{ • 







tangent
'login'; 



} • }; • on
'/'
=>
show
'new_choice'; 75
  187. Slide 187: • package
Doxory::Dispatcher; • ... • on
pick
=>
run
{ • 



my
$choices
=
Doxory::Model::ChoiceCollection‐>new; • 



my
$votes


=
$choices‐>join( • 







type



=>
'left', • 







alias1

=>
'main',

column1
=>
'id', • 







table2

=>
'votes',
column2
=>
'choice', • 



);

 • 



$choices‐>limit( • 







leftjoin
=>
$votes,
column

=>
'voter', • 







value



=>
Jifty‐>web‐>current_user‐>id, • 



);

 • 



$choices‐>limit( • 







alias



=>
$votes,
column

=>
'voter', • 







operator
=>
'IS',


value


=>
'NULL', • 



); • 



if
(my
$c
=
$choices‐>first)
{ • 







set
choice
=>
$c; • 



}


 • 



else
{ • 







show
'nothing_to_pick'; • 



}


 • }; 76
  188. Slide 188: • package
Doxory::Dispatcher; • ... • on
pick
=>
run
{ • 



my
$choices
=
Doxory::Model::ChoiceCollection‐>new; • 



my
$votes


=
$choices‐>join( • 







type



=>
'left', • 







alias1

=>
'main',

column1
=>
'id', • 







table2

=>
'votes',
column2
=>
'choice', • 



);

 • 



$choices‐>limit( • 







leftjoin
=>
$votes,
column

=>
'voter', • 







value



=>
Jifty‐>web‐>current_user‐>id, • 



);

 • 



$choices‐>limit( • 







alias



=>
$votes,
column

=>
'voter', • 







operator
=>
'IS',


value


=>
'NULL', • 



); • 



if
(my
$c
=
$choices‐>first)
{ • 







set
choice
=>
$c; • 



}


 “ ” • 



else
{ • 







show
'nothing_to_pick'; • 



}


 • }; 76
  189. Slide 189: •$
vim
lib/Doxory/View.pm 77
  190. Slide 190: 78
  191. Slide 191: • package
Doxory::View; 78
  192. Slide 192: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; 78
  193. Slide 193: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ 78
  194. Slide 194: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); 78
  195. Slide 195: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); 78
  196. Slide 196: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); • 



my
$redir

=
new_action( 







class




=>
"Jifty::Action::Redirect", 







arguments
=>
{
url
=>
'/pick'
}, 



); 78
  197. Slide 197: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); • 



my
$redir

=
new_action( 







class




=>
"Jifty::Action::Redirect", 







arguments
=>
{
url
=>
'/pick'
}, 



); • 



my
%args


=
( 







choice
=>
$choice‐>id, 







voter

=>
Jifty‐>web‐>current_user‐>id, 



); 78
  198. Slide 198: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); • 



my
$redir

=
new_action( 







class




=>
"Jifty::Action::Redirect", 







arguments
=>
{
url
=>
'/pick'
}, 



); • 



my
%args


=
( 







choice
=>
$choice‐>id, 







voter

=>
Jifty‐>web‐>current_user‐>id, 



); • 



h1
{
$choice‐>asked_by‐>name,
':
',
$choice‐>name
} 78
  199. Slide 199: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); • 



my
$redir

=
new_action( 







class




=>
"Jifty::Action::Redirect", 







arguments
=>
{
url
=>
'/pick'
}, 



); • 



my
%args


=
( 







choice
=>
$choice‐>id, 







voter

=>
Jifty‐>web‐>current_user‐>id, 



); • 



h1
{
$choice‐>asked_by‐>name,
':
',
$choice‐>name
} • 



div
{
form
{ 78
  200. Slide 200: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); • 



my
$redir

=
new_action( 







class




=>
"Jifty::Action::Redirect", 







arguments
=>
{
url
=>
'/pick'
}, 



); • 



my
%args


=
( 







choice
=>
$choice‐>id, 







voter

=>
Jifty‐>web‐>current_user‐>id, 



); • 



h1
{
$choice‐>asked_by‐>name,
':
',
$choice‐>name
} • 



div
{
form
{ • 







my
($x,
$y)
=
map
{
$action‐>button( 











submit





=>
[
$action,
$redir
], 











label






=>
$choice‐>$_, 











arguments


=>
{
suggestion
=>
$_,
%args
}, 







)
}
((rand
>
0.5)
?
('a',
'b')
:
('b',
'a')); 78
  201. Slide 201: • package
Doxory::View; • use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
choices
=>
sub
{
...
}; • template
pick
=>
page
{ • 



my
$choice
=
get('choice'); • 



my
$action
=
new_action(
class
=>
'CreateVote'
); • 



my
$redir

=
new_action( 







class




=>
"Jifty::Action::Redirect", 







arguments
=>
{
url
=>
'/pick'
}, 



); • 



my
%args


=
( 







choice
=>
$choice‐>id, 







voter

=>
Jifty‐>web‐>current_user‐>id, 



); • 



h1
{
$choice‐>asked_by‐>name,
':
',
$choice‐>name
} • 



div
{
form
{ • 







my
($x,
$y)
=
map
{
$action‐>button( 











submit





=>
[
$action,
$redir
], 











label






=>
$choice‐>$_, 











arguments


=>
{
suggestion
=>
$_,
%args
}, 







)
}
((rand
>
0.5)
?
('a',
'b')
:
('b',
'a')); • 







span
{
$x
}
em
{
'or'
}
span
{
$y
}
em
{
'or'
}
span
{ 











$action‐>button( 















submit





=>
[
$action,
$redir
], 















label






=>
'None
of
the
above', 















arguments


=>
{
suggestion
=>
'skip',
%args
}, 











); 







} 







p
{
render_param(
$action
=>
'comments'
)
} 



}
} }; 78
  202. Slide 202: 79
  203. Slide 203: • package
Doxory::View; use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; template
choices
=>
page
{
...
}; template
pick
=>
page
{
...
}; 79
  204. Slide 204: • package
Doxory::View; use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; template
choices
=>
page
{
...
}; template
pick
=>
page
{
...
}; • template
nothing_to_pick
=>
page
{ 



h1
{
"There's
nothing
for
you
to
pick."
} 79
  205. Slide 205: • package
Doxory::View; use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; template
choices
=>
page
{
...
}; template
pick
=>
page
{
...
}; • template
nothing_to_pick
=>
page
{ 



h1
{
"There's
nothing
for
you
to
pick."
} • 



p
{
"No
one
you
know
is
angsting
about
anything. 








Everybody
knows
where
they're
going
to
dinner, 








what
to
do
on
their
next
date
and
whether
to 








drop
that
class.

You
have
such
lovely
and 








well
adjusted
friends."
} 79
  206. Slide 206: • package
Doxory::View; use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; template
choices
=>
page
{
...
}; template
pick
=>
page
{
...
}; • template
nothing_to_pick
=>
page
{ 



h1
{
"There's
nothing
for
you
to
pick."
} • 



p
{
"No
one
you
know
is
angsting
about
anything. 








Everybody
knows
where
they're
going
to
dinner, 








what
to
do
on
their
next
date
and
whether
to 








drop
that
class.

You
have
such
lovely
and 








well
adjusted
friends."
} • 



h2
{
"Maybe
it's
time
to
ask
for
some
advice..."
}; 79
  207. Slide 207: • package
Doxory::View; use
Jifty::View::Declare
‐base; template
''
=>
page
{
...
}; private
template
new_choice
=>
sub
{
...
}; template
choices
=>
page
{
...
}; template
pick
=>
page
{
...
}; • template
nothing_to_pick
=>
page
{ 



h1
{
"There's
nothing
for
you
to
pick."
} • 



p
{
"No
one
you
know
is
angsting
about
anything. 








Everybody
knows
where
they're
going
to
dinner, 








what
to
do
on
their
next
date
and
whether
to 








drop
that
class.

You
have
such
lovely
and 








well
adjusted
friends."
} • 



h2
{
"Maybe
it's
time
to
ask
for
some
advice..."
}; • 



show
'new_choice'; }; 79
  208. Slide 208: 80
  209. Slide 209: 81
  210. Slide 210: 81
  211. Slide 211: 82
  212. Slide 212: 
choices
 , . 82
  213. Slide 213: •$
vim
lib/Doxory/Model/Choice.pm 83
  214. Slide 214: • package
Doxory::Model::Choice; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{
...
} • sub
in_favor_of_a
{ • 



my
$self
=
shift; • 



$self‐>in_favor_of('a'); • } • sub
in_favor_of_b
{ • 



my
$self
=
shift; • 



$self‐>in_favor_of('b'); • } • sub
in_favor_of
{ • 



my
($self,
$x)
=
@_; • 



my
$votes
=
Doxory::Model::VoteCollection‐>new; • 



$votes‐>limit(column
=>
'choice',




value
=>
$self‐>id); • 



$votes‐>limit(column
=>
'suggestion',
value
=>
$x); • 



return
$votes; • } • 84
  215. Slide 215: •$
vim
lib/Doxory/View.pm 85
  216. Slide 216: 86
  217. Slide 217: 86
  218. Slide 218: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... 86
  219. Slide 219: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} 86
  220. Slide 220: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ 86
  221. Slide 221: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); 86
  222. Slide 222: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); • 







while
(my
$c
=
$choices‐>next)
{ 











dt
{
$c‐>name,
'
(',
$c‐>asked_by‐>name,
')'
} 











dd
{ 86
  223. Slide 223: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); • 







while
(my
$c
=
$choices‐>next)
{ 











dt
{
$c‐>name,
'
(',
$c‐>asked_by‐>name,
')'
} 











dd
{ • 















b
{
$c‐>a,
'
(',
$c‐>in_favor_of_a‐>count,
')'
} 86
  224. Slide 224: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); • 







while
(my
$c
=
$choices‐>next)
{ 











dt
{
$c‐>name,
'
(',
$c‐>asked_by‐>name,
')'
} 











dd
{ • 















b
{
$c‐>a,
'
(',
$c‐>in_favor_of_a‐>count,
')'
} • 















em
{
'vs'
} 86
  225. Slide 225: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); • 







while
(my
$c
=
$choices‐>next)
{ 











dt
{
$c‐>name,
'
(',
$c‐>asked_by‐>name,
')'
} 











dd
{ • 















b
{
$c‐>a,
'
(',
$c‐>in_favor_of_a‐>count,
')'
} • 















em
{
'vs'
} • 















b
{
$c‐>b,
'
(',
$c‐>in_favor_of_b‐>count,
')'
} 86
  226. Slide 226: • package
Doxory::View; use
Jifty::View::Declare
‐base; ... • template
choices
=>
page
{ 



h1
{
'My
Choices'
} • 



dl
{ • 







my
$choices
=
Doxory::Model::ChoiceCollection‐>new; 







$choices‐>limit( 











column
=>
'asked_by', 











value

=>
Jifty‐>web‐>current_user‐>id, 







); • 







while
(my
$c
=
$choices‐>next)
{ 











dt
{
$c‐>name,
'
(',
$c‐>asked_by‐>name,
')'
} 











dd
{ • 















b
{
$c‐>a,
'
(',
$c‐>in_favor_of_a‐>count,
')'
} • 















em
{
'vs'
} • 















b
{
$c‐>b,
'
(',
$c‐>in_favor_of_b‐>count,
')'
} • 











} 







} 



} }; 86
  227. Slide 227: 87
  228. Slide 228: :
 .
☺ 87
  229. Slide 229: ! 88
  230. Slide 230: ! lib/Doxory/Model/User.pm 88
  231. Slide 231: ! lib/Doxory/Model/User.pm lib/Doxory/Model/Choice.pm 88
  232. Slide 232: ! lib/Doxory/Model/User.pm lib/Doxory/Model/Choice.pm lib/Doxory/Model/Vote.pm 88
  233. Slide 233: ! lib/Doxory/Model/User.pm lib/Doxory/Model/Choice.pm lib/Doxory/Model/Vote.pm lib/Doxory/Dispatcher.pm 88
  234. Slide 234: ! lib/Doxory/Model/User.pm lib/Doxory/Model/Choice.pm lib/Doxory/Model/Vote.pm lib/Doxory/Dispatcher.pm lib/Doxory/View.pm 88
  235. Slide 235: ! lib/Doxory/Model/User.pm lib/Doxory/Model/Choice.pm lib/Doxory/Model/Vote.pm lib/Doxory/Dispatcher.pm lib/Doxory/View.pm 88
  236. Slide 236: ☈ 89
  237. Slide 237: 90
  238. Slide 238: ☈ Doxory
 90
  239. Slide 239: ☈ Doxory
 ☈ 90
  240. Slide 240: ☈ Doxory
 ☈ ☈ ... 90
  241. Slide 241: Doxory
 91
  242. Slide 242: Doxory
 ☈ ! 91
  243. Slide 243: Doxory
 ☈ ! ☈ 91
  244. Slide 244: Doxory
 ☈ ! ☈ ☈ vim
lib/Doxory/Model/Choice.pm 91
  245. Slide 245: 92
  246. Slide 246: • package
Doxory::Model::Choice; 92
  247. Slide 247: • package
Doxory::Model::Choice; • use
Regexp::Common
'profanity_us'; 92
  248. Slide 248: • package
Doxory::Model::Choice; • use
Regexp::Common
'profanity_us'; • sub
validate_name
{ 


my
($self,
$name)
=
@_; 92
  249. Slide 249: • package
Doxory::Model::Choice; • use
Regexp::Common
'profanity_us'; • sub
validate_name
{ 


my
($self,
$name)
=
@_; • 


if
($name
=~
/$RE{profanity}/i)
{ 






return
( 










0,
'Would
you
speak
like
that
'. 













'in
front
of
your
mother?
*cough*' 






); 


} 92
  250. Slide 250: • package
Doxory::Model::Choice; • use
Regexp::Common
'profanity_us'; • sub
validate_name
{ 


my
($self,
$name)
=
@_; • 


if
($name
=~
/$RE{profanity}/i)
{ 






return
( 










0,
'Would
you
speak
like
that
'. 













'in
front
of
your
mother?
*cough*' 






); 


} • 


return
1; } 92
  251. Slide 251: 93
  252. Slide 252: 
(Validator) 94
  253. Slide 253: 
(Validator) ☈ 94
  254. Slide 254: 
(Validator) ☈ ☈ 94
  255. Slide 255: 
(Validator) ☈ ☈ ☈ ! 94
  256. Slide 256: • package
Doxory::Model::Choice; use
Regexp::Common
'profanity_us'; • sub
canonicalize_name
{ • 


my
($self,
$name)
=
@_; • 


$name
=~
s/$RE{profanity}/**expletives**/gi; • 


return
$name; •} 95
  257. Slide 257: 96
  258. Slide 258: 
(Canonicalizer) 97
  259. Slide 259: 
(Canonicalizer) ☈ 
Model
 97
  260. Slide 260: 
(Canonicalizer) ☈ 
Model
 ☈ 
(Autocompleter)
 97
  261. Slide 261: 
(Canonicalizer) ☈ 
Model
 ☈ 
(Autocompleter)
 ☈ :
 
Doxory 97
  262. Slide 262: 98
  263. Slide 263: •$
vim
lib/Doxory/Dispatcher.pm 99
  264. Slide 264: •$
vim
lib/Doxory/Dispatcher.pm . 99
  265. Slide 265: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; • 







$top‐>child(


'Pick!'

=>
url
=>
'/pick'
); • 







$top‐>child(


'Choices'

=>
url
=>
'/choices'
); • 



} • 



elsif
($1
!~
/^login|^signup/)
{ • 







tangent
'login'; 



} • }; • ... 100
  266. Slide 266: • package
Doxory::Dispatcher; use
Jifty::Dispatcher
‐base; • before
'*'
=>
run
{ 



if
(Jifty‐>web‐>current_user‐>id)
{ • 







my
$top
=
Jifty‐>web‐>navigation; • 







$top‐>child(
_('Pick!')
=>
url
=>
'/pick'
); • 







$top‐>child(
_('Choices')
=>
url
=>
'/choices'
); • 



} • 



elsif
($1
!~
/^login|^signup/)
{ • 







tangent
'login'; 



} • }; • ... 101
  267. Slide 267: •$
vim
lib/Doxory/Model/*.pm 102
  268. Slide 268: •$
vim
lib/Doxory/Model/*.pm 
label,
hints
 . 102
  269. Slide 269: • package
Doxory::Model::Choice; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{ • 
 • column
name
=> • 



label
is
_('I
need
help
deciding...'), • 



render
as
'textarea'; • 
 • column
a
=> • 



label
is
_('On
the
one
hand'), • 



render
as
'textarea',
is
mandatory; • column
b
=> • 



label
is
_('On
the
other
hand'), • 



render
as
'textarea',
is
mandatory; • column
asked_by
=> • 



label
is
_('Asked
by'), • 



default
is
defer
{
Jifty‐>web‐>current_user‐>id
}, • 



references
Doxory::Model::User; • 
 • }; 103
  270. Slide 270: package
Doxory::Model::User; use
Jifty::DBI::Schema; 
 use
Doxory::Record
schema
{ 
 column
name
=> 



label
is
_('Username'), 



hints
is
_('Other
people
see
this
when
you
ask
questions.'), 



is
distinct, 



is
mandatory; 
 column
email
=> 



label
is
_('Email'), 



hints
is
_('We
will
not
sell
it
to
anybody.
Honest.'), 



default
is
'', 



is
distinct, 



is
immutable; 
 }; 104
  271. Slide 271: • package
Doxory::Model::Vote; • use
Jifty::DBI::Schema; • use
Doxory::Record
schema
{ • 
 • column
choice
=> • 



references
Doxory::Model::Choice; • 
 • column
voter
=> • 



references
Doxory::Model::User; • column
suggestion
=> • 



valid
are
qw(
a
b
skip
); • column
comments
=> • 



label
is
_('Comments?'), • 



render
as
'textarea’; • 
 • }; 105
  272. Slide 272: •$
vim
lib/Doxory/View.pm 106
  273. Slide 273: •$
vim
lib/Doxory/View.pm . 106
  274. Slide 274: • package
Doxory::View; use
Jifty::View::Declare
‐base; template
'/'
=>
page
{ 



h1
{
_('Ask
a
question!')
} • 



show
'new_choice'; • }; • private
template
new_choice
=>
sub
{ 



div
{
form
{ • 







my
$action
=
new_action(
class
=>
'CreateChoice'
); • 







render_action(
$action
=>
['name',
'a',
'b']
); • 







form_submit(
label
=>
_('Ask
the
Crowd!')
); • 



}
} • }; • ... 107
  275. Slide 275: 108
  276. Slide 276: • $
jifty
po
‐‐language
zh_tw 108
  277. Slide 277: . • $
jifty
po
‐‐language
zh_tw 108
  278. Slide 278: . • $
jifty
po
‐‐language
zh_tw • INFO
‐
Extracting
messages
from
'lib/Doxory/Dispatcher.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/View.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/Choice.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/User.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/Vote.pm' INFO
‐
Extracting
messages
from
'bin/jifty' INFO
‐
Updating
message
catalog
'share/po/zh_tw.po' 108
  279. Slide 279: . • $
jifty
po
‐‐language
zh_tw • INFO
‐
Extracting
messages
from
'lib/Doxory/Dispatcher.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/View.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/Choice.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/User.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/Vote.pm' INFO
‐
Extracting
messages
from
'bin/jifty' INFO
‐
Updating
message
catalog
'share/po/zh_tw.po' • $
vim
share/po/zh_tw.po 108
  280. Slide 280: . • $
jifty
po
‐‐language
zh_tw • INFO
‐
Extracting
messages
from
'lib/Doxory/Dispatcher.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/View.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/Choice.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/User.pm' INFO
‐
Extracting
messages
from
'lib/Doxory/Model/Vote.pm' INFO
‐
Extracting
messages
from
'bin/jifty' INFO
‐
Updating
message
catalog
'share/po/zh_tw.po' • $
vim
share/po/zh_tw.po . 108
  281. Slide 281: msgid
"" msgstr
"" "Content‐Type:
text/plain;
 charset=CHARSET " • #:
lib/Doxory/Model/Choice.pm:9 #:
lib/Doxory/View.pm:8 • msgid
"I
need
help
deciding..." msgid
"Ask
a
question!" • msgstr
"" msgstr
"" • #:
lib/Doxory/Model/Choice.pm:13 #:
lib/Doxory/View.pm:16 • msgid
"On
the
one
hand" msgid
"Ask
the
crowd!" • msgstr
"" msgstr
"" • #:
lib/Doxory/Model/Choice.pm:18 #:
lib/Doxory/Model/Choice.pm:23 • msgid
"On
the
other
hand" msgid
"Asked
by" • msgstr
"" msgstr
"" • #:
lib/Doxory/Dispatcher.pm:9 #:
lib/Doxory/Dispatcher.pm:10 • msgid
"Pick!" msgid
"Choices" • msgstr
"" msgstr
"" • #:
lib/Doxory/Model/Vote.pm:18 msgid
"Comments?" msgstr
"" 109
  282. Slide 282: msgid
"" msgstr
"" "Content‐Type:
text/plain;
 charset=UTF‐8 " • #:
lib/Doxory/Model/Choice.pm:9 #:
lib/Doxory/View.pm:8 • msgid
"I
need
help
deciding..." msgid
"Ask
a
question!" • msgstr
" ,
 ..." msgstr
" !" • #:
lib/Doxory/Model/Choice.pm:13 #:
lib/Doxory/View.pm:16 • msgid
"On
the
one
hand" msgid
"Ask
the
crowd!" • msgstr
" ...?" msgstr
" !" • #:
lib/Doxory/Model/Choice.pm:18 #:
lib/Doxory/Model/Choice.pm:23 • msgid
"On
the
other
hand" msgid
"Asked
by" • msgstr
" ...?" msgstr
" " • #:
lib/Doxory/Dispatcher.pm:9 #:
lib/Doxory/Dispatcher.pm:10 • msgid
"Pick!" msgid
"Choices" • msgstr
" !" msgstr
" " • #:
lib/Doxory/Model/Vote.pm:18 msgid
"Comments?" msgstr
" ?" 110
  283. Slide 283: 111
  284. Slide 284: ... 111
  285. Slide 285: 112
  286. Slide 286: • $
b2g.pl
‐p
‐u
share/po/zh_tw.po
>
share/po/zh_cn.po 112
  287. Slide 287: 
Encode::HanConvert
 . • $
b2g.pl
‐p
‐u
share/po/zh_tw.po
>
share/po/zh_cn.po 112
  288. Slide 288: 
Encode::HanConvert
 . • $
b2g.pl
‐p
‐u
share/po/zh_tw.po
>
share/po/zh_cn.po • $
vim
etc/config.yml 112
  289. Slide 289: 
Encode::HanConvert
 . • $
b2g.pl
‐p
‐u
share/po/zh_tw.po
>
share/po/zh_cn.po • $
vim
etc/config.yml . 强 设 112
  290. Slide 290: •‐‐‐ •framework: •

L10N: •



PoDir:
share/po • 113
  291. Slide 291: •‐‐‐ •framework: •

L10N: •



PoDir:
share/po •



Lang:
zh‐cn • 114
  292. Slide 292: 115
  293. Slide 293: ! 国际 115
  294. Slide 294: 116
  295. Slide 295: 117
  296. Slide 296: 
HTTP
 117
  297. Slide 297: 
HTTP
 Module::Install 117
  298. Slide 298: 
HTTP
 Module::Install 
PAR
 117
  299. Slide 299: 
(Halo) 118
  300. Slide 300: 
(Halo) 118
  301. Slide 301: 
(Halo) 118
  302. Slide 302: 
(Halo) ... ! 118
  303. Slide 303: Halo 119
  304. Slide 304: Halo SQL
 119
  305. Slide 305: Halo SQL
 SQL
 119
  306. Slide 306: Halo SQL
 SQL
 119
  307. Slide 307: Halo SQL
 SQL
 119
  308. Slide 308: 
(DevelMode) 120
  309. Slide 309: 
(DevelMode) Module::Refresh 120
  310. Slide 310: 
(DevelMode) Module::Refresh Log4Perl
 120
  311. Slide 311: 
(DevelMode) Module::Refresh Log4Perl
 120
  312. Slide 312: 121
  313. Slide 313: Lighttpd
/
Apache 121
  314. Slide 314: Lighttpd
/
Apache CSS::Squish
 121
  315. Slide 315: Lighttpd
/
Apache CSS::Squish
 JavaScript::Squish
 121
  316. Slide 316: ... 122
  317. Slide 317: ... 
I18N
 122
  318. Slide 318: ... 
I18N
 
Session 122
  319. Slide 319: ... 
I18N
 
Session 
(Event)
 122
  320. Slide 320: ✈ 123
  321. Slide 321: 124
  322. Slide 322: ✈ Wiki
UI
 124
  323. Slide 323: ✈ Wiki
UI
 ✈ ,
 124
  324. Slide 324: ✈ Wiki
UI
 ✈ ,
 ✈ ,
 ,
MTV... 124
  325. Slide 325: 125
  326. Slide 326: ✈ Wifty 125
  327. Slide 327: ✈ Wifty ✈ CommitBit 125
  328. Slide 328: ✈ Wifty ✈ CommitBit ✈ BabelBee 125
  329. Slide 329: ✈ Ping
 ✈ Wifty ✈ CommitBit ✈ BabelBee 125
  330. Slide 330: ✈ Ping
 ✈ Wifty ✈ Chat ✈ CommitBit ✈ BabelBee 125
  331. Slide 331: ✈ Ping
 ✈ Wifty ✈ Chat ✈ CommitBit ✈ Clock ✈ BabelBee 125
  332. Slide 332: ✈ Ping
 ✈ Wifty ✈ Chat ✈ CommitBit ✈ Clock ✈ BabelBee ✈ Doxory! 125
  333. Slide 333: 
Jifty 126
  334. Slide 334: 
Jifty ✈ cpan
Jifty 126
  335. Slide 335: 
Jifty ✈ cpan
Jifty ✈ http://svn.jifty.org/svn/jifty.org 126
  336. Slide 336: 
Jifty ✈ cpan
Jifty ✈ http://svn.jifty.org/svn/jifty.org ✈ http://jifty.org/ 126
  337. Slide 337: 127
  338. Slide 338: ✈ Jifty::Manual::Tutorial 127
  339. Slide 339: ✈ Jifty::Manual::Tutorial ✈ irc.freenode.net
#jifty 127
  340. Slide 340: ✈ Jifty::Manual::Tutorial ✈ irc.freenode.net
#jifty ✈ jifty‐devel@lists.jifty.org 127
  341. Slide 341: fin. 128
  342. Slide 342: Bonus Slides 129
  343. Slide 343: ☺ 130
  344. Slide 344: Anatomy
of
a
Jifty
App 131
  345. Slide 345: Anatomy
of
a
Jifty
App ☺ Model
:
Columns 131
  346. Slide 346: Anatomy
of
a
Jifty
App ☺ Model
:
Columns ☺ Action
:
Parameters 131
  347. Slide 347: Anatomy
of
a
Jifty
App ☺ Model
:
Columns ☺ Action
:
Parameters ☺ Template
:
Fragments 131
  348. Slide 348: More
Components 132
  349. Slide 349: More
Components ☺ Dispatcher 132
  350. Slide 350: More
Components ☺ Dispatcher ☺ ClassLoader 132
  351. Slide 351: More
Components ☺ Dispatcher ☺ ClassLoader ☺ Continuations 132
  352. Slide 352: ䷗ 133
  353. Slide 353: Jifty::DBI 134
  354. Slide 354: Jifty::DBI ∅ CREATE
TABLE 134
  355. Slide 355: Jifty::DBI ∅ CREATE
TABLE ∅ ALTER
TABLE 134
  356. Slide 356: Jifty::DBI ∅ CREATE
TABLE ∅ ALTER
TABLE ∅ CREATE
FOREIGN
KEY 134
  357. Slide 357: Object
Relational
Mapper 135
  358. Slide 358: Object
Relational
Mapper ∅ SELECT 135
  359. Slide 359: Object
Relational
Mapper ∅ SELECT ∅ INSERT 135
  360. Slide 360: Object
Relational
Mapper ∅ SELECT ∅ UPDATE ∅ INSERT 135
  361. Slide 361: Object
Relational
Mapper ∅ SELECT ∅ UPDATE ∅ INSERT ∅ DELETE 135
  362. Slide 362: Jifty::DBI::Handle 136
  363. Slide 363: Jifty::DBI::Handle ䷗ SQLite 136
  364. Slide 364: Jifty::DBI::Handle ䷗ SQLite ䷗ Postgres 136
  365. Slide 365: Jifty::DBI::Handle ䷗ SQLite ䷗ MySQL ䷗ Postgres 136
  366. Slide 366: Jifty::DBI::Handle ䷗ SQLite ䷗ MySQL ䷗ Postgres ䷗ Oracle 136
  367. Slide 367: Jifty::DBI::Collection 137
  368. Slide 368: Jifty::DBI::Collection ䷗ Joins
and
Limits 137
  369. Slide 369: Jifty::DBI::Collection ䷗ Joins
and
Limits ䷗ Paging
=
Data::Page 137
  370. Slide 370: Jifty::DBI::Collection ䷗ Joins
and
Limits ䷗ Paging
=
Data::Page ䷗ Caching
=
Memcached 137
  371. Slide 371: Jifty::DBI::Schema 138
  372. Slide 372: Jifty::DBI::Schema ䷗ Declarative
Columns 138
  373. Slide 373: Jifty::DBI::Schema ䷗ Declarative
Columns ䷗ Remember
our
Doxory? 138
  374. Slide 374: Jifty::DBI::Schema ䷗ Declarative
Columns ䷗ Remember
our
Doxory? ䷗ Time
for
0.0.2! 138
  375. Slide 375: 139
  376. Slide 376: • package
Doxory::Model::Comment; use
Jifty::DBI::Schema; use
Doxory::Record
schema
{ since
'0.0.2'; 139
  377. Slide 377: • package
Doxory::Model::Comment; use
Jifty::DBI::Schema; use
Doxory::Record
schema
{ since
'0.0.2'; • column
User

=>
refers
to
Doxory::Model:User; column
author
=>
refers
to
Doxory::Model::User; 139
  378. Slide 378: • package
Doxory::Model::Comment; use
Jifty::DBI::Schema; use
Doxory::Record
schema
{ since
'0.0.2'; • column
User

=>
refers
to
Doxory::Model:User; column
author
=>
refers
to
Doxory::Model::User; • column
body
=> 


label


is
'Content', 


type



is
'Text', 


render

as
'Textarea', 


default
is
'First
Post!'; 139
  379. Slide 379: • package
Doxory::Model::Comment; use
Jifty::DBI::Schema; use
Doxory::Record
schema
{ since
'0.0.2'; • column
User

=>
refers
to
Doxory::Model:User; column
author
=>
refers
to
Doxory::Model::User; • column
body
=> 


label


is
'Content',