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
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons
SlideShare is now available on LinkedIn. Add it to your LinkedIn profile.

Simple Ways To Be A Better Programmer (OSCON 2007)

From schwern, 2 years ago Add as contact

"Simple Ways To Be A Better Programmer' as presented at OSCON 2007 by Michael G Schwern.

The audio is still out of sync, working on it. Downloading will be available once the sync is done.

2423 views | 0 comments | 7 favorites | 0 downloads | 0 embeds (Stats)

Categories

Technology

Groups/Events

Embed in your blog options close
Embed (wordpress.com) Exclude related slideshows Embed in your blog

More Info

This slideshow is Public
CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License
Total Views: 2423 on Slideshare: 2423 from embeds: 0
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: Simple Ways To Be A Better Programmer Michael G Schwern schwern@pobox.com
  2. Slide 2: Discussion Session D135 @ 5:30pm
  3. Slide 4: #!/usr/bin/perl -s $;=$/;seek+DATA,!++$/,!$s;$_=<DATA>;$s&&print||$g&&do{$y=($x||=20)*($y||8);sub i{sleep&f}sub'p{print$;x$=,join$;,$b=~/.{$x}/g}$j=$j;sub'f{pop}sub n{substr($b,&f%$y,3)=~tr,O,O,}sub'g{$f=&f-1;($w,$w,substr($b,&f,1),O)[n($f-$x)+ n($x+$f)-(substr($b,&f,1)eq+O)+n$f]||$w}$w=\"\\40\";$b=join'',@ARGV?<>:$_,$w x$y;$b=~s).)$&=~/\\w/?O:$w)ge;substr($b,$y)=q++;$g='$i=0;$i?$b:$c=$b; substr+$c,$i,1,g$i;$g=~s?\\d+?($&+1)%$y?e;$i-$y+1?eval$g:do{$i=-1;$b=$c;p;i 1}';sub'e{eval$g;&e}e}||eval||die+No.$; __DATA__ if($j){{$^W=$|;*_=sub{$=+s=#([A-z])(.*)#=#$+$1#=g}} @s=(q[$_=sprintf+pop@s,@s],q[ if($j){{$^W=$|;*_=sub{$=+s=#([A-z])(.*)#=#$+$1#=g}} #_The_Perl_Journal_# @s=(q[%s],q[%s])x2;%s;print\"\\n\"x&_,$_;i$j;eval} ])x2;$_=sprintf+pop@s,@s;print\"\\n\"x&_,$_;i$j;eval}$/=$y;$\"=\",\";print q<#!/usr/local/bin/perl -sw if(!$s){>.($_=<>).q<}else{@s=(q[printf+pop@s,@s],q[#!/usr/local/bin/perl -sw if(!$s){>.(s$%$%%$g,tr=[=[===tr=]=]=||&d,$_).q<}else{@s=(q[%s],q[%s])x2;%s} ])x2;printf+pop@s,@s} >
  4. Slide 7: Beyond syntax
  5. Slide 8: Tools for the toolbox
  6. Slide 9: Easy To Do
  7. Slide 10: Hard To Screw Up
  8. Slide 11: Independent
  9. Slide 12: You can do them alone
  10. Slide 15: Computer Science + People = Software Development
  11. Slide 19: Why learn?
  12. Slide 21: Cross-training is sexay
  13. Slide 25: know
  14. Slide 26: Don’t know
  15. Slide 27: Don’t know you don’t know
  16. Slide 28: “I don’t know”
  17. Slide 29: “Tell me about it”
  18. Slide 30: Why
  19. Slide 31: New things mean failure
  20. Slide 37: New versions
  21. Slide 38: Hang out with other folks who learn
  22. Slide 39: Join the community
  23. Slide 40: Broadcast your problem
  24. Slide 41: Go be stupid
  25. Slide 42: Learn a really different language
  26. Slide 44: Look it up yourself
  27. Slide 46: Wikipedia
  28. Slide 47: Relevant blogs
  29. Slide 48: Tech-specific search sites
  30. Slide 51: > Thank you for your note. Opera is > not a supported browser.
  31. Slide 52: Why not? I see absolutely no reason to exclude Opera from the list of supported browsers. When I tell Opera to ID as Firefox, it works as expected. No patches needed. So please get back in sync with the real world and also enable Opera.
  32. Slide 53: Topic for #eve is: Corp meeting on Vent: Saturday 14th and 21st at 16:00 EVE time. All hands on deck! :-)
  33. Slide 54: <wibble> Announcing \"all hands on deck\" without announcing *why* is not useful. <wibble> I get enough shit from work, I certainly don't need any more from a corp on Eve. <wibble> just irritated at people telling me what I *have* to do.
  34. Slide 55: On Wed, May 09, 2007 at 08:34:52PM -0700, Michael G Schwern wrote: > I'm sorry, but that's the automated failure report from CPAN::Reporter. > I was doing an automated install.
  35. Slide 56: What can I do to force automated junk mailers to follow my policy of bug reports?
  36. Slide 57: Speak with the CPAN::Reporter folks about what you would like to see in the failed install report. Perhaps they can add in the Makefile.PL and make output to the automatic report. This would be helpful, especially for complicated builds like yours. Perhaps you could change your test files so they automatically output the diagnostics you want on failure rather than rely on the user to sift through the INSTALL docs to find the special instructions
  37. Slide 59: “You’re right”
  38. Slide 60: someone screwed up the plan in one of Encode's tests.
  39. Slide 63: +1 0 -1
  40. Slide 65: Bitching is not doing
  41. Slide 66: Means
  42. Slide 67: Ends
  43. Slide 68: Be Available
  44. Slide 70: Design <-> Code
  45. Slide 71: Interface -> User
  46. Slide 75: Get it out of your head
  47. Slide 76: Documentation
  48. Slide 77: Wiki
  49. Slide 78: Tickets
  50. Slide 81: How are you?
  51. Slide 82: Having fun?
  52. Slide 83: Feel ok?
  53. Slide 87: Fear-based Programming
  54. Slide 88: Fear of change
  55. Slide 89: Fear of bugs
  56. Slide 90: Fear of getting fired
  57. Slide 91: Small Chunks
  58. Slide 92: Testing
  59. Slide 93: Test first
  60. Slide 94: Test during
  61. Slide 95: Test automaticly
  62. Slide 96: Stay at 100%
  63. Slide 97: Effective Version Control
  64. Slide 98: Code
  65. Slide 99: Test
  66. Slide 100: Commit
  67. Slide 101: How much?
  68. Slide 102: One Thing
  69. Slide 103: One Source Of Breakage
  70. Slide 104: ---------------------------------------------------------------------- r32185: schwern | 2007-06-29 18:22:55 -0700 Need a blank line preceeding POD directives. ---------------------------------------------------------------------- === local/Test-Simple/lib/Test/Builder.pm ================================================================== --- local/Test-Simple/lib/Test/Builder.pm (revision 32184) +++ local/Test-Simple/lib/Test/Builder.pm (revision 32185) @@ -983,6 +983,7 @@ # I'm not ready to publish this. It doesn't deal with array return # values from the code or context. + =begin private =item B<_try>
  71. Slide 105: ---------------------------------------------------------------------- r27706: schwern | 2007-03-16 15:19:55 -0700 Add a test to ensure an object can lie about being an IO::Handle. ---------------------------------------------------------------------- === local/Test-Simple/t/is_fh.t ================================================================== --- local/Test-Simple/t/is_fh.t (revision 27705) +++ local/Test-Simple/t/is_fh.t (revision 27706) @@ -11,7 +11,7 @@ } use strict; -use Test::More tests => 10; +use Test::More tests => 11; use TieOut; ok( !Test::Builder->is_fh(\"foo\"), 'string is not a filehandle' ); @@ -34,3 +34,15 @@ unless defined *OUT{IO}; ok( Test::Builder->is_fh(*OUT{IO}) ); } + + +package Lying::isa; + +sub isa { + my $self = shift; + my $parent = shift; + + return 1 if $parent eq 'IO::Handle'; +} + +::ok( Test::Builder->is_fh(bless {}, \"Lying::isa\"));
  72. Slide 106: ---------------------------------------------------------------------- r27705: schwern | 2007-03-16 15:10:39 -0700 Comment about the nature of the filehandle in is_fh() was backwards. ---------------------------------------------------------------------- === local/Test-Simple/lib/Test/Builder.pm ================================================================== --- local/Test-Simple/lib/Test/Builder.pm (revision 27704) +++ local/Test-Simple/lib/Test/Builder.pm (revision 27705) @@ -1025,8 +1025,8 @@ my $maybe_fh = shift; return 0 unless defined $maybe_fh; - return 1 if ref $maybe_fh eq 'GLOB'; # its a glob - return 1 if ref \\$maybe_fh eq 'GLOB'; # its a glob ref + return 1 if ref $maybe_fh eq 'GLOB'; # its a glob ref + return 1 if ref \\$maybe_fh eq 'GLOB'; # its a glob return eval { $maybe_fh->isa(\"IO::Handle\") } || # 5.5.4's tied() and can() doesn't like getting undef
  73. Slide 107: ---------------------------------------------------------------------- r26467: schwern | 2006-12-24 12:36:01 -0800 Typo ---------------------------------------------------------------------- === local/Test-Simple/Changes ================================================================== --- local/Test-Simple/Changes (revision 26466) +++ local/Test-Simple/Changes (revision 26467) @@ -1,5 +1,5 @@ 0.66 Sun Dec 3 15:25:45 PST 2006 - - Restore 5.4.5 compatibility (unobe@cpan.org) [rt.cpanorg 20513] + - Restore 5.4.5 compatibility (unobe@cpan.org) [rt.cpan.org 20513] 0.65 Fri Nov 10 10:26:51 CST 2006
  74. Slide 108: ---------------------------------------------------------------------- r17879: schwern | 2006-09-04 01:15:12 -0700 * Made most of the error messages report in the caller's context. [rt.cpan.org #20639] ---------------------------------------------------------------------- === local/Test-Simple/lib/Test/Builder.pm ================================================================== --- local/Test-Simple/lib/Test/Builder.pm (revision 17878) +++ local/Test-Simple/lib/Test/Builder.pm (revision 17879) @@ -35,7 +35,7 @@ $$data = ${$_[0]}; } else { - die \"Unknown type: \".$type; + die(\"Unknown type: \".$type); } $_[0] = &threads::shared::share($_[0]); @@ -50,7 +50,7 @@ ${$_[0]} = $$data; } else { - die \"Unknown type: \".$type; + die(\"Unknown type: \".$type); } return $_[0]; @@ -247,8 +247,7 @@ return unless $cmd; if( $self->{Have_Plan} ) { - die sprintf \"You tried to plan twice! Second plan at %s line %d\\n\", - ($self->caller)[1,2]; + $self->croak(\"You tried to plan twice\"); } ...
  75. Slide 109: Task branches
  76. Slide 110: BDUF
  77. Slide 111: Refactoring
  78. Slide 112: JIT Design
  79. Slide 113: Rename
  80. Slide 114: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $arg = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$arg\">/; } if ( my $arg = delete $parms{format} ) { if ($arg eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$arg\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  81. Slide 115: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $arg = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$arg\">/; } if ( my $arg = delete $parms{format} ) { if ($arg eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$arg\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  82. Slide 116: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  83. Slide 117: Extract
  84. Slide 118: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  85. Slide 119: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  86. Slide 120: if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } }
  87. Slide 121: if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } }
  88. Slide 122: method _content_as_text ($content) { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety my $formatted_content = $tree->as_text(); $tree->delete; return $formatted_content; }
  89. Slide 123: if ( my $format = delete $parms{format} ) { if ($format eq 'text') { $content = $self->_content_as_text($content); } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } }
  90. Slide 124: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  91. Slide 125: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { $content = $self->_content_as_text($content); } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  92. Slide 126: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { $content = $self->_content_as_text($content); } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  93. Slide 127: method _format_content ($format, $content) { if ($format eq 'text') { return $self->_content_as_text($content); } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } }
  94. Slide 128: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { $content = $self->_content_as_text($content); } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  95. Slide 129: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  96. Slide 130: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  97. Slide 131: method _check_unhandled_parms (%parms) { for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } }
  98. Slide 132: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  99. Slide 133: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } $self->_check_unhandled_parms(%parms); } # is HTML return $content; }
  100. Slide 134: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } $self->_check_unhandled_parms(%parms); } # is HTML return $content; }
  101. Slide 135: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } $self->_check_unhandled_parms(%parms); } return $content; }
  102. Slide 136: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { if ($format eq 'text') { require HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($content); $tree->eof(); $tree->elementify(); # just for safety $content = $tree->as_text(); $tree->delete; } else { $self->die( qq{Unknown \"format\" parameter \"$format\"} ); } } for my $cmd ( sort keys %parms ) { $self->die( qq{Unknown named argument \"$cmd\"} ); } } # is HTML return $content; }
  103. Slide 137: method content () { my $content = $self->{content}; if ( $self->is_html ) { my %parms = @_; if ( exists $parms{base_href} ) { my $base_href = (delete $parms{base_href}) || $self->base; $content =~ s/<head>/<head>\\n<base href=\"$base_href\">/; } if ( my $format = delete $parms{format} ) { $content = $self->_format_content($format, $content); } $self->_check_unhandled_parms(%parms); } return $content; }
  104. Slide 138: Revealing Reuse
  105. Slide 139: refactoring.com
  106. Slide 140: Simplest Thing
  107. Slide 141: Optimizing
  108. Slide 142: Rule #1
  109. Slide 143: Rule #1: Don’t!
  110. Slide 144: Complicates
  111. Slide 145: Wastes Time
  112. Slide 146: Rule #2
  113. Slide 147: Rule #2: Don’t do it yet!
  114. Slide 148: Does it work?
  115. Slide 149: Is it tested?
  116. Slide 150: Is it documented?
  117. Slide 151: How fast?
  118. Slide 152: Throw Hardware
  119. Slide 153: Rule #3
  120. Slide 154: Rule #3: Profile First!
  121. Slide 155: Rule #4
  122. Slide 156: Rule #4: Better Algorithm
  123. Slide 157: Rule #5
  124. Slide 159: Estimating
  125. Slide 161: Feedback
  126. Slide 162: Mini Milestones
  127. Slide 163: • Get account activated • Make simple test purchase • Handle invalid expiration date • Handle invalid address • Record transactions • Associate item with purchase • Simple user form
  128. Slide 164: Quatloos
  129. Slide 165: Get Out Of Technical Debt NOW!
  130. Slide 166: Form
  131. Slide 167: Functionality
  132. Slide 168: Separate
  133. Slide 169: People
  134. Slide 170: Small Chunky Pieces
  135. Slide 171: Thank You
  136. Slide 172: Gabrielle
  137. Slide 173: Candy
  138. Slide 174: Selena
  139. Slide 175: Keith
  140. Slide 176: Everyone I pestered
  141. Slide 177: Discussion Session D135 @ 5:30pm