PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/presentations/2010-06-13-functional-techniques-in-ruby/index.html

https://github.com/bendyworks/bendyworks.github.com
HTML | 268 lines | 214 code | 54 blank | 0 comment | 0 complexity | 3a2a6c34f189ce83e7a96d608fbdee3d MD5 | raw file
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  6. <title></title>
  7. <link rel="stylesheet" href="./css/reset.css" type="text/css"/>
  8. <link rel="stylesheet" href="./css/showoff.css" type="text/css"/>
  9. <script type="text/javascript" src="./js/jquery-1.4.2.min.js"></script>
  10. <script type="text/javascript" src="./js/jquery.cycle.all.js"></script>
  11. <script type="text/javascript" src="./js/jquery-print.js"></script>
  12. <script type="text/javascript" src="./js/jquery.batchImageLoad.js"></script>
  13. <script type="text/javascript" src="./js/jquery.doubletap-0.1.js"></script>
  14. <script type="text/javascript" src="./js/fg.menu.js"></script>
  15. <script type="text/javascript" src="./js/showoff.js"></script>
  16. <script type="text/javascript" src="./js/jTypeWriter.js"> </script>
  17. <script type="text/javascript" src="./js/sh_main.min.js"></script>
  18. <script type="text/javascript" src="./js/core.js"></script>
  19. <script type="text/javascript" src="./js/showoffcore.js"></script>
  20. <link type="text/css" href="./css/fg.menu.css" media="screen" rel="stylesheet" />
  21. <link type="text/css" href="./css/theme/ui.all.css" media="screen" rel="stylesheet" />
  22. <link type="text/css" href="./css/sh_style.css" rel="stylesheet" >
  23. <link rel="stylesheet" href="file/style.css" type="text/css"/>
  24. <script type="text/javascript">
  25. $(function(){
  26. setupPreso(false, '.');
  27. });
  28. </script>
  29. </head>
  30. <body>
  31. <a tabindex="0" href="#search-engines" class="fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all" id="navmenu"><span class="ui-icon ui-icon-triangle-1-s"></span>slides</a>
  32. <div id="navigation" class="hidden"></div>
  33. <div id="help">
  34. <table>
  35. <tr><td class="key">space, &rarr;</td><td>next slide</td></tr>
  36. <tr><td class="key">&larr;</td><td>previous slide</td></tr>
  37. <tr><td class="key">d</td><td>debug mode</td></tr>
  38. <tr><td class="key">## &lt;ret&gt;</td><td>go to slide #</td></tr>
  39. <tr><td class="key">c</td><td>table of contents (vi)</td></tr>
  40. <tr><td class="key">f</td><td>toggle footer</td></tr>
  41. <tr><td class="key">r</td><td>reload slides</td></tr>
  42. <tr><td class="key">z</td><td>toggle help (this)</td></tr>
  43. </table>
  44. </div>
  45. <div id="preso">loading presentation...</div>
  46. <div id="footer">
  47. <span id="slideInfo"></span>
  48. <span id="debugInfo"></span>
  49. </div>
  50. <div id="slides" class="offscreen" style="display:none;">
  51. <div class="slide" data-transition="none"><div class="content" ref="1_intro/1_title">
  52. <h1>functional techniques in ruby</h1>
  53. <h2>a pecha-kucha-like talk</h2>
  54. <h3>by: bradley grzesiak</h3>
  55. <h3>aka: <a href="//twitter.com/listrophy">@listrophy</a></h3></div>
  56. </div><div class="slide" data-transition="none"><div class="content" ref="1_intro/2_functional_vs_imperative">
  57. <h1>functional v. imperative</h1>
  58. <p><img src="./file/func.png" alt="Functional Diagram" style="float: left; margin-left: 10px"/></p>
  59. <p><img src="./file/imperative.png" alt="Imperative Diagram" style="float: right; margin-right: 10px"/></p></div>
  60. </div><div class="slide" data-transition="none"><div class="content" ref="1_intro/3_a_digression">
  61. <h1>a digression into the past</h1>
  62. <pre><code>10 REPEAT "after me"
  63. 20 DO !use("gotos")
  64. 30 GOTO 20
  65. </code></pre></div>
  66. </div><div class="slide" data-transition="none"><div class="content" ref="2_states/1_just_as_bad">
  67. <h1>what's just as bad?</h1>
  68. <pre class="sh_ruby"><code>'foobar'.gsub! /oo/, 'u'
  69. %x[date 0314]
  70. product.save</code></pre></div>
  71. </div><div class="slide" data-transition="none"><div class="content bullets" ref="2_states/2_state_vs_result">
  72. <h1>state vs. result</h1>
  73. <ul>
  74. <li>imperative :: change state of environment</li>
  75. <li>functional :: take input(s) to produce output(s)</li>
  76. </ul>
  77. </div>
  78. </div><div class="slide" data-transition="none"><div class="content" ref="2_states/3_ick">
  79. <h1>ick</h1>
  80. <pre class="sh_ruby"><code>def grade(score)
  81. the_grade = nil
  82. if score &gt; 90 then the_grade = 'A'
  83. elsif score &gt; 80 then the_grade = 'B'
  84. else the_grade = 'U'
  85. the_grade
  86. end</code></pre></div>
  87. </div><div class="slide" data-transition="none"><div class="content" ref="2_states/4_moar_betta">
  88. <h1>moar betta</h1>
  89. <pre class="sh_ruby"><code>def grade(score)
  90. score &gt; 90 ? 'A' :
  91. (score &gt; 80 ? 'B' : 'U')
  92. end</code></pre></div>
  93. </div><div class="slide" data-transition="none"><div class="content bullets" ref="3_higher_order_functions/1_higher_order_functions">
  94. <h1>higher order functions</h1>
  95. <h2>or functions that can:</h2>
  96. <ul>
  97. <li>take functions as arguments</li>
  98. <li>return functions</li>
  99. </ul>
  100. </div>
  101. </div><div class="slide" data-transition="none"><div class="content" ref="3_higher_order_functions/2_complement">
  102. <h1>complement</h1>
  103. <div style="text-align: right; font-size: 200%">NB: f[*a] == f.call(*a)</div>
  104. <pre class="sh_ruby"><code>def complement f
  105. lambda {|*a| not f[*a]}
  106. end
  107. is_even = lambda {|n| n % 2 == 0}
  108. is_odd = complement(is_even)
  109. is_odd[1] # true</code></pre></div>
  110. </div><div class="slide" data-transition="none"><div class="content" ref="3_higher_order_functions/3_conjoin">
  111. <h1>conjoin</h1>
  112. <pre class="sh_ruby"><code>def conjoin *e
  113. base = lambda {|*a| true}
  114. e.inject(base) do |c, pred|
  115. lambda do |*a|
  116. c[*a] &amp;&amp; pred[*a]
  117. end
  118. end
  119. end</code></pre></div>
  120. </div><div class="slide" data-transition="none"><div class="content" ref="3_higher_order_functions/4_conjoin_huh">
  121. <h1>huh?</h1>
  122. <h2>values : all? :: functions : conjoin</h2>
  123. <pre class="sh_ruby"><code>is_number = lambda {|n| n.kind_of?(Numeric)}
  124. is_even = lambda {|n| n % 2 == 0}
  125. div_by_three = lambda {|n| n % 3 == 0}
  126. even_number_div_by_three =
  127. conjoin(is_number, is_even, div_by_three)</code></pre></div>
  128. </div><div class="slide" data-transition="none"><div class="content" ref="3_higher_order_functions/5_conjoin_why">
  129. <h1>ok... why?</h1>
  130. <pre class="sh_ruby"><code>def even_number_div_by_3 arg
  131. [(arg.kind_of?(Numeric)),
  132. (arg % 2 == 0), (arg % 3 == 0)].
  133. inject(true){|memo,res| memo &amp;&amp; res}
  134. end</code></pre>
  135. <h2>What of:</h2>
  136. <pre class="sh_ruby"><code>even_number_div_by_3(Object.new)
  137. # 'undefined method `%' for #&lt;Object:...&gt;</code></pre></div>
  138. </div><div class="slide" data-transition="none"><div class="content smbullets" ref="3_higher_order_functions/6_library">
  139. <h1>a library you might write</h1>
  140. <ul>
  141. <li>complement</li>
  142. <li>compose</li>
  143. <li>conjoin</li>
  144. <li>disjoin</li>
  145. <li>filter</li>
  146. <li>map</li>
  147. <li>reduce</li>
  148. <li>and a big one...</li>
  149. </ul>
  150. </div>
  151. </div><div class="slide" data-transition="none"><div class="content smbullets" ref="3_higher_order_functions/7_map_reduce">
  152. <h1>map-reduce</h1>
  153. <ul>
  154. <li>map:
  155. <ul>
  156. <li>[a, e, g] becomes:</li>
  157. <li>{a =&gt; [b,c,d], e =&gt; [b,d,f], g =&gt; [b]}</li>
  158. </ul>
  159. </li>
  160. <li>reduce:
  161. <ul>
  162. <li>collapse the inverse:</li>
  163. <li>{b =&gt; 3, d =&gt; 2, c =&gt; 1, f =&gt; 1}</li>
  164. </ul>
  165. </li>
  166. <li>Add some smarts &amp; you get "Google PageRank"</li>
  167. </ul>
  168. </div>
  169. </div><div class="slide" data-transition="none"><div class="content bullets" ref="4_conclusion/1_scale">
  170. <h1>functional scales</h1>
  171. <ul>
  172. <li>given input(s), you get output(s)</li>
  173. <li>everything is self-contained</li>
  174. <li>parallel processing FTfW</li>
  175. </ul>
  176. </div>
  177. </div><div class="slide" data-transition="none"><div class="content bullets" ref="4_conclusion/2_bad_news">
  178. <h1>the bad news</h1>
  179. <ul>
  180. <li>tail recursion optimization is nice, but not in most ruby 1.8 implementations</li>
  181. <li>more abstraction &#x2248;&gt; more confusion</li>
  182. </ul>
  183. </div>
  184. </div><div class="slide" data-transition="none"><div class="content bullets" ref="4_conclusion/3_more">
  185. <h1>more!</h1>
  186. <ul>
  187. <li>currying: built into 1.9</li>
  188. <li>lazy evaluation/memoization: "let" in RSpec</li>
  189. <li>infinite streams: see sequences in FactoryGirl</li>
  190. </ul>
  191. </div>
  192. </div><div class="slide" data-transition="none"><div class="content" ref="4_conclusion/4_blown">
  193. <h1>phew!</h1>
  194. <h2>is your mind blown?</h2></div>
  195. </div><div class="slide" data-transition="none"><div class="content smaller" ref="4_conclusion/5_neat">
  196. <h1>also, this is neat</h1>
  197. <pre><code>!!! 5
  198. %html
  199. %head
  200. %script(src='jquery.js')
  201. :javascript
  202. $(function(){ $('h1').click(function(){$.post('/');})});
  203. :css
  204. h1 { height: 100em }
  205. %body
  206. %h1 play
  207. %w(rubygems sinatra haml).map{|x|require x}
  208. get('/'){haml :index}
  209. post('/'){`osascript -e 'tell app "Keynote" to start slideshow'`}
  210. </code></pre></div>
  211. </div>
  212. </div>
  213. </body>
  214. </html>