hmachine 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/.gitignore +2 -2
  2. data/Gemfile +6 -4
  3. data/Gemfile.lock +51 -0
  4. data/README.md +123 -9
  5. data/Rakefile +12 -3
  6. data/bin/hmachine +99 -0
  7. data/hmachine.gemspec +132 -0
  8. data/lib/hmachine.rb +121 -12
  9. data/lib/hmachine/microformat.rb +39 -20
  10. data/lib/hmachine/microformat/adr.rb +22 -0
  11. data/lib/hmachine/microformat/geo.rb +48 -0
  12. data/lib/hmachine/microformat/hcard.rb +169 -11
  13. data/lib/hmachine/microformat/rellicense.rb +20 -0
  14. data/lib/hmachine/microformat/reltag.rb +38 -0
  15. data/lib/hmachine/microformat/votelinks.rb +42 -0
  16. data/lib/hmachine/microformat/xfn.rb +54 -0
  17. data/lib/hmachine/microformat/xmdp.rb +14 -0
  18. data/lib/hmachine/microformat/xoxo.rb +69 -0
  19. data/lib/hmachine/pattern.rb +26 -0
  20. data/lib/hmachine/pattern/abbr.rb +21 -0
  21. data/lib/hmachine/pattern/datetime.rb +75 -0
  22. data/lib/hmachine/pattern/typevalue.rb +32 -0
  23. data/lib/hmachine/pattern/url.rb +32 -0
  24. data/lib/hmachine/pattern/valueclass.rb +51 -0
  25. data/lib/hmachine/posh.rb +3 -0
  26. data/lib/hmachine/posh/anchor.rb +40 -0
  27. data/lib/hmachine/posh/base.rb +204 -0
  28. data/lib/hmachine/posh/definition_list.rb +41 -0
  29. data/test/fixtures/huffduffer.html +466 -0
  30. data/test/fixtures/likeorhate.html +48 -0
  31. data/test/fixtures/rel_license.html +4 -0
  32. data/test/fixtures/test-fixture/hcard/hcard1.html +147 -0
  33. data/test/fixtures/test-fixture/hcard/hcard11.html +123 -0
  34. data/test/fixtures/test-fixture/hcard/hcard12.html +178 -0
  35. data/test/fixtures/test-fixture/hcard/hcard17.html +165 -0
  36. data/test/fixtures/test-fixture/hcard/hcard2.html +264 -0
  37. data/test/fixtures/test-fixture/hcard/hcard3.html +144 -0
  38. data/test/fixtures/test-fixture/hcard/hcard4.html +117 -0
  39. data/test/fixtures/test-fixture/hcard/hcard5.html +119 -0
  40. data/test/fixtures/test-fixture/hcard/hcard6.html +188 -0
  41. data/test/fixtures/test-fixture/hcard/hcard7.html +188 -0
  42. data/test/fixtures/test-fixture/hcard/hcard8.html +130 -0
  43. data/test/fixtures/test-fixture/hcard/hcard9.html +111 -0
  44. data/test/fixtures/test-fixture/hcard/hcard99.html +215 -0
  45. data/test/fixtures/test-fixture/value-class-date-time/value-dt-test-YYYY-MM-DD--HH-MM.html +9 -0
  46. data/test/fixtures/test-fixture/value-class-date-time/value-dt-test-abbr-YYYY-MM-DD--HH-MM.html +4 -0
  47. data/test/fixtures/xfn.html +198 -0
  48. data/test/fixtures/xmdp.html +32 -0
  49. data/test/fixtures/xoxo.html +51 -0
  50. data/test/hmachine_test.rb +122 -6
  51. data/test/microformat/adr_test.rb +47 -0
  52. data/test/microformat/geo_test.rb +66 -0
  53. data/test/microformat/hcard_test.rb +487 -20
  54. data/test/microformat/rellicense_test.rb +36 -0
  55. data/test/microformat/reltag_test.rb +61 -0
  56. data/test/microformat/votelinks_test.rb +44 -0
  57. data/test/microformat/xfn_test.rb +28 -0
  58. data/test/microformat/xmdp_test.rb +16 -0
  59. data/test/microformat/xoxo_test.rb +51 -0
  60. data/test/microformat_test.rb +12 -34
  61. data/test/pattern/date_time_test.rb +55 -0
  62. data/test/pattern/value_class_test.rb +33 -0
  63. data/test/pattern_test.rb +132 -0
  64. data/test/posh/anchor_test.rb +41 -0
  65. data/test/posh/base_test.rb +150 -0
  66. data/test/posh/definition_list_test.rb +38 -0
  67. data/test/test_helper.rb +24 -6
  68. metadata +93 -15
  69. data/lib/hmachine/microformat/base.rb +0 -17
@@ -0,0 +1,3 @@
1
+ require 'hmachine/posh/base'
2
+ require 'hmachine/posh/anchor'
3
+ require 'hmachine/posh/definition_list'
@@ -0,0 +1,40 @@
1
+ module HMachine
2
+ module POSH
3
+ class Anchor < Base
4
+
5
+ selector "a"
6
+
7
+ has_one :url do
8
+ search {|node| node }
9
+ extract {|node| node['href'] }
10
+ end
11
+ alias href url
12
+
13
+ has_one :text do
14
+ search {|node| node }
15
+ end
16
+ alias content text
17
+
18
+ has_one :rel do
19
+ search {|node| node }
20
+ extract {|node| node['rel'].split }
21
+ end
22
+ alias relationship rel
23
+
24
+ has_one :title do
25
+ search {|node| node }
26
+ extract {|node| node['title'] }
27
+ end
28
+
29
+ has_one :type do
30
+ search {|node| node }
31
+ extract {|node| node['type'] }
32
+ end
33
+
34
+ def to_s
35
+ text
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,204 @@
1
+ module HMachine
2
+ module POSH
3
+ class Base
4
+ extend HMachine
5
+
6
+ class << self
7
+ def name(root=nil)
8
+ @name = HMachine.normalize(root) if root
9
+ @name
10
+ end
11
+
12
+ def selector(css=nil)
13
+ @selector = css if css
14
+ @selector
15
+ end
16
+
17
+ def parent(owner=nil)
18
+ @parent = owner.respond_to?(:extract) ? owner : HMachine.map(owner) if owner
19
+ @parent
20
+ end
21
+
22
+ def inherited(subclass)
23
+ inheritable = [:@properties, :@has_one, :@has_many, :@search, :@extract, :@validate]
24
+ inheritable.each do |var|
25
+ subclass.instance_variable_set(var, instance_variable_get(var).dup) if instance_variable_get(var)
26
+ end
27
+ end
28
+
29
+ # Instead of getting the contents of a node, this creates
30
+ # a POSH format from the node
31
+ def extract(pattern = nil, &block)
32
+ if !@extract
33
+ if pattern
34
+ @extract = HMachine.map(pattern).extract
35
+ elsif block_given?
36
+ @extract = block
37
+ elsif properties.empty?
38
+ @extract = HMachine::Pattern::ValueClass.extract
39
+ end
40
+ end
41
+ @extract || lambda{|node| self.new(node) }
42
+ end
43
+
44
+ def search(&block)
45
+ @search = block if block_given?
46
+ @search || lambda do |node|
47
+ if selector
48
+ node.css(selector)
49
+ elsif name
50
+ node.css(".#{name}".gsub('_','-'))
51
+ else
52
+ node
53
+ end
54
+ end
55
+ end
56
+
57
+ def validate(&block)
58
+ @validate = block if block_given?
59
+ @validate || lambda {|node| selector ? node.matches?(selector) : found_in?(node.parent) }
60
+ end
61
+
62
+ def add_property(property_name, &block)
63
+ if property_name.respond_to?(:property_of?)
64
+ property = property_name
65
+ else
66
+ property = Class.new(HMachine::POSH::Base)
67
+ property.name property_name
68
+ property.parent self
69
+ property.instance_eval(&block) if block_given?
70
+ end
71
+ properties[property.name] = property
72
+ property
73
+ end
74
+
75
+ def properties
76
+ @properties ||= {}
77
+ end
78
+
79
+ def [](key)
80
+ properties[key]
81
+ end
82
+
83
+ def property_of?(format)
84
+ HMachine.map(format) == parent
85
+ end
86
+ alias child_of? property_of?
87
+
88
+ def has_one(*property_names, &block)
89
+ property_names.collect do |name|
90
+ property = has_one!(name, &block)
91
+ define_method property.name do
92
+ self[property.name]
93
+ end
94
+ property
95
+ end
96
+ end
97
+
98
+ def has_many(*property_names, &block)
99
+ property_names.collect do |name|
100
+ property = has_many!(name, &block)
101
+ define_method property.name do
102
+ self[property.name]
103
+ end
104
+ property
105
+ end
106
+ end
107
+
108
+ def has_one!(property_name, &block)
109
+ @has_one ||= []
110
+ property = add_property(property_name, &block)
111
+ @has_one << property
112
+ property
113
+ end
114
+
115
+ def has_many!(property_name, &block)
116
+ @has_many ||= []
117
+ property = add_property(property_name, &block)
118
+ @has_many << property
119
+ property
120
+ end
121
+
122
+ def one
123
+ @has_one
124
+ end
125
+
126
+ def many
127
+ @has_many
128
+ end
129
+
130
+ # Remove a format from a node if it is nested.
131
+ def remove_nested(node)
132
+ if (find_in(node) != node)
133
+ find_in(node).unlink if found_in?(node)
134
+ end
135
+ node
136
+ end
137
+
138
+ def get_properties(node, props=properties)
139
+ hash ||= {}
140
+ props.each_pair do |key, property|
141
+ hash[key] = if one && one.include?(property)
142
+ property.parse_first(node)
143
+ else
144
+ property.parse(node)
145
+ end
146
+ end
147
+ hash.reject do |key,value|
148
+ value.respond_to?(:empty?) ? value.empty? : value.nil?
149
+ end
150
+ end
151
+
152
+ end
153
+
154
+ attr_reader :node, :parent, :source
155
+
156
+ def initialize(node, parent=nil)
157
+ raise 'Uh OH' unless self.class.valid?(node)
158
+ @node = node
159
+ @source = node.document.url if node.document.url
160
+ @parent = parent if parent
161
+ @first_node = self.class.remove_nested(node.dup)
162
+ end
163
+
164
+ def [](property_key)
165
+ to_h[property_key]
166
+ end
167
+
168
+ def properties
169
+ @properties ||= self.class.properties.reject { |key, property|
170
+ !property.found_in?(@first_node)
171
+ }
172
+ end
173
+
174
+ def to_h
175
+ @to_h ||= self.class.get_properties @first_node, properties
176
+ end
177
+
178
+ def inspect
179
+ to_h.inspect
180
+ end
181
+
182
+ def has_property?(key)
183
+ to_h.has_key?(key)
184
+ end
185
+
186
+ def to_s
187
+ node.to_s
188
+ end
189
+
190
+ def to_html
191
+ node.to_html
192
+ end
193
+
194
+ def empty?
195
+ to_h.empty?
196
+ end
197
+
198
+ def each_pair(&block)
199
+ to_h.each_pair(&block)
200
+ end
201
+
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,41 @@
1
+ module HMachine
2
+ module POSH
3
+ class DefinitionList < Base
4
+
5
+ selector 'dl'
6
+
7
+ extract {|dl| self.new(dl) }
8
+
9
+ def self.build_dictionary(dl)
10
+ dictionary = {}
11
+ terms = dl.children.select {|dt| dt.elem? && dt.node_name.eql?('dt') }
12
+ terms.each do |term|
13
+ definition = term.next_element if term.next_element.node_name.eql?('dd')
14
+ nested_dls = definition.children.select {|dd| dd.elem? && dd.node_name.eql?('dl') }
15
+ if nested_dls.empty?
16
+ value = definition.content.strip
17
+ elsif nested_dls.length.eql?(1)
18
+ value = build_dictionary(nested_dls.first)
19
+ else
20
+ # if there are multiple nested <dl> elements, merge them together
21
+ value = {}
22
+ nested_dls.each do |dict|
23
+ value.merge! build_dictionary(dict)
24
+ end
25
+ end
26
+ dictionary[term.content.strip.intern] = value
27
+ end
28
+ dictionary
29
+ end
30
+
31
+ def properties
32
+ to_h
33
+ end
34
+
35
+ def to_h
36
+ @to_h ||= self.class.build_dictionary(node)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,466 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" id="huffduffer-com">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>
6
+ Huffduffer
7
+ </title>
8
+ <meta name="description" content="Create your own podcast: find links to audio files on the Web; huffduff the links (add them to your podcast); subscribe to podcasts of other found sounds.">
9
+ <link rel="stylesheet" type="text/css" href="/css/screen.css?20100101" media="all">
10
+ <link rel="stylesheet" type="text/css" href="/css/mobile.css" media="handheld">
11
+ <link rel="search" type="application/opensearchdescription+xml" href="http://huffduffer.com/opensearch.xml" title="Huffduffer">
12
+ <link rel="alternate" type="application/rss+xml" title="RSS" href="http://huffduffer.com/new/rss">
13
+ <link rel="alternate" type="application/atom+xml" title="Atom" href="http://huffduffer.com/new/atom">
14
+ <link rel="alternate" type="application/json" title="JSON" href="http://huffduffer.com/new/json">
15
+ <link rel="alternate" type="application/xml+xspf" title="XSPF" href="http://huffduffer.com/new/xspf">
16
+ <link rel="canonical" href="http://huffduffer.com/">
17
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
18
+ <script src="/js/english.js"></script>
19
+ <script src="/js/global.js"></script>
20
+ </head>
21
+ <body>
22
+
23
+ <div class="nav" role="navigation">
24
+ <ul>
25
+ <li class="vcard"><a class="button fn nickname url" href="/mawunsch" title="Your profile">mawunsch</a></li>
26
+ <li><a class="button" href="/add">Huffduff it</a></li>
27
+ <li><a class="button" href="/logout">Log out</a></li>
28
+ </ul>
29
+ <form method="get" action="/search" role="search">
30
+ <label for="query">Search</label>
31
+ <input
32
+ type="search" name="q" id="query">
33
+ <button type="submit">Go!</button>
34
+ </form>
35
+ </div><!-- /.nav -->
36
+
37
+
38
+ <div class="header" id="logo" role="banner">
39
+ <img src="/images/huffduffer-large.gif" alt="Huffduffer">
40
+ </div><!-- /.header#logo -->
41
+
42
+ <div class="section" role="main">
43
+
44
+ <div class="header">
45
+
46
+ <div class="section">
47
+ <h1>Ahoy <a href="/mawunsch">mawunsch</a></h1>
48
+ <ol class="instructions">
49
+ <li>One thousand and twenty-two <a href="/new">new</a>,</li>
50
+ <li>nothing new from <a href="/mawunsch/collective">your collective</a>,</li>
51
+ <li>four hundred and forty-four new <a href="/people">
52
+ people</a></li>
53
+ </ol>
54
+ <p>&hellip;since you were last here.</p>
55
+ </div><!-- /.section -->
56
+
57
+ <div class="aside">
58
+ <h2>
59
+ Busy huffduffers
60
+ </h2>
61
+ <div class="info">
62
+ <ul>
63
+ <li class="vcard">
64
+ <a class="url" href="/jeremyll">
65
+ <img class="photo" src="http://a1.twimg.com/profile_images/55223564/IMG_0582_normal.JPG" alt="">
66
+ <span class="fn nickname">jeremyll</span>
67
+ </a>
68
+ </li>
69
+ <li class="vcard">
70
+ <a class="url" href="/adewale">
71
+ <img class="photo" src="http://farm1.static.flickr.com/205/buddyicons/38234898@N00.jpg" alt="">
72
+ <span class="fn nickname">adewale</span>
73
+ </a>
74
+ </li>
75
+ <li class="vcard">
76
+ <a class="url" href="/damndirtypandas">
77
+ <img src="/images/flags//_32x32.gif" alt="">
78
+ <span class="fn nickname">damndirtypandas</span>
79
+ </a>
80
+ </li>
81
+ </ul>
82
+ </div><!-- /.info -->
83
+ <p class="pagination"><a rel="next" href="/people">More people</a></p>
84
+ </div><!-- /.aside -->
85
+
86
+ </div><!-- /.header -->
87
+
88
+ <div class="section">
89
+
90
+ <h2><a href="/popular">Popular</a></h2>
91
+ <ol class="hfeed">
92
+ <li class="hentry" role="article">
93
+ <a class="button" href="/add/11559">Huffduff it</a>
94
+ <h3 class="entry-title">
95
+ <a rel="bookmark" href="/BeetleB/11559">
96
+ The War for the Web</a>
97
+ </h3>
98
+ <div class="entry-content">
99
+ <p>Tim O&#8217;Reilly
100
+ Web 2.0 Conference
101
+ 23 minutes, 11mb, recorded 2009-11-17</p>
102
+
103
+ <p>The early days of the internet were truly astonishing. As people came to comprehend the power of networked information, they seized the many opportunities for innovation created by the open architecture of the web. Of course, the browser wars also showed that threats to openness and interoperability were a real danger. Today, Tim O&#8217;Reilly worries that escalating competition between large companies and closed platforms may drive the web towards a battle ground of locked down services and proprietary data.</p>
104
+
105
+ <p>As large, powerful players have emerged on the internet landscape, you don&#8217;t have to look far to see some troubling skirmishes between opposing forces. O&#8217;Reilly touches on several examples where well known web applications include features designed to limit flexibility and user choice. To some extent, limits may be necessary to protect privacy, but in some cases, there is clear intent to lock in users at the expense of the competition. The situation is even more extreme in the mobile arena.</p>
106
+
107
+ <p>Will the large companies play by the cherished rules of the open web as we&#8217;ve known it? It may depend on how &quot;the cloud&quot; grows. As web service companies such as Amazon, Google, Apple and Microsoft make O&#8217;Reilly&#8217;s notion of the web 2.0 &quot;internet as a platform&quot; a reality, they will have choices on how to maneuver. There is pressure for the giants to forge alliances, and leverage unique services as weapons to gain competitive advantage in the marketplace. But, history has shown that internet success often comes if you &quot;do what you do best, link to the rest&quot;. O&#8217;Reilly urges companies to stick to their core strengths, maintain an open architecture, and embrace the &quot;small pieces loosely joined&quot; philosophy.</p>
108
+
109
+ <p>From: <a href="http://itc.conversationsnetwork.org/shows/detail4317.html?utm_source=feedburner&amp;utm_medium=feed">http://itc.conversationsnetwork.org/shows/detail4317.html?utm_source=feedburner&amp;utm_medium=feed</a></p>
110
+ </div>
111
+
112
+ <object type="application/x-shockwave-flash" id="audioplayer1" data="/flash/player.swf?soundFile=http://itc.conversationsnetwork.org/audio/download/ITC-TimOReilly-2009.11.17.mp3&amp;playerID=1" width="290" height="24">
113
+ <param name="movie" value="/flash/player.swf?soundFile=http://itc.conversationsnetwork.org/audio/download/ITC-TimOReilly-2009.11.17.mp3">
114
+ <param name="quality" value="high">
115
+ <param name="menu" value="false">
116
+ <param name="wmode" value="transparent">
117
+ </object>
118
+ <div class="xfolkentry">
119
+ <p>
120
+ <a rel="enclosure" class="taggedlink" href="http://itc.conversationsnetwork.org/audio/download/ITC-TimOReilly-2009.11.17.mp3" type="audio/mpeg" title="download The War for the Web">download</a>
121
+ </p>
122
+ <p class="tagged">
123
+ Tagged with
124
+ <a rel="tag" href="/tags/event%3Aspeaker%3Dtim+o%27reilly">
125
+ event:speaker=tim o'reilly</a>
126
+ <a rel="tag" href="/tags/event%3Aname%3Dweb2.0">
127
+ event:name=web2.0</a>
128
+ <a rel="tag" href="/tags/event%3Ayear%3D2009">
129
+ event:year=2009</a>
130
+ <a rel="tag" href="/tags/internet">
131
+ internet</a>
132
+ <a rel="tag" href="/tags/web">
133
+ web</a>
134
+ <a rel="tag" href="/tags/data+silo">
135
+ data silo</a>
136
+ <a rel="tag" href="/tags/privacy">
137
+ privacy</a>
138
+ <a rel="tag" href="/tags/competition">
139
+ competition</a>
140
+ </p>
141
+ </div><!-- /.xfolkentry -->
142
+ <p class="author vcard">
143
+ &mdash;Huffduffed by
144
+ <a class="fn nickname url" href="/BeetleB">BeetleB</a>
145
+ <abbr class="published" title="2010-01-09T15:28:24">
146
+ 4 days ago</abbr>
147
+ </p>
148
+ </li>
149
+ <li class="hentry" role="article">
150
+ <a class="button" href="/add/11467">Huffduff it</a>
151
+ <h3 class="entry-title">
152
+ <a rel="bookmark" href="/gpeterson/11467">
153
+ Great Work Interview - Merlin Mann</a>
154
+ </h3>
155
+ <div class="entry-content">
156
+ <p><a href="http://www.boxofcrayons.biz/2009/11/great-work-interview-merlin-mann/">http://www.boxofcrayons.biz/2009/11/great-work-interview-merlin-mann/</a> </p>
157
+
158
+ <p>Here’s a confession. I want to be able to think like Merlin Mann.</p>
159
+
160
+ <p>He’s really smart on the topic of productivity, and in fact some part of his success comes from 43Folders.com which is a reference to David Allen’s Getting Things Done system. But his work is not just about productivity. It’s about creativity and purpose and striving to stay human and sane in a busy and distracting world and doing work that matters, doing Great Work. And he does all of this in funny, provocative, iconoclastic way.</p>
161
+
162
+ <p>In fact, writing this introduction and listening to the interview again has already provoked me to shift some of my own commitments in an effort to, as he puts it, “identify and destroy small return bullshit. Shut off anything that’s noisier than it is useful.” Great stuff indeed, and this is a wise and funny interview.</p>
163
+
164
+ <p>In our conversation we talk about:</p>
165
+
166
+ <pre><code>* How the present is a “remedial course for the future” – and the pros and cons of those ‘creation myth’ stories of where people find clues for their Great Work
167
+ * The importance of an open heart and just where that might lead you
168
+ * The connection between productivity and creativity
169
+ * The two levels of prioritization (and how freeing it is to know that)
170
+ * And quite a bit more
171
+ </code></pre>
172
+
173
+ <p>You can follow Merlin on Twitter at <a href="http://twitter.com/hotdogsladies">http://twitter.com/hotdogsladies</a></p>
174
+
175
+ <p>The interviews are all between 25 and 30 minutes long.
176
+ You can either download them here as mp3s, or go to iTunes, type in “Great Work Interviews” and you’ll see them all there.</p>
177
+ </div>
178
+
179
+ <object type="application/x-shockwave-flash" id="audioplayer2" data="/flash/player.swf?soundFile=http://fygwints.s3.amazonaws.com/m-o-3142sY/MannMerlin.mp3&amp;playerID=2" width="290" height="24">
180
+ <param name="movie" value="/flash/player.swf?soundFile=http://fygwints.s3.amazonaws.com/m-o-3142sY/MannMerlin.mp3">
181
+ <param name="quality" value="high">
182
+ <param name="menu" value="false">
183
+ <param name="wmode" value="transparent">
184
+ </object>
185
+ <div class="xfolkentry">
186
+ <p>
187
+ <a rel="enclosure" class="taggedlink" href="http://fygwints.s3.amazonaws.com/m-o-3142sY/MannMerlin.mp3" type="audio/mpeg" title="download Great Work Interview - Merlin Mann">download</a>
188
+ </p>
189
+ <p class="tagged">
190
+ Tagged with
191
+ <a rel="tag" href="/tags/merlin+mann">
192
+ merlin mann</a>
193
+ <a rel="tag" href="/tags/great+work">
194
+ great work</a>
195
+ <a rel="tag" href="/tags/michael+bungay+stanier">
196
+ michael bungay stanier</a>
197
+ </p>
198
+ </div><!-- /.xfolkentry -->
199
+ <p class="author vcard">
200
+ &mdash;Huffduffed by
201
+ <a class="fn nickname url" href="/gpeterson">gpeterson</a>
202
+ <abbr class="published" title="2010-01-09T02:53:41">
203
+ 4 days ago</abbr>
204
+ </p>
205
+ </li>
206
+ <li class="hentry" role="article">
207
+ <a class="button" href="/add/11573">Huffduff it</a>
208
+ <h3 class="entry-title">
209
+ <a rel="bookmark" href="/vickis/11573">
210
+ Design for the Wisdom of Crowds</a>
211
+ </h3>
212
+ <div class="entry-content">
213
+ <p>People are often dumb, so how can crowds be wise? James Surowiecki laid the groundwork in his book, &quot;The Wisdom of Crowds.&quot; In this solo presentation, Derek Powazek will apply those ideas to the web, concentrating on how to design websites that empower people to work together to create something truly awesome.</p>
214
+
215
+ <p>Derek Powazek Grand Poo-Bah, Powazek Productions </p>
216
+ </div>
217
+
218
+ <object type="application/x-shockwave-flash" id="audioplayer3" data="/flash/player.swf?soundFile=http://audio.sxsw.com/2009/podcasts/D3%20SXSW_PODCASTS/031509_AM2_BallA_DesignForWisdomOfCrowds.mp3&amp;playerID=3" width="290" height="24">
219
+ <param name="movie" value="/flash/player.swf?soundFile=http://audio.sxsw.com/2009/podcasts/D3%20SXSW_PODCASTS/031509_AM2_BallA_DesignForWisdomOfCrowds.mp3">
220
+ <param name="quality" value="high">
221
+ <param name="menu" value="false">
222
+ <param name="wmode" value="transparent">
223
+ </object>
224
+ <div class="xfolkentry">
225
+ <p>
226
+ <a rel="enclosure" class="taggedlink" href="http://audio.sxsw.com/2009/podcasts/D3%20SXSW_PODCASTS/031509_AM2_BallA_DesignForWisdomOfCrowds.mp3" type="audio/mpeg" title="download Design for the Wisdom of Crowds">download</a>
227
+ </p>
228
+ <p class="tagged">
229
+ Tagged with
230
+ <a rel="tag" href="/tags/sxsw">
231
+ sxsw</a>
232
+ <a rel="tag" href="/tags/sxswi">
233
+ sxswi</a>
234
+ <a rel="tag" href="/tags/sxswi2009">
235
+ sxswi2009</a>
236
+ <a rel="tag" href="/tags/sxswi09">
237
+ sxswi09</a>
238
+ <a rel="tag" href="/tags/sxsw09">
239
+ sxsw09</a>
240
+ <a rel="tag" href="/tags/sxswi09">
241
+ sxswi09</a>
242
+ <a rel="tag" href="/tags/derek+powazek">
243
+ derek powazek</a>
244
+ <a rel="tag" href="/tags/james+surowiecki">
245
+ james surowiecki</a>
246
+ <a rel="tag" href="/tags/wisdom+of+crowds">
247
+ wisdom of crowds</a>
248
+ <a rel="tag" href="/tags/design">
249
+ design</a>
250
+ <a rel="tag" href="/tags/web+design">
251
+ web design</a>
252
+ </p>
253
+ </div><!-- /.xfolkentry -->
254
+ <p class="author vcard">
255
+ &mdash;Huffduffed by
256
+ <a class="fn nickname url" href="/vickis">vickis</a>
257
+ <abbr class="published" title="2010-01-09T18:16:37">
258
+ 3 days ago</abbr>
259
+ </p>
260
+ </li>
261
+ </ol><p class="pagination"><a rel="next" href="/popular">More popular</a></p>
262
+
263
+ <h2><a href="/tags">Tags</a></h2>
264
+ <p class="tags">
265
+ <a class="ubiquitous" href="/tags/design">design</a>
266
+ <a class="rife-ubiquitous" href="/tags/business">business</a>
267
+ <a class="rife-ubiquitous" href="/tags/music">music</a>
268
+ <a class="rife-ubiquitous" href="/tags/science+fiction">science fiction</a>
269
+ <a class="rife-ubiquitous" href="/tags/sxsw">sxsw</a>
270
+ <a class="rife-ubiquitous" href="/tags/sxsw09">sxsw09</a>
271
+ <a class="rife-ubiquitous" href="/tags/sxswi">sxswi</a>
272
+ <a class="rife-ubiquitous" href="/tags/technology">technology</a>
273
+ <a class="rife-ubiquitous" href="/tags/web">web</a>
274
+ <a class="popular-rife" href="/tags/biology">biology</a>
275
+ <a class="popular-rife" href="/tags/culture">culture</a>
276
+ <a class="popular-rife" href="/tags/economics">economics</a>
277
+ <a class="popular-rife" href="/tags/google">google</a>
278
+ <a class="popular-rife" href="/tags/home+business">home business</a>
279
+ <a class="popular-rife" href="/tags/innovation">innovation</a>
280
+ <a class="popular-rife" href="/tags/interview">interview</a>
281
+ <a class="popular-rife" href="/tags/javascript">javascript</a>
282
+ <a class="popular-rife" href="/tags/mlm">mlm</a>
283
+ <a class="popular-rife" href="/tags/network+marketing">network marketing</a>
284
+ <a class="popular-rife" href="/tags/podcast">podcast</a>
285
+ <a class="popular-rife" href="/tags/psychology">psychology</a>
286
+ <a class="popular-rife" href="/tags/science">science</a>
287
+ <a class="popular-rife" href="/tags/send+out+cards">send out cards</a>
288
+ <a class="popular-rife" href="/tags/soc+training">soc training</a>
289
+ <a class="popular" href="/tags/al-jifri">al-jifri</a>
290
+ <a class="popular" href="/tags/ali">ali</a>
291
+ <a class="popular" href="/tags/book">book</a>
292
+ <a class="popular" href="/tags/comics">comics</a>
293
+ <a class="popular" href="/tags/education">education</a>
294
+ <a class="popular" href="/tags/environment">environment</a>
295
+ <a class="popular" href="/tags/event%3Ayear%3D2009">event:year=2009</a>
296
+ <a class="popular" href="/tags/evolution">evolution</a>
297
+ <a class="popular" href="/tags/food">food</a>
298
+ <a class="popular" href="/tags/future">future</a>
299
+ <a class="popular" href="/tags/habib">habib</a>
300
+ <a class="popular" href="/tags/iso50">iso50</a>
301
+ <a class="popular" href="/tags/merlin-mann">merlin-mann</a>
302
+ <a class="popular" href="/tags/mobile">mobile</a>
303
+ <a class="popular" href="/tags/networks">networks</a>
304
+ <a class="popular" href="/tags/npr">npr</a>
305
+ <a class="popular" href="/tags/sitepoint">sitepoint</a>
306
+ <a class="popular" href="/tags/skillswap">skillswap</a>
307
+ <a class="popular" href="/tags/sxsw2009">sxsw2009</a>
308
+ <a class="popular" href="/tags/sxswi09">sxswi09</a>
309
+ <a class="popular" href="/tags/sxswi2009">sxswi2009</a>
310
+ <a class="popular" href="/tags/ux">ux</a>
311
+ <a class="popular" href="/tags/web-development">web-development</a>
312
+ <a class="popular" href="/tags/wnyc">wnyc</a>
313
+ <a class="popular" href="/tags/writing">writing</a>
314
+ </p>
315
+ <p class="pagination"><a rel="next" href="/tags">More tags</a></p>
316
+
317
+ </div><!-- /.section -->
318
+
319
+ <div class="aside">
320
+
321
+ <h2><a href="/new">New</a></h2>
322
+ <ol class="hfeed">
323
+ <li class="hentry" role="article">
324
+ <a class="button" href="/add/11976">Huffduff it</a>
325
+ <h3 class="entry-title">
326
+ <a rel="bookmark" href="/mwiik/11976">
327
+ Kiosk by Bruce Sterling</a>
328
+ </h3>
329
+
330
+ <object type="application/x-shockwave-flash" id="audioplayer4" data="/flash/player.swf?soundFile=http://www.podtrac.com/pts/redirect.mp3/media.libsyn.com/media/starshipsofa/StarShipSofa_Aural_Delights_No_116_Bruce_Sterling.mp3&amp;playerID=4" width="290" height="24">
331
+ <param name="movie" value="/flash/player.swf?soundFile=http://www.podtrac.com/pts/redirect.mp3/media.libsyn.com/media/starshipsofa/StarShipSofa_Aural_Delights_No_116_Bruce_Sterling.mp3">
332
+ <param name="quality" value="high">
333
+ <param name="menu" value="false">
334
+ <param name="wmode" value="transparent">
335
+ </object>
336
+ <div class="xfolkentry">
337
+ <p>
338
+ <a rel="enclosure" class="taggedlink" href="http://www.podtrac.com/pts/redirect.mp3/media.libsyn.com/media/starshipsofa/StarShipSofa_Aural_Delights_No_116_Bruce_Sterling.mp3" type="audio/mpeg" title="download Kiosk by Bruce Sterling">download</a>
339
+ </p>
340
+ <p class="tagged">
341
+ Tagged with
342
+ <a rel="tag" href="/tags/scifi">
343
+ scifi</a>
344
+ <a rel="tag" href="/tags/brucesterling">
345
+ brucesterling</a>
346
+ </p>
347
+ </div><!-- /.xfolkentry -->
348
+ <p class="author vcard">
349
+ &mdash;Huffduffed by
350
+ <a class="fn nickname url" href="/mwiik">mwiik</a>
351
+ <abbr class="published" title="2010-01-13T14:18:58">
352
+ one hour ago</abbr>
353
+ </p>
354
+ </li>
355
+ <li class="hentry" role="article">
356
+ <a class="button" href="/add/11975">Huffduff it</a>
357
+ <h3 class="entry-title">
358
+ <a rel="bookmark" href="/Clampants/11975">
359
+ The Science of Parallel Universes - could there be copies of YOU out there?</a>
360
+ </h3>
361
+ <div class="entry-content">
362
+ <p>New theories in physics claim that each of us has many exact replicas of ourselves in other universes - in theory you could get in a spaceship and if you travelled far enough, meet your identical self in an identical world! Some cosmologists say that if you accept space is infinite, then even the most improbable event must take place eventually. Join our panel of cosmologists and philosophers and bend your mind. Cafe Scientific at the Sydney Writers Festival Hosted by Dr Paul Willis, reporter ABC Catalyst</p>
363
+ </div>
364
+
365
+ <object type="application/x-shockwave-flash" id="audioplayer5" data="/flash/player.swf?soundFile=http://mpegmedia.abc.net.au/rn/podcast/2009/12/bia_20091227.mp3&amp;playerID=5" width="290" height="24">
366
+ <param name="movie" value="/flash/player.swf?soundFile=http://mpegmedia.abc.net.au/rn/podcast/2009/12/bia_20091227.mp3">
367
+ <param name="quality" value="high">
368
+ <param name="menu" value="false">
369
+ <param name="wmode" value="transparent">
370
+ </object>
371
+ <div class="xfolkentry">
372
+ <p>
373
+ <a rel="enclosure" class="taggedlink" href="http://mpegmedia.abc.net.au/rn/podcast/2009/12/bia_20091227.mp3" type="audio/mpeg" title="download The Science of Parallel Universes - could there be copies of YOU out there?">download</a>
374
+ </p>
375
+ <p class="tagged">
376
+ Tagged with
377
+ <a rel="tag" href="/tags/science">
378
+ science</a>
379
+ <a rel="tag" href="/tags/quantum+theory">
380
+ quantum theory</a>
381
+ <a rel="tag" href="/tags/space">
382
+ space</a>
383
+ <a rel="tag" href="/tags/cosmos">
384
+ cosmos</a>
385
+ <a rel="tag" href="/tags/cosmology">
386
+ cosmology</a>
387
+ <a rel="tag" href="/tags/universe">
388
+ universe</a>
389
+ <a rel="tag" href="/tags/many-worlds+theory">
390
+ many-worlds theory</a>
391
+ <a rel="tag" href="/tags/theoretical+physics">
392
+ theoretical physics</a>
393
+ <a rel="tag" href="/tags/philosophy">
394
+ philosophy</a>
395
+ </p>
396
+ </div><!-- /.xfolkentry -->
397
+ <p class="author vcard">
398
+ &mdash;Huffduffed by
399
+ <a class="fn nickname url" href="/Clampants">Clampants</a>
400
+ <abbr class="published" title="2010-01-13T13:24:05">
401
+ 2 hours ago</abbr>
402
+ </p>
403
+ </li>
404
+ <li class="hentry" role="article">
405
+ <a class="button" href="/add/11966">Huffduff it</a>
406
+ <h3 class="entry-title">
407
+ <a rel="bookmark" href="/pedro/11966">
408
+ Freelance to Agency: Start Small, Stay Small</a>
409
+ </h3>
410
+ <div class="entry-content">
411
+ <p>Happy Cog
412
+ Brain Traffic
413
+ From <a href="http://2009.sxsw.com/taxonomy/term/44?page=11">http://2009.sxsw.com/taxonomy/term/44?page=11</a></p>
414
+ </div>
415
+
416
+ <object type="application/x-shockwave-flash" id="audioplayer6" data="/flash/player.swf?soundFile=http://audio.sxsw.com/2009/podcasts/D2%20SXSW_PODCASTS/031409_AM1_BallC_FreelancetoAgency.mp3&amp;playerID=6" width="290" height="24">
417
+ <param name="movie" value="/flash/player.swf?soundFile=http://audio.sxsw.com/2009/podcasts/D2%20SXSW_PODCASTS/031409_AM1_BallC_FreelancetoAgency.mp3">
418
+ <param name="quality" value="high">
419
+ <param name="menu" value="false">
420
+ <param name="wmode" value="transparent">
421
+ </object>
422
+ <div class="xfolkentry">
423
+ <p>
424
+ <a rel="enclosure" class="taggedlink" href="http://audio.sxsw.com/2009/podcasts/D2%20SXSW_PODCASTS/031409_AM1_BallC_FreelancetoAgency.mp3" type="audio/mpeg" title="download Freelance to Agency: Start Small, Stay Small">download</a>
425
+ </p>
426
+ <p class="tagged">
427
+ Tagged with
428
+ <a rel="tag" href="/tags/sxsw09">
429
+ sxsw09</a>
430
+ </p>
431
+ </div><!-- /.xfolkentry -->
432
+ <p class="author vcard">
433
+ &mdash;Huffduffed by
434
+ <a class="fn nickname url" href="/pedro">pedro</a>
435
+ <abbr class="published" title="2010-01-13T11:26:42">
436
+ 4 hours ago</abbr>
437
+ </p>
438
+ </li>
439
+ </ol><p class="pagination"><a rel="next" href="/new">More new</a></p>
440
+
441
+ </div><!-- /.aside -->
442
+
443
+ </div><!-- /.section -->
444
+
445
+ <div class="footer">
446
+
447
+
448
+
449
+ <h2>Bookmarklet</h2>
450
+ <p>Drag this link to your browser's bookmarks bar:
451
+ <a href="javascript:var%20w=window.open('http://huffduffer.com/add?popup=true&amp;page='+encodeURIComponent(location.href),'huffduff','scrollbars=1,status=0,resizable=1,location=0,toolbar=0,width=360,height=480');">Huffduff it</a>
452
+ </p>
453
+ <p>The next time you visit a page with an interesting audio recording, press the bookmarklet to huffduff it.</p>
454
+
455
+
456
+ <ul>
457
+ <li><a href="/about">About Huffduffer</a></li>
458
+ <li><a href="/api">API</a></li>
459
+ <li><a href="http://getsatisfaction.com/huffduffer" rel="tag">Questions, comments, or suggestions</a></li>
460
+ <li><a href="http://twitter.com/huffduffer">@huffduffer</a></li>
461
+ </ul>
462
+
463
+ </div><!-- /.footer -->
464
+
465
+ </body>
466
+ </html>