Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://bricolage.io/rss.xml

  1. <?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bricolage]]></title><description><![CDATA[Kyle Mathews' blog yo]]></description><link>http://github.com/dylang/node-rss</link><generator>GatsbyJS</generator><lastBuildDate>Sat, 13 Apr 2024 03:36:11 GMT</lastBuildDate><item><title><![CDATA[The Rise of Protocols]]></title><description><![CDATA[Here’s a quick sketch about why I think protocols are so important and why I think protocol design is a practical skill for many of us to…]]></description><link>https://bricolage.io/the-rise-of-protocols/</link><guid isPermaLink="false">https://bricolage.io/the-rise-of-protocols/</guid><pubDate>Tue, 09 Apr 2024 21:02:20 GMT</pubDate><content:encoded>&lt;p&gt;Here’s a quick sketch about why I think protocols are so important and why I think protocol design is a practical skill for many of us to learn.&lt;/p&gt;
  2. &lt;p&gt;I’ve been loosely involved with the &lt;a href=&quot;https://summerofprotocols.com/&quot;&gt;Summer of Protocols&lt;/a&gt; program since last year and have eagerly been following the discussions and reading their essays as they come out.&lt;/p&gt;
  3. &lt;p&gt;They’re tackling one of the largest problems facing the world right now — that the institutions we rely on to guide collective decision making and behaviors are struggling to adapt to the changing world. This is most clearly measured by the long-term drop in the confidence people have in important institutions.&lt;/p&gt;
  4. &lt;p&gt;&lt;span
  5.      class=&quot;gatsby-resp-image-wrapper&quot;
  6.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  7.    &gt;
  8.      &lt;a
  9.    class=&quot;gatsby-resp-image-link&quot;
  10.    href=&quot;/static/b9be10187d039d1c795983827a07b0a0/cd138/average-confidence-in-major-u.s.-institutions-1979-2023.png&quot;
  11.    style=&quot;display: block&quot;
  12.    target=&quot;_blank&quot;
  13.    rel=&quot;noopener&quot;
  14.  &gt;
  15.    &lt;span
  16.    class=&quot;gatsby-resp-image-background-image&quot;
  17.    style=&quot;padding-bottom: 83.78378378378379%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACYklEQVR42o1U2VbiQBDl/3/IUXT0MCo7BEM2EgjZWF0QmOdr3Upac2Y5Mw83XXW7Ul1LVzeWr3N4+RTB2sNs48FfOarPqAu8opTDja+rXzhqQ53wc0e5aBcgPyZouPLzTbeJ5uM3tEZ3uO3f4OrhAvdWS3F5fyHctcqt0a3aXXeu8DD5gbZ9jxuRr9uX6DqPWJ0zNOb7GeylBSd9gptNZbVFn2CaTJRTWcConYQ2toJ7qov9U2xh+bpAcZIIo90Mfa8Daz7CRDDwu6qPw8GnTljzIUazvsg9WFEp990OhsqV+9n7Eo34OUK8DzV/Eul7rKBsuDrSQ/wbZ3itIZVElOKUYi01WJ8ybM556UxAfqXIUBxT5JIW93Q18vFLbhTyCZ4DuM8e7J2DVtpDtxirEzqO3+YIX0L4YrM8LITLdI//8QAGwEON4wavDWFtp5hspojlJ8qdfIR2PlRQNrq79/UAOk+kNNO9pzozUId5lRZPWlenE/HbAtFrpEaMavuzwEKi/fWAtqz9lYVYgsrZlER+ZISmASZ0pkTH2ZGNKkFuc8q1FGwCm7c7FwheAtiFjfwgDnWj6tD/gAcQeVU3yprVuZbyn67HF+LSyfvfkdYy02sTrFzMVmZOXdUVRbn6NVltqzk3IMdZZi+0huHWR7QNZLNciZB69QAYR35ROldHwnvyMBinHGF1yKg47M3HSx10Dv9d/7sM/JXoTX0QhkEPAwFHshzNrnIcwZ6M39NijOStHI5yUiTKVAiuKh9iNTBjxoIXVeHrq7nQc3kPQsmOt+XzHtZR5/7d9dIhy8QAPgD5XMqGt6n6eQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  18.  &gt;&lt;/span&gt;
  19.  &lt;img
  20.        class=&quot;gatsby-resp-image-image&quot;
  21.        alt=&quot;Chart showing declining average confidence in major US institutions from 1979 to 2023&quot;
  22.        title=&quot;&quot;
  23.        src=&quot;/static/b9be10187d039d1c795983827a07b0a0/fcda8/average-confidence-in-major-u.s.-institutions-1979-2023.png&quot;
  24.        srcset=&quot;/static/b9be10187d039d1c795983827a07b0a0/12f09/average-confidence-in-major-u.s.-institutions-1979-2023.png 148w,
  25. /static/b9be10187d039d1c795983827a07b0a0/e4a3f/average-confidence-in-major-u.s.-institutions-1979-2023.png 295w,
  26. /static/b9be10187d039d1c795983827a07b0a0/fcda8/average-confidence-in-major-u.s.-institutions-1979-2023.png 590w,
  27. /static/b9be10187d039d1c795983827a07b0a0/efc66/average-confidence-in-major-u.s.-institutions-1979-2023.png 885w,
  28. /static/b9be10187d039d1c795983827a07b0a0/c83ae/average-confidence-in-major-u.s.-institutions-1979-2023.png 1180w,
  29. /static/b9be10187d039d1c795983827a07b0a0/cd138/average-confidence-in-major-u.s.-institutions-1979-2023.png 1220w&quot;
  30.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  31.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  32.        loading=&quot;lazy&quot;
  33.        decoding=&quot;async&quot;
  34.      /&gt;
  35.  &lt;/a&gt;
  36.    &lt;/span&gt;&lt;/p&gt;
  37. &lt;p&gt;There’s a lot of discussion about why this is happening. My preferred theory atm is it’s a combination of &lt;em&gt;scaling problems&lt;/em&gt; — institutional practices invented in the previous decades and centuries are not scaling well as the world grows larger and more complex. And then the mother of all disruptions, &lt;em&gt;the internet&lt;/em&gt;, which changed how humanity senses the world — which disrupts many of the underlying mechanisms supporting institutions.&lt;/p&gt;
  38. &lt;p&gt;But regardless of &lt;em&gt;why&lt;/em&gt; it’s happening — we &lt;em&gt;have&lt;/em&gt; to fix it. Institutions &lt;em&gt;have&lt;/em&gt; to work — history shows over and over that when institutions stop working, society falls into anarchy and terror.&lt;/p&gt;
  39. &lt;p&gt;So the stakes couldn’t be higher.&lt;/p&gt;
  40. &lt;p&gt;How are the growing collective of researchers and practitioners around Summer of Protocols tackling this issue? They’re trying to create a powerful new way of thinking about protocols that’ll uplevel our collective imaginations and capabilities so that we can all iterate faster towards better ways of running the world.&lt;/p&gt;
  41. &lt;h2 id=&quot;what-are-protocols&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-are-protocols&quot; aria-label=&quot;what are protocols permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What are Protocols?&lt;/h2&gt;
  42. &lt;p&gt;What exactly are Protocols? My preferred simple definition for protocols is &lt;em&gt;any set of behaviors that make something more likely to happen&lt;/em&gt;.&lt;/p&gt;
  43. &lt;p&gt;Protocol Theory encompasses a huge range of related topics — habits, rules, laws, policy, frameworks, software protocols, algorithms, conventions, and standards. So it’s not a new topic — legal frameworks have existed for 1000s of years and religions and philosophers have long provided detailed sets of rules for living.&lt;/p&gt;
  44. &lt;p&gt;Venkatesh Rao, one of the co-founders of Summer of Protocols, &lt;a href=&quot;https://studio.ribbonfarm.com/p/in-search-of-hardness&quot;&gt;commented on this strangeness of Protocol Theory feeling new despite being very old&lt;/a&gt;:&lt;/p&gt;
  45. &lt;blockquote&gt;
  46. &lt;p&gt;This is rather odd, if you stop to think about it. Why do protocols feel like an &lt;strong&gt;emerging&lt;/strong&gt; world even though they’re clearly not?&lt;/p&gt;
  47. &lt;p&gt;Despite its antiquity and size, and despite all the recent drama around modern crypto technologies, the world of protocols is a strangely hidden one. Even though there are hundreds of millions of people around the world who explicitly organize their work and thinking around protocols of various sorts, the &lt;strong&gt;language&lt;/strong&gt; of protocols is not a familiar one. It is easier to look &lt;strong&gt;through&lt;/strong&gt; protocols than &lt;strong&gt;at&lt;/strong&gt; them. It is easier to act &lt;strong&gt;through&lt;/strong&gt; protocols than &lt;strong&gt;on&lt;/strong&gt; them. It is easier to systematize an emergent local practice into a bespoke local protocol than to think about the general features of &lt;strong&gt;all&lt;/strong&gt; protocols.&lt;/p&gt;
  48. &lt;/blockquote&gt;
  49. &lt;p&gt;Protocols again aren’t &lt;em&gt;new&lt;/em&gt;. They just haven’t been important enough in the past to emerge as their own field. As Venkat puts it, “protocols are evolving from an artisan craft to an engineering and art domain.”&lt;/p&gt;
  50. &lt;h2 id=&quot;see-the-protocols&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#see-the-protocols&quot; aria-label=&quot;see the protocols permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;See the Protocols&lt;/h2&gt;
  51. &lt;p&gt;Protocols thoroughly permeate our lives. There are 100s of protocols embedded in the walls of our homes. We follow dozens throughout our day-to-day lives from brushing our teeth to which side of the road we drive.&lt;/p&gt;
  52. &lt;p&gt;But like the &lt;a href=&quot;https://fs.blog/david-foster-wallace-this-is-water/&quot;&gt;famous “how’s the water?” fish story&lt;/a&gt; — for most of us, if someone asked “how’re the protocols?” we’d also respond “what the hell is a protocol?”&lt;/p&gt;
  53. &lt;p&gt;To successfully adapt our institutions, many of us are going to need to get a lot more comfortable at seeing the “water” of protocols that surround us.&lt;/p&gt;
  54. &lt;p&gt;It’s common for individuals or organizations to figure out how to get good outcomes but often the protocols that led to those good outcomes don’t spread beyond the initial innovators — often because the original people involved don’t fully understand the protocols they created!&lt;/p&gt;
  55. &lt;p&gt;The world is full of “&lt;a href=&quot;https://en.wikipedia.org/wiki/Just-so_story&quot;&gt;just-so stories&lt;/a&gt;” about why or why not someone or a group was successful. Protocol Theory can help us tease out the underlying protocols and sources of hardness that led to the success and help these protocols reproduce much more readily elsewhere.&lt;/p&gt;
  56. &lt;h2 id=&quot;engineer-the-protocols&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#engineer-the-protocols&quot; aria-label=&quot;engineer the protocols permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Engineer the Protocols&lt;/h2&gt;
  57. &lt;p&gt;Protocols Theory is the CAD software, CNC machines, jigs, dies and molds, assembly lines, and quality control for mass manufacturing good outcomes.&lt;/p&gt;
  58. &lt;p&gt;There needs to be tens of thousands of skilled protocol engineers and machinists designing and building the new protocols for the new world we find ourselves in.&lt;/p&gt;
  59. &lt;p&gt;Given that an institution is just a big set of nested protocols, how can they learn to experiment faster around new hardness/protocol ideas, correctly identify improved protocols (avoiding capture by bad actors), and help their constituents migrate?&lt;/p&gt;
  60. &lt;p&gt;This seems like the most important question of our time, can our institutions successfully evolve to meet the conditions and problems of today? The answer to this question will determine how pleasant (or otherwise) the next 100 years will be. Hopefully the next 40 years will see a steady upward trend in the average confidence in major institutions.&lt;/p&gt;
  61. &lt;h2 id=&quot;a-protocol-age&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-protocol-age&quot; aria-label=&quot;a protocol age permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Protocol Age&lt;/h2&gt;
  62. &lt;p&gt;Josh Stark compared Protocol Theory to Information Theory in his essay &lt;a href=&quot;https://stark.mirror.xyz/n2UpRqwdf7yjuiPKVICPpGoUNeDhlWxGqjulrlpyYi0&quot;&gt;Atoms, Institutions, Blockchains&lt;/a&gt;. Not until &lt;a href=&quot;https://en.wikipedia.org/wiki/Claude_Shannon#Information_theory&quot;&gt;Claude Shannon published his Information Theory in 1946&lt;/a&gt;, did the now common abstraction of “information” or “data” exist.&lt;/p&gt;
  63. &lt;p&gt;Information Theory created a powerful new way of seeing the world as full of discrete information which is stored, transmitted, and processed. This new perspective helped inspire a whole generation of technologists to imagine and successfully invent technologies like the CPU, fiber optics, and the internet. Information Theory led to the Information Age.&lt;/p&gt;
  64. &lt;p&gt;Perhaps Protocol Theory is also laying the foundation for a coming Protocol Age?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Announcing a new Vite Plugin for integrating Capsizecss & Radix-ui]]></title><description><![CDATA[I really enjoy typography — which causes pain when developing for the web. Because the web
  65. makes it hard to deeply control text layout. This…]]></description><link>https://bricolage.io/announcing-new-vite-plugin-capsize-radix-ui/</link><guid isPermaLink="false">https://bricolage.io/announcing-new-vite-plugin-capsize-radix-ui/</guid><pubDate>Thu, 28 Mar 2024 18:33:49 GMT</pubDate><content:encoded>&lt;p&gt;I really enjoy typography — which causes pain when developing for the web. Because the web
  66. makes it hard to deeply control text layout.&lt;/p&gt;
  67. &lt;p&gt;This &lt;a href=&quot;https://fantasai.inkedblade.net/style/talks/atypi-2021/atypi-2021-precise-text-alignment.mp4&quot;&gt;talk&lt;/a&gt;
  68. (about some in-progress fixes for the web’s typographic woes) has a slide which sums up the issue.&lt;/p&gt;
  69. &lt;p&gt;&lt;span
  70.      class=&quot;gatsby-resp-image-wrapper&quot;
  71.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  72.    &gt;
  73.      &lt;a
  74.    class=&quot;gatsby-resp-image-link&quot;
  75.    href=&quot;/static/b7bb26bd3b69200f414296bdc5462c2c/6c9f4/slide-screenshot.png&quot;
  76.    style=&quot;display: block&quot;
  77.    target=&quot;_blank&quot;
  78.    rel=&quot;noopener&quot;
  79.  &gt;
  80.    &lt;span
  81.    class=&quot;gatsby-resp-image-background-image&quot;
  82.    style=&quot;padding-bottom: 40.54054054054054%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABd0lEQVR42m2QT28TMRDF81URd86IM5cekBBCHDj2wIFPUBAgtXChkUJFq7RECV3BNpuQdE02+8fO2v4x9nYRihjp2aM3b55nPPAenKB1HYz1VDuwruO7mkcLb2yXV8ZTCkzraSPvEVmMwU5cLmdzlspwu2k4Ojnj6+yW9bZlsjDMFhXLouXzRPElqchE9+2m5iozFPLw248jTsdzVKE7w6Y2fDgecvxpxHSW8vT5Ic9eHPJzrnh3cs6b90MuLq85ePKSV6+PmF4vGH9XnF2toubho8fcu/+A4emoM/Syc613KJlO7zy/ioYkK8i3lvNkyzj5zaqwjFPNdGnJS8eNciQr6RFNltdMfuTSe7dyOIzRAhMJa1ucc/KHjqKqqRpDeLRpNFo0oVbXdUTInbMRfUTDruAiEZoDJJPbBWKP569Rz0Xdv4b7ERrCxG17N621MQ93QG/8vxj00/Xo1mtI05T1ek1ZluR5TpZlKKXYbDZoraNuvzfgD4heYszLVCabAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  83.  &gt;&lt;/span&gt;
  84.  &lt;img
  85.        class=&quot;gatsby-resp-image-image&quot;
  86.        alt=&quot;slide showing inconsistent text boxes across font families&quot;
  87.        title=&quot;&quot;
  88.        src=&quot;/static/b7bb26bd3b69200f414296bdc5462c2c/fcda8/slide-screenshot.png&quot;
  89.        srcset=&quot;/static/b7bb26bd3b69200f414296bdc5462c2c/12f09/slide-screenshot.png 148w,
  90. /static/b7bb26bd3b69200f414296bdc5462c2c/e4a3f/slide-screenshot.png 295w,
  91. /static/b7bb26bd3b69200f414296bdc5462c2c/fcda8/slide-screenshot.png 590w,
  92. /static/b7bb26bd3b69200f414296bdc5462c2c/efc66/slide-screenshot.png 885w,
  93. /static/b7bb26bd3b69200f414296bdc5462c2c/c83ae/slide-screenshot.png 1180w,
  94. /static/b7bb26bd3b69200f414296bdc5462c2c/6c9f4/slide-screenshot.png 2326w&quot;
  95.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  96.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  97.        loading=&quot;lazy&quot;
  98.        decoding=&quot;async&quot;
  99.      /&gt;
  100.  &lt;/a&gt;
  101.    &lt;/span&gt;&lt;/p&gt;
  102. &lt;p&gt;The same &lt;code class=&quot;language-text&quot;&gt;font-size&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;line-height&lt;/code&gt; settings result in vastly different
  103. layouts on the page. You might think that setting your font-size to &lt;code class=&quot;language-text&quot;&gt;16px&lt;/code&gt;
  104. would mean that the text would thent take up &lt;code class=&quot;language-text&quot;&gt;16px&lt;/code&gt; of height on the page — but
  105. you would then be very wrong.&lt;/p&gt;
  106. &lt;p&gt;There’s platform fixes in progress (as the video above discusses) but in the meantime,
  107. a number of folks across the industry have created a fix called &lt;a href=&quot;https://seek-oss.github.io/capsize/&quot;&gt;Capsize&lt;/a&gt;.
  108. A lot of research and code has gone into wrestling fonts and browsers into consistently rendering fonts.&lt;/p&gt;
  109. &lt;p&gt;It’s brilliant and you should drop whatever you’re doing to integrate it into your current project.&lt;/p&gt;
  110. &lt;p&gt;Precise layout gets a lot lot easier.&lt;/p&gt;
  111. &lt;p&gt;The one downside of Capsize is it’s pretty low-level. You have to write quite a bit of code to
  112. fully integrate it into your design system.&lt;/p&gt;
  113. &lt;p&gt;I’ve recently standardized on &lt;a href=&quot;https://www.radix-ui.com/&quot;&gt;Radix&lt;/a&gt; for my projects as it has a very
  114. well-thought out layout, typography, and color system &amp;#x26; a growing list of
  115. components to choose from. It’s really brilliant and I think anyone looking to
  116. build a design system should build on their work.&lt;/p&gt;
  117. &lt;p&gt;And as they have a simple way to &lt;a href=&quot;https://www.radix-ui.com/themes/docs/theme/typography#customization&quot;&gt;customize typography through CSS
  118. variables&lt;/a&gt;,
  119. after some digging and experimentation, I created a Vite plugin which takes a
  120. small config object and spits out a Capsize/Radix typography css file.&lt;/p&gt;
  121. &lt;p&gt;The code and docs are at &lt;a href=&quot;https://github.com/KyleAMathews/vite-plugin-capsize-radix-ui&quot;&gt;https://github.com/KyleAMathews/vite-plugin-capsize-radix-ui&lt;/a&gt;&lt;/p&gt;
  122. &lt;p&gt;&lt;a href=&quot;https://vite-plugin-capsize-radix.bricolage.io/&quot;&gt;Check out the demo&lt;/a&gt; — notice
  123. how the text doesn’t move even a pixel up and down as I switch between fonts — this
  124. is incredible and impossible without Capsize. The practical benefit of this is
  125. it makes it trivial to try out different fonts as you’re building your app
  126. without breaking your layout. There’s a wealth of beautiful fonts out there to try.&lt;/p&gt;
  127. &lt;video controls width=&quot;100%&quot;&gt;
  128.  &lt;source src=&quot;https://github.com/KyleAMathews/vite-plugin-capsize-radix-ui/assets/71047/3ec5d6ca-bf00-4b79-8552-4e3da3454f52&quot; type=&quot;video/mp4&quot; /&gt;
  129. &lt;/video&gt;
  130. &lt;p&gt;I’m curious what people think — I love each of these tools and together they’re 🧑‍🍳&lt;/p&gt;
  131. &lt;p&gt;I think a similar tool could be built for integration with other popular
  132. component libraries. Feel free to copy the approach.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LocalFirst.fm Podcast with Johannes Schickling]]></title><description><![CDATA[Johannes invited me on his LocalFirst.fm podcast and we had a great chat talking about all things Sync Engine / LocalFirst. I thought the…]]></description><link>https://bricolage.io/localfirst.fm-podcast-latest-thoughts-local-first/</link><guid isPermaLink="false">https://bricolage.io/localfirst.fm-podcast-latest-thoughts-local-first/</guid><pubDate>Wed, 13 Mar 2024 16:37:55 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Johannes invited me on his LocalFirst.fm podcast and we had a great chat talking about all things Sync Engine / LocalFirst.&lt;/em&gt;&lt;/p&gt;
  133. &lt;p&gt;&lt;em&gt;I thought the discussion flowed really well and so I’m adding it to the blog here as a good update on my thinking around this area since &lt;a href=&quot;https://bricolage.io/some-notes-on-local-first-development/&quot;&gt;my blog post last fall&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  134. &lt;p&gt;&lt;a href=&quot;https://www.localfirst.fm/5&quot;&gt;Show notes&lt;/a&gt;&lt;/p&gt;
  135. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/RP7DB4w94do?si=ei-47JQNScqAlazr&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
  136. &lt;h2 id=&quot;transcript&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#transcript&quot; aria-label=&quot;transcript permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Transcript&lt;/h2&gt;
  137. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Hey, Kyle, welcome to the show. How are you doing?&lt;/p&gt;
  138. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Doing great. Glad to be here.&lt;/p&gt;
  139. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Thank you so much for coming on. You’re another fellow early Local First-er, so I’m very curious to hear about your background and then hear about what led you to Local First.&lt;/p&gt;
  140. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; I’ve been doing web development of various sorts for like the last 15 plus years, seen a lot along that way, like the whole jQuery era, did Backbone.js for those who read history books and, you know, early React, GraphQL.&lt;/p&gt;
  141. &lt;p&gt;I actually started with Drupal. Funny fact, Drupal was big back in 2000, still widely used, but people are like a little more expansive about their view of Drupal back then. I then switched to kind of JavaScript, single page apps, like really early 2010-ish. And yeah, I’ve been kind of writing that ever since.&lt;/p&gt;
  142. &lt;p&gt;Then of course Gatsby which I launched in 2015 and became the first proper production-ready React metaframework, and then rode the whole React wave for a long time.&lt;/p&gt;
  143. &lt;p&gt;But in general, my interest is what are the tools we use to build software? Because I think software is very important and the quality of the tools that we use determine the quality of the software that results. We shape our tools and then the tools shape everything else. I think there’s really high leverage to continually pondering that question. Because if we can genuinely move to a genuinely better tool, then there’s enormous effects that result from that. Not just in our actual day-to-day life as engineers, but as software creators there’s a lot, a lot of people whose lives are affected by software.&lt;/p&gt;
  144. &lt;p&gt;I’ve seen many genuinely better tools emerged in my software career. I think React was a massive step forward. I think GraphQL was a smaller step forward, but also a genuine step forward. And I feel local first is another sort of massive leap forward in how we build software. And I think it’s something that in the coming years, more and more software will be kind of built in this fashion.&lt;/p&gt;
  145. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; I definitely agree. I mean, I’m also definitely a connoisseur of good tools, but luckily there’s a lot of good tools in many different areas of development overall. Like you just, you can also look at other language ecosystems. I’m definitely very interested and inspired by all the good stuff that’s happening in the Rust ecosystem, but also super cool ideas that you find in other ecosystems, such as like the Elixir ecosystem with live views, et cetera. So there’s like a lot of great tools and great ideas in all of those places, but I’m curious which sort of problems have you experienced in the past that has led you to local first in particular, and where you now see a different approach, how to deal with those with local first?&lt;/p&gt;
  146. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; In client server development. There’s basically three problems. There’s the UI, like how do we construct a UI? How do we do interactivity, charting stuff? So there’s a lot different areas within like the UI. And then there’s backend problems. There’s a lot complicated computing bits. There’s like, how do you run infrastructure at scale? How do you make things efficient? So you’re not spending enormous amounts of money, security. There’s endless domains of problems in the backend. And then there’s the middle bits, which is state transfer. Like, how do you move bytes back and forth? Because generally the clients can’t hold all the data. So you have to say, I need part of the data to be pulled over. And generally things are changing. So then, how do you get that data from the server to the client and so on? And so there’s a lot of problems around moving state back and forth.&lt;/p&gt;
  147. &lt;p&gt;And so I think Local First is interesting because I feel like the front end and the backend, there’s been just enormous number of innovations on both sides. All the investment and React and Svelte and Solid and Vue and like Vite and Webpack. And there’s just been enormous investment that’s gone into making the front end experience dramatically better. Plus all the libraries. NPM has millions of libraries or something like that. Each of those things is just enormous effort from individuals or groups all across the world. And it’s made the UI world a dramatically better place.&lt;/p&gt;
  148. &lt;p&gt;It’s just remarkable to me how much faster it is to build amazing stuff versus 15 years ago. The first like big JavaScript dashboard I built, it took me like six months to ship the first version, partly because I wasn’t a very good programmer, but partly because there was just like no guidance anywhere. Now there’s endless starters, tutorials, etc. React is such a compact, simple abstraction. Everything is dramatically better. And that’s because of all the innovation and work in the frontend.&lt;/p&gt;
  149. &lt;p&gt;In the backend too, the cloud giants are pouring tons of research into stuff. And there’s like 100s of individual cloud services where take what was before three months of programming and now it’s like two hours to implement an API and off you go. So there’s been lots of innovations too in the backend.&lt;/p&gt;
  150. &lt;p&gt;But yeah, the state transfer bit, like the, you know, moving bits back and forth hasn’t really gotten as much investment. Partly, I think it’s like it’s not always a problem. Often it’s pretty simple. If you’re just building a dashboard, you’re like, get me the data for the dashboard, render the data. It’s not a very complicated problem oftentimes.&lt;/p&gt;
  151. &lt;p&gt;But I think what we’re seeing is that where like the best teams, the best apps are investing disproportionately their time in sync engines compared to everyone else, because that’s where the best teams see an advantage where they can like build something significantly better than other people.&lt;/p&gt;
  152. &lt;p&gt;And so what I think you’re seeing now is like the best apps in the industry, you know, like the Figmas, the Linears, Superhumans, et cetera. They’re pointing now towards some sort of innovation in state transfer.&lt;/p&gt;
  153. &lt;p&gt;Like, how do you load your app extremely fast because everything’s cached locally? How do you have real time sync between, you know, different people so you can build like rich collaborative experiences? How do you, you know, save locally and then sync to the server so you’re not like doing little spinners all the time when you save stuff? So it’s like always fluid and fast. And they’re all kind of arriving at the same idea, which is: hey, this whole REST API thing, you know, posting things back and forth, pushing bytes around manually doesn’t cut it anymore to build like really complicated, amazing apps. You need a higher abstraction. You need something more sophisticated for handling that state transfer. And that’s to me the whole idea behind local first and sync engines. It’s the component that handles that state transfer back and forth between the client and server.&lt;/p&gt;
  154. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; That’s super interesting. So you mentioned the term sync engine that that might be not familiar with everyone in the audience. So could you elaborate a little bit what a sync engine is and how that might relate to the approaches that you’ve mentioned before?&lt;/p&gt;
  155. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; I feel like it’s the best term for uniting a number of emerging tools and their approaches. The basic idea is that REST API, GraphQL, TRPC, whatever. They’re all based around getting data to render a page or widgets. And so you’re like, hey, API, give me the data from my widgets and then I render it. So it’s an imperative step, kind of like the client manually telling the server, give me that thing.&lt;/p&gt;
  156. &lt;p&gt;With sync engines, it’s a move from an imperative to declarative. So instead of saying, give me that data, it’s like for this page, I &lt;em&gt;declare&lt;/em&gt; I need this data and then the sync engine makes it so. You often run into the problem imperative state transfer where getting data is easy, but subscribing to updates is hard. Everyone notices there’s a massive gulf in difficulty between those two things. And so what’s cool about sync engines is that because state transfer is a declarative step, there’s actually no additional complexity to get a subscription. It’s the same thing. You’re just saying, I need this data and then the data shows up. It’s a new abstraction for how data arrives on the client.&lt;/p&gt;
  157. &lt;p&gt;Where, yeah, again, you’re going from imperative to just describing the shape of data that you need to show up on your site for a particular page.&lt;/p&gt;
  158. &lt;p&gt;Another good analogy, it’s very similar to the shift from jQuery to React, where jQuery, you’re like, get this DOM element and tweak the text or get this DOM element, remove the child, construct two other children, drop it in. You’re like a little kid playing with like blocks or something. You’re fiddling all the time, which is actually fun. I actually enjoyed it. It was a fun little challenge, but it’s a huge waste of time. Where now we’ve moved to React and React is more like, I want the DOM to look like this and it just happens somehow. Like React does a bunch of weird magic under the hood and it efficiently somehow shifts everything around without tearing and voila, it’s there. You’re like, cool, it’s there.&lt;/p&gt;
  159. &lt;p&gt;And that’s just a lot less to think about when you want something to be so and don’t really care about the complicated details. That’s a lot less to think about. Which is the value of abstraction. Because we have a finite number of things we can think about. So if we drop two, then we can replace it with two other things instead. So if you drop a lot of thinking about state transfer, then you have more time to think about other things.&lt;/p&gt;
  160. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; So you’ve now explained a little bit the benefits of a sync engine and that it simplifies a lot of things. But for someone who’s now like curious, how does this actually work? Can you explain what a sync engine does and how it does it?&lt;/p&gt;
  161. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; I’ll use an example for the one that I’ve used the most, ElectricSQL. So ElectricSQL is Postgres based and you have your tables and basically you declare in the client the shape of data you want pulled over. The shape is defined with basically a SQL query. So you’re just like, I want this table and rows that match this criteria. And then the sync engine takes that and then says, OK, I will send you initial set of data and then any updates that I see from then on that match that shape, up it’ll go.&lt;/p&gt;
  162. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; That makes sense. So and this would be one particular example, one particular technology for when your starting point is an existing Postgres database. So is that the way how I should think about it? That like I have my like traditional way of how I’m dealing with data in a more global state, for example, Postgres. And then I’ll just slap a sync engine on top of it, connect my clients to it and off I go.&lt;/p&gt;
  163. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; In theory, in practice, all these tools and this whole space is pretty new still. So I think that’s the sort of the platonic ideal that everyone’s working towards where you slap a sync engine on and off you go. And that does actually work in some cases. But all these tools have some limitations that you have live with and that they’re working to lift. But there’s understandably a decent bit of complexity to e.g. taking 30 year old Postgres and tossing a new abstraction onto it. But long as you live within the existing limitations then, yes, then it is actually plug-n-play.&lt;/p&gt;
  164. &lt;p&gt;I’ve been building like a number of sort of toy stuff both to play with this local first, sync engine approach. And it is like very simple. You just add a db, add some tables and then ElectricSQL creates a client side library, very Prisma-esque. Actually, they’re still using, I think, Prisma under the hood to generate the client. And then you just immediately just start reading and writing from like the client SQLite. So because they use Postgres in the back end and then SQLite in the client. It’s very straightforward. Just like write a query and the data’s there. Do an insert. Off it goes. So I can’t promise it’ll work for everything but if your app can live within the current restrictions, it is very much a magical experience.&lt;/p&gt;
  165. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; That sounds great. And I think there is a lot of different approaches how a sync system could work. We’ve also learned a bit about Automerge in previous episodes. But I’m curious to hear more about your experiences building apps with the stack that you’ve mentioned. Can you tell a bit more about the apps that you’ve tried those new approaches?&lt;/p&gt;
  166. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Yeah, I mean, these apps have been developed for personal use. So, they’re not anything earth-shattering. The most kind of complicated one is one I’m just actually finishing up with my wife. It’s a kitchen AI. So basically, you can take a photo of different ingredients in your kitchen, and then the AI will convert those into ingredients in an inventory system. You can set things like the fill level, the expiration date, and so on.&lt;/p&gt;
  167. &lt;p&gt;Then, when you want to go do a recipe, you can upload it by copying and pasting the recipe into the app. It parses out all of the ingredients. What’s interesting is that recipes describe ingredients slightly differently. So, doing just a naive matching won’t actually work. That’s why I’m using embeddings to do more fuzzy semantic matching between the ingredients in the kitchen and the recipe ingredients. It then tells you what ingredients you have, what you need to buy, and also alerts you if you’re running low on something or if an item has expired and should be replaced.&lt;/p&gt;
  168. &lt;p&gt;Moreover, it’s a one-click process to create a shopping list that we send off to Trello. Another cool feature is that we assign each ingredient to enum sections of the grocery store, like meat, seafood, dairy, produce, and canned goods. This way, when you go to the store, you have a neat list of items sorted by sections. It’s pretty fun to use and build.&lt;/p&gt;
  169. &lt;p&gt;But yeah, the actual process of building it involves a lot of local-first and ElectricSQL stuff, like defining my schema. It’s very data-centric, marking a big shift in how I approach building apps now versus before. Previously, the backend and database setup was annoyingly complicated, so I would delay it until after prototyping. I would just keep all the data in memory in the browser, build the UI, try a bunch of stuff, and have a little JavaScript phase with objects and whatever.&lt;/p&gt;
  170. &lt;p&gt;But now, it’s so easy with ElectricSQL to set up the database and have everything syncing that the very first thing I do is write my create table statements. This is a huge improvement because having a fully typed database from the start is very nice. You get a lot of power for free, like type checking and foreign key constraints, which are nice things databases give you from day one of prototyping.&lt;/p&gt;
  171. &lt;p&gt;Normally, during prototyping, I’m just blowing away the database and restarting, but that’s like 30 seconds to do. It’s also quite fun to use ChatGPT for generating SQL. I describe all the data I need, and it spits out the create table statements. It’s very productive to have a full-blown typed database-backed SQL first reactive system while prototyping.&lt;/p&gt;
  172. &lt;p&gt;Yeah, it’s both a very productive prototyping system, and what’s genius is that your prototype is immediately your production system too. As soon as I’m done, I don’t have to fix a bunch of data problems because it’s been good from the get-go. I just ship it, and it works perfectly. I’m not like, ‘Oh, no, I have all this crap data now in my production system because I took shortcuts to work on my prototype.’ You have all the database guarantees from the get-go.&lt;/p&gt;
  173. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt;
  174. I love that story. I think this is so powerful. And the analogy you’ve provided before in terms of going from jQuery where you have to do everything manually to react, freeing you up to no longer having to do all of this manually. Now, that really makes sense to me because now you could like you’ve mentioned a few of like the new like AI aspects of this or that the app is an app just for you and your wife. And that’s totally fine.&lt;/p&gt;
  175. &lt;p&gt;Like you’re basically now freed up by so much data wrangling or before you would need to like maybe set up a GraphQL endpoint, a REST endpoint, and you’d spend so much time just to have all the data moving stuff taken care of. And if that now just works in the same way as React automatically working and keeping your views up to date. And now if we elevate to the next level of muscles hierarchy of needs for app development and we have the data automatically taken care of, now you can focus actually on what makes the app fun and unique. So that makes a lot of sense.&lt;/p&gt;
  176. &lt;p&gt;And I love your anecdotes there of that. You no longer need to think about this like it’s kind of like stage one. Everything is crap in prototyping mode. And then at some point you need to make it real in production mode. But with React, you also don’t really distinguish too much about like, oh, am I now writing this for production or for prototyping? You’re just doing it right. And it’s easy from the get go.&lt;/p&gt;
  177. &lt;p&gt;And if you get the same thing for data, that’s super powerful. So I love that.&lt;/p&gt;
  178. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Yeah, that’s actually a good general question, like the power or quality of some part of your stack if the prototyping is the same as production? Like ideally there’s no difference. Just another random tool I’ve been using lately is SST. I don’t know if you’ve played with that, but they have their live development Lambda function, and it’s like killer because you develop against an actual Lambda and they intercept the call to the Lambda function and send it to your laptop. So you have real debugging logs but everything is actually running in the cloud and still going to real S3 buckets and everything. So the development environment is the same as your production environment. Going from dev to production with SST is super easy because there is no difference. Like it’s the same stack. Then React, it’s like if your components are good for development, they’re going to be efficient in production. And yeah, the same with ElectricSQL because if it works in dev, it’s going to work in production. Which is awesome.&lt;/p&gt;
  179. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; That’s great. I would love to hear a bit more about the details of how you’ve built this app. And particularly you’ve mentioned that you design your tables and your schemas, and you’ve mentioned that you’re using Postgres more for like a server aspect and SQLite for the client state. Do you sign one schema and that applies to both Postgres and SQLite equally? Do you distinguish between those?&lt;/p&gt;
  180. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Yeah, yeah. You create a table in Postgres and “electrify” it and then their sync engine automatically sets up that table for you in SQLite in the client and also like does migrations and all the other complicated bits. You can do local only tables, but I’ve never needed to. There could definitely be stuff that’s very specific to a client, but generally speaking, I want all the data synced all around. Because again, one of the cool things about all this is that, you know, your desktop, if you have a phone running the app and you have a desktop running the app, they’re always in sync. So you pull out a phone and it’s got the data. In my mind, all data should be synced all the time.&lt;/p&gt;
  181. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; So the kitchen app that you’ve been describing, that sounds super cool, but it sounds you’ve been building a few different local first apps to really give this a try and get started with that local first paradigm. So which other apps have you been building?&lt;/p&gt;
  182. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt;
  183. Yeah, another app that I’m pretty pleased with and I think is another good example of the benefit of this sync engine approach is this very simple one page, one view app. I have a Garmin watch for tracking exercise, running, biking, etc. And they have a bunch of charts and stuff that pre-designed for you. But I was, hey, I want to look at it from a different way. But basically I wanted a pure volume based view of my exercise. So because they emphasize intensity or mileage. And I’m just, I just care how long I’m running or how long I’m biking, etc. And so I was, hey, they have an API. I’ll just pull the data, analyze it, create a chart. You know, off we go.&lt;/p&gt;
  184. &lt;p&gt;So the cool thing about it is (using Electric SQL again) all of your activities are cached locally. So when you load it up, it’s instantaneous — despite there being many MBs of activity data. It doesn’t have to load a whole bunch of data off the server, so it just runs a quick local SQL query and presents the charts.&lt;/p&gt;
  185. &lt;p&gt;Also when you load the app, it hits a Lambda function to sync in any new activities from Garmin into the system. And what’s fun about that is, again, just how simple it was, because all the function does is hit the Garmin API and then writes out new data into Postgres, which is, OK, that’s fine. But the next step, normally is how do you tell the front end that the new data is available? There’s normally a bunch of other stuff you have to do. But what’s great with sync engines is there is no other step because the sync engine will just say, “oh, there is a new Garmin activity pushed into the database. I’m going to push it to the client because it’s subscribed to it and it’s active”. So it just shows up.&lt;/p&gt;
  186. &lt;p&gt;That’s again, it’s an illustration of you have this sync engine. It’s not just reactive in the client. We talk a lot about client reactivity and there’s a lot of libraries that do that. But this is global reactivity, the whole system is reactive, any change anywhere gets pushed to every other node that cares about that. And that’s just a really powerful leap forward, not just for the client/server, but even server to server communication.&lt;/p&gt;
  187. &lt;p&gt;I thought a lot about microservices, one big problem with microservices is they get very chatty because they’re always polling, “hey, any new updates, any new updates, any new updates??”, you know? And then anytime they want to do something, they’re, “oh, wait, I got to go get some data there, get some data there”. But with a sync engine, each microservice can just say this is the data I care about and it’ll have a local SQLite database it can query against whenever it wants. And every bit of data is up to date within a fraction of a second. That just would dramatically speed up a lot of microservices wor and dramatically reduce the chattiness going on in between different services. So I think there’s a lot of power in global reactivity powered by sync engine.&lt;/p&gt;
  188. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Yeah, I love that analogy. I think this was really like what blew my mind about React in the like when I saw it the first the first time, not just that it made my life simpler by not having to take care of like all of the DOM children, like appending, creating, etc. So it made everything simpler. But also having all of that just work automatically without me having to even like tell it like, hey, now update that reactivity for the views, but also for like the local state. But applying that now for global data, I think that is really a killer feature of local first that I think is not well understood by a lot of app developers.&lt;/p&gt;
  189. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; It’s just so funny because it’s the water we live in, you know? When you’re building stuff, you just spend a lot of time moving data around and checking it and updating it. And it’s just endless little problems. I remember Gatsby Cloud, we would ship an update, which used a slightly less efficient query or upped the number of calls, internal API calls. And then all of a sudden, our Postgres database would red line, and we were like, ‘oh, no’. It was just a constant headache because when everything’s constantly asking for stuff, there’s just enormous inefficiencies. I remember that was a big thing where people early on with React, people were, ‘Oh, my jQuery calls are so efficient, you know, and React is doing all this extra work and whatever, but pretty soon everyone kind of realized, ‘Well, yes, React does do extra work to accomplish the same goal, but it’s only actually more work if every single jQuery operation was optimal, you’d actually thought through the algorithm, you know, in detail for every single one, because in practice, everyone was just doing lazy, weird shortcuts. You’re like, ‘I just got to ship this feature, so I’m just going to blow the DOM away to make this update or whatever.’ We were doing all sorts of weird, crappy things to update the DOM, which, yeah, it was often just very janky, very slow all the time. So, React was like, ‘Yeah, there’s an overhead to doing automatically, but it’ll be a consistent overhead’ so everything is consistently a little bit slower than optimal instead of sometimes optimal, sometimes wildly not optimal.&lt;/p&gt;
  190. &lt;p&gt;And so the same thing with moving data around, it’s like, you know, people are, ‘Oh, yeah, my data fetching is so clean and so good’. But, you know, you have one engineer who just accidentally grabs five megabytes of data from the API and, whoops. And then all of a sudden, the whole thing falls to pieces where, again, with sort of more of a higher level abstraction like a sync engine, this just can’t happen because you can put in checks for like you can only ask for max of 300 kilobytes in a batch or something like that. Whatever. I mean, there’s all sorts of smarter things that the system can do for you.&lt;/p&gt;
  191. &lt;p&gt;All types of new abstractions face the same challenges or complaints like, ‘Hey, I do it really well and you’re doing it poorly in all these cases and whatever.’ But if the abstraction is good enough, it eventually pretty quickly becomes better in most cases and often better in all cases. And even if it’s not better in all cases, taken as a whole, it just eliminates a lot of really suboptimal problems. It’s like memory management. That’s another great example, like people are, ‘I manage memory so well, these GCs, there’s lots of overhead, blah, blah, blah.’ And then 30 years of CVEs of security issues, it is very, very hard to build fast, efficient data loading and keeping it up to date and whatever.&lt;/p&gt;
  192. &lt;p&gt;After spending all this time building local first stuff, even very good apps built with great teams, like e.g. Vercel’s dashboards. They’re pushing React server components, all that stuff. But you click around their dashboard and there’s endless little loading states. But if they had a sync engine, they would know that the next view has all the data and it’s up to date and they wouldn’t have to put in a loading indicator while they go back to the server to ask, ‘Hey, did anything change? Did anything change?’&lt;/p&gt;
  193. &lt;p&gt;I’m sure they have a local cache, but what they’re doing is always asking again on every click, ‘Hey, has anything changed since the last time this person was here?’&lt;/p&gt;
  194. &lt;p&gt;And that that fundamental uncertainty you have with an imperative approach, just because you just can’t know if the data is up to date. There’s no way of knowing for sure, because there’s no system that’s reliably telling you that, ‘Yes, the data is up to date for this next view.’ You have to check and that check takes some amount of time, which adds glitchiness into your UI. And there’s just no way of getting away from that without a sync engine that can provide the guarantee.&lt;/p&gt;
  195. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; I think it’s really interesting. You’ve used the term thinking about your app data first, maybe as opposed to view first or, or React first.&lt;/p&gt;
  196. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Yeah, I think that’s a big mental shift that I’ve also observed in my own app development. And I think this has been a really powerful step because it intuitively makes sense that if you don’t have the data then you can’t render it. And so thus you render a loader or a skeleton, et cetera. Whereas if you think about your app navigation, routing, user experience overall more in a data first way to think about, okay, I’m currently here. This is all data that I need. But also I think a step ahead of like, oh, what if I would go to this other route here? Maybe I should already have the bare essentials in terms of the data for that, that if I’m going there, it’s immediately available. And then you think about your data more. Maybe you think about it as a graph or like a collection of documents, however you want to think about the data, how it fits your app’s use case.&lt;/p&gt;
  197. &lt;p&gt;But once you start thinking about your app data first, I think it’s so much easier to build a really high quality, fast user experience then. And it’s also so much easier to make that available offline. I’m not sure whether you need Vercel’s dashboard, which is gorgeous, but has a bunch of loaders, loading spinners. I don’t think you need that necessarily to work offline. But another way to think about it is if it works offline, then it’s crazy fast when “online”. And I think their dashboard would be a lot better if it was a lot faster. So I would completely agree with thinking about your app development workflows as data first, as opposed to React or Vue first.&lt;/p&gt;
  198. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; So we’ve been talking a lot about the all the good things now that you’ve experienced with local first, but I’m sure you’ve also experienced like some pain points, some challenges in regards to that new approach of building software or in regards to the technologies you’ve been using. Tell me a bit about that. Which sort of challenges have you been experiencing here?&lt;/p&gt;
  199. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Yeah, there’s definitely a few. There is some learning curve. It’s not entirely the same as what was before. There’s a lot of things that cross over. So it’s not like a huge step. But you’re going to have to spend some time learning stuff.&lt;/p&gt;
  200. &lt;p&gt;I think there’s also at this current point of immaturity in the market, there’s not like a clear market leader who’s very good and mature that lots of people use. So, you know, like in sort of app development, we’re like, hey, Next.js, like that’s sort of the obvious choice because a billion people use it and it kind of covers everything and whatever. So you both have the, I have to evaluate a bunch of tools step to get into this world.&lt;/p&gt;
  201. &lt;p&gt;And then you’ll need to learn a specific tool in depth because some things are just different, you’ll encounter things no one’s done before. Almost nobody’s done it before. So you’re gonna have to really learn stuff to do those. So that’s definitely a bit of an overhead in this approach.&lt;/p&gt;
  202. &lt;p&gt;And another result of the immaturity is like, there’s just things that don’t work yet. Local first tech can feel like magic, but they’re not actually magic. They actually are an engineered products and there’s stuff that they just don’t do yet that you’d rather like them to do. And so it’s a process of learning those limitations and working within them. Figuring out what they can or can’t do is part of sort of the evaluation process and building process.&lt;/p&gt;
  203. &lt;p&gt;So far for my toy apps, it hasn’t been an issue, but there’s definitely things that I just can’t build with this stack right now. But the teams behind these sync engines, they know about issues and things are rapidly getting better.&lt;/p&gt;
  204. &lt;p&gt;A lot of stuff with Sync Engines really is just the same as before. It’s just building an app. Except now, you just declare the data you need and the data’s there.&lt;/p&gt;
  205. &lt;p&gt;And on the backend, I’d write a query and now you just write the same query, but it runs locally.&lt;/p&gt;
  206. &lt;p&gt;And the day to day, just like building views and stuff, it’s extremely similar.&lt;/p&gt;
  207. &lt;p&gt;And I mean, this overall tradeoff is the same as for most early technologies, if you’re early to those technologies, you’re betting you get some some superpowers and you probably acquire those new superpowers earlier than most others, but you also got to pay a higher price than most others.&lt;/p&gt;
  208. &lt;p&gt;I think the biggest problem is I’m doing something and then like, bam, I hit some problem and then I’m stalled for a day while I either figure it out or figure out a work around.&lt;/p&gt;
  209. &lt;p&gt;So if you’re using boring technology, it may be tedious and hard or whatever, but it’s sort of like a known tedium.&lt;/p&gt;
  210. &lt;p&gt;You’re like, this is going to take me like one week, where with a new technology, it’s either going to take you an hour or two weeks, you know?&lt;/p&gt;
  211. &lt;p&gt;So it is a lot more uncertainty on what’s going to happen.&lt;/p&gt;
  212. &lt;p&gt;And you might run into stuff that just like absolute blockers where, again, with the old stuff, it’s kind of like every single possible work around has been figured out for every possible thing.&lt;/p&gt;
  213. &lt;p&gt;It’s just a matter of finding that obscure forum post from like five years ago where they’re like, “oh, I spent five days on this, but here’s the fix”.&lt;/p&gt;
  214. &lt;p&gt;And you’re like, freak, like we have a kinship.&lt;/p&gt;
  215. &lt;p&gt;You and I know we two people are the only ones ever run into this problem before.&lt;/p&gt;
  216. &lt;p&gt;But thank you.&lt;/p&gt;
  217. &lt;p&gt;You wrote it down for me so I don’t have to figure it out myself.&lt;/p&gt;
  218. &lt;p&gt;So, so yeah, the new technology, most of the problems you run into, you are the very first person to run into it, which is fun.&lt;/p&gt;
  219. &lt;p&gt;But yeah, it’s you’re going to have to be like a pioneer, sort of a more robust.&lt;/p&gt;
  220. &lt;p&gt;I don’t know if Europeans talk about pioneers, but anyways, like American pioneer, you’re kind of like, going off into the wilderness and got an axe on our shoulder and, you know, whatever.&lt;/p&gt;
  221. &lt;p&gt;We’re just going to like make it happen.&lt;/p&gt;
  222. &lt;p&gt;You kind of have to adopt that that mindset when you’re kind of into new technology.&lt;/p&gt;
  223. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Yeah, that’s very relatable for me.&lt;/p&gt;
  224. &lt;p&gt;I’ve always considered myself to be kind of like a technical pioneer.&lt;/p&gt;
  225. &lt;p&gt;So what you’ve just mentioned in terms of, yeah, sometimes like it’s a gamble and sometimes like the sort of promise of everything will be simpler and easier in the future that plays out.&lt;/p&gt;
  226. &lt;p&gt;And you can’t believe like how the thing that just took so much effort and so much work in the past is now so easy or you run into a wall where in theory it would have worked, but you run into some edge case that you’re the first one running into and it might be fixed with the next release of whatever you’re using, but you still have run into it.&lt;/p&gt;
  227. &lt;p&gt;But luckily you’ve run into it and then the next person is no longer running into it, depending on how quickly someone releases.&lt;/p&gt;
  228. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt;  Yeah, there’s sort of a sense of community service you get, or at least it’s helpful to get with new technologies.&lt;/p&gt;
  229. &lt;p&gt;When you encounter a bug you just go “I’m going to pay down the cost for everyone else a bit.”&lt;/p&gt;
  230. &lt;p&gt;&lt;strong&gt;Johannes&lt;/strong&gt; So another observation here, I think it’s really interesting that the use cases you’ve mentioned, your ambitions for those apps were not to like take it to market and like roll it out to millions of users.&lt;/p&gt;
  231. &lt;p&gt;It was, I think, like part of the fun that you built a software that’s just for you and you can make it as fancy or ugly as you want, like no one’s going to complain.&lt;/p&gt;
  232. &lt;p&gt;And you know, like the little quirks of it and that it took you less effort to make that happen, to build the thing you wanted to build and like spend less time with like all of the boilerplatey things.&lt;/p&gt;
  233. &lt;p&gt;That’s great.&lt;/p&gt;
  234. &lt;p&gt;And I think that that is totally fine.&lt;/p&gt;
  235. &lt;p&gt;Like no one’s going to take that away from you.&lt;/p&gt;
  236. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; I think what’s still a little bit less proven is like how do you really, if you were to take that app now and say, “I do want to scale it to millions of users”, et cetera, I think that’s another aspect of where we are still pretty early.&lt;/p&gt;
  237. &lt;p&gt;And on our pioneering journey, we have not yet figured out what are all the traps and how to resolve them.&lt;/p&gt;
  238. &lt;p&gt;But I think from first principles, I think this approach should actually work out.&lt;/p&gt;
  239. &lt;p&gt;I don’t see any like showstoppers for sort of scale to millions in a lot of ways again, too.&lt;/p&gt;
  240. &lt;p&gt;No apps do scale untouched to a million.&lt;/p&gt;
  241. &lt;p&gt;What happens is people build it and it falls apart and then they like rebuild it several times and get to millions.&lt;/p&gt;
  242. &lt;p&gt;So what I actually think is actually pretty interesting about this and like promising is like there is a story here, prototype to millions with like no changes to your basic architecture, which I don’t think anything else can make that claim.&lt;/p&gt;
  243. &lt;p&gt;Because you can horizontally scale sync engines without any issues because you just have sticky connections from clients to a particular sync engine and it’s managing the state for each user.&lt;/p&gt;
  244. &lt;p&gt;Postgres is easy to vertically and horizontally scale.&lt;/p&gt;
  245. &lt;p&gt;What’s interesting is Postgres actually has a lot less demand in this world because far fewer queries are reaching it.&lt;/p&gt;
  246. &lt;p&gt;So it’s actually like you don’t have to scale Postgres nearly as fast as you kind of typically expect to.&lt;/p&gt;
  247. &lt;p&gt;You know, with this approach, people even do sort of normal API stuff because you can still just call Lambda and do whatever and write to Postgres.&lt;/p&gt;
  248. &lt;p&gt;Can I talk about the Garmin example?&lt;/p&gt;
  249. &lt;p&gt;You can write locally like I want to do this sort of our sort of event sourcing style where you’re like the client says I want this to happen and then a back end serverless function picks up the job and then kind of writes it back and then it gets synced back to the client.&lt;/p&gt;
  250. &lt;p&gt;Anyway, so that again, that approach is also extremely scalable because it’s all serverless and stateless and you can have as many workers, you know, spinning up to handle stuff.&lt;/p&gt;
  251. &lt;p&gt;But yeah, we’re not there.&lt;/p&gt;
  252. &lt;p&gt;This is all very, that’s all very potential.&lt;/p&gt;
  253. &lt;p&gt;But I think what’s extremely promising is like, you know, what are the different stages?&lt;/p&gt;
  254. &lt;p&gt;What are the three major stages?&lt;/p&gt;
  255. &lt;p&gt;It’s like how efficient is a tool of prototyping, how easy is to go from prototype to production and then how easy is it to scale?&lt;/p&gt;
  256. &lt;p&gt;So those are like three distinct problems.&lt;/p&gt;
  257. &lt;p&gt;So problem one, prototyping, I think both of our experiences, it’s a lot easier to prototype with a stack like this that’s data centric.&lt;/p&gt;
  258. &lt;p&gt;You have like a full type safe client from the get go and a lot of boilerplate is gone.&lt;/p&gt;
  259. &lt;p&gt;And again, going from prototype to production is extremely easy.&lt;/p&gt;
  260. &lt;p&gt;Like I’ve done lots of side projects in the past that always stalled out when it got time to deploy it because I knew I’d have to rewrite so many things and do all this crap for production that I didn’t have to do while prototyping.&lt;/p&gt;
  261. &lt;p&gt;Like, “oh, no, where am I going to store my state?”&lt;/p&gt;
  262. &lt;p&gt;With ElectricSQL, these decisions are taken care of.&lt;/p&gt;
  263. &lt;p&gt;And I now have a go live checklist. It’s like five things and it takes me less than an hour to go through it.&lt;/p&gt;
  264. &lt;p&gt;So it’s extremely fast to go from prototype to production and then, as we talked about production scaling — it’s a little less proven but in theory, like I think the architecture is like a very scale free and it’s just a matter of engineering time to get there.&lt;/p&gt;
  265. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; I mean, I do think that I fully agree with the way how you delineated that into those like three steps.&lt;/p&gt;
  266. &lt;p&gt;But I would even say that the scaling part, I think, has been proven by quite a couple of companies by now, whether it’s like thinking about Replicache, Rosicorp has built with Replicache and Reflect, et cetera.&lt;/p&gt;
  267. &lt;p&gt;I think they have a couple of customers that are really going at scale and the entire system, I think, is quite inherently scalable and the it doesn’t change the simplicity of the system, which is which is the beauty.&lt;/p&gt;
  268. &lt;p&gt;And a lot of a lot of the parts of the system can still be considered stateless, which makes it a lot easier to reason about.&lt;/p&gt;
  269. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Linear had a really great talk about how they scaled their sync engine.&lt;/p&gt;
  270. &lt;p&gt;And it’s it’s pretty fascinating, like all the things that they did.&lt;/p&gt;
  271. &lt;p&gt;But yeah, to your point, people have gone down that path.&lt;/p&gt;
  272. &lt;p&gt;So innovation goes through this process where first we ask, “is this thing even possible?” And someone discovers it’s yes, possible.&lt;/p&gt;
  273. &lt;p&gt;And then typically several groups pioneer ways to build the technology out.&lt;/p&gt;
  274. &lt;p&gt;And the new discovery evolves to a product where that new raw technology is encapsulated in a form that anybody can use.&lt;/p&gt;
  275. &lt;p&gt;So the fact that multiple independent teams have successfully gone down this path shows it’s only a matter of time before we’re seeing widespread productization of sync engines.&lt;/p&gt;
  276. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; So you’ve been going through this journey, I guess, over the last year or so of like learning about Local First and step by step building your own apps with Local First.&lt;/p&gt;
  277. &lt;p&gt;What would be your advice to an app developer who’s curious about Local First but has not yet taken their own first steps?&lt;/p&gt;
  278. &lt;p&gt;What would be your advice to them?&lt;/p&gt;
  279. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; My general advice on any technology is just to dive right in.&lt;/p&gt;
  280. &lt;p&gt;I mean, there’s lots of stuff you can read about it.&lt;/p&gt;
  281. &lt;p&gt;So by all means, listen to cool podcasts.&lt;/p&gt;
  282. &lt;p&gt;There’s lots of blog posts.&lt;/p&gt;
  283. &lt;p&gt;Yeah, so there’s definitely lots you can read and listen to and watch and stuff, but there’s no better way to feel it, to understand it and to really feel it than just to start building some stuff.&lt;/p&gt;
  284. &lt;p&gt;All the different tools have starters and they’re very approachable.&lt;/p&gt;
  285. &lt;p&gt;They’re not particularly hard to use and take a day or two and build something.&lt;/p&gt;
  286. &lt;p&gt;Because it’s really just seeing it in action, just seeing data syncing between tabs to really feel, to know, that however you’re used to doing data syncing, you can just forget about it.&lt;/p&gt;
  287. &lt;p&gt;We get numb to all the stuff we do.&lt;/p&gt;
  288. &lt;p&gt;So you really just have to really feel the difference of Local First, you just have to build something and then you’re just like, “where’s all the normal stuff I do?“. You just feel these voids in your soul.&lt;/p&gt;
  289. &lt;p&gt;You’re like, where’s all the missing stuff?&lt;/p&gt;
  290. &lt;p&gt;You know, where’s all those things I normally do?&lt;/p&gt;
  291. &lt;p&gt;And you slowly realize, “oh, they’re just gone.”&lt;/p&gt;
  292. &lt;p&gt;And then after you’ve done a few projects, you just start to forget about it.&lt;/p&gt;
  293. &lt;p&gt;It’s like this bad, weird dream of spending all that time on all those things that are now gone.&lt;/p&gt;
  294. &lt;p&gt;But yeah, you can’t really appreciate that until you’ve actually built something.&lt;/p&gt;
  295. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Let’s see whether in five years from now, we look back into the days where we haven’t been building with Local First and we see it just crystal clear as that analogy you’ve given before with going from jQuery to React and React freed up, freed us up from having to think about how to render the views in the correct way.&lt;/p&gt;
  296. &lt;p&gt;And now we get the same thing for data.&lt;/p&gt;
  297. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; yeah, talking to younger developers, like sometimes I mentioned jQuery and I’m like, oh, wait, they probably don’t even really know what jQuery is.&lt;/p&gt;
  298. &lt;p&gt;It’d be really amazing if the same thing happened to REST APIs where we’ll tell stores to younger generations about, how we used to have to write an HTTP method and with a path name that you sort of made up and sort of meant something.&lt;/p&gt;
  299. &lt;p&gt;And you have to remember to write the same name everywhere.&lt;/p&gt;
  300. &lt;p&gt;And use the right method, “it’s not a POST, it’s a PUT.”&lt;/p&gt;
  301. &lt;p&gt;And hopefully you have no typos.&lt;/p&gt;
  302. &lt;p&gt;And they’ll be like, “that’s like a lot of tedious, fragile, annoying code to write”.&lt;/p&gt;
  303. &lt;p&gt;And you’ll be like, “yeah, it sucked”.&lt;/p&gt;
  304. &lt;p&gt;And then, Copilot V10 will just introspects on my whole data system and write out super efficient code for me.&lt;/p&gt;
  305. &lt;p&gt;I’m very big on getting rid of work we don’t have to do.&lt;/p&gt;
  306. &lt;p&gt;And I think there’s a lot left in programming that we really shouldn’t have to do.&lt;/p&gt;
  307. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Let’s leave it here.&lt;/p&gt;
  308. &lt;p&gt;Anything you want to share with the audience?&lt;/p&gt;
  309. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; Have fun, build cool stuff.&lt;/p&gt;
  310. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; That sounds great.&lt;/p&gt;
  311. &lt;p&gt;Kyle, thank you so much for coming on the podcast.&lt;/p&gt;
  312. &lt;p&gt;&lt;strong&gt;Kyle:&lt;/strong&gt; This was a lot of fun.&lt;/p&gt;
  313. &lt;p&gt;&lt;strong&gt;Johannes:&lt;/strong&gt; Yeah, it was a lot of fun.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Build Notes: Where I add an email newsletter with an ElectricSQL admin app]]></title><description><![CDATA[I’ve been avoiding adding a newsletter to my blog for months now. It’s an
  314. obvious thing to do and people ask for it now and then but it just…]]></description><link>https://bricolage.io/build-notes-add-email-newsletter-electricsql-admin-app/</link><guid isPermaLink="false">https://bricolage.io/build-notes-add-email-newsletter-electricsql-admin-app/</guid><pubDate>Tue, 30 Jan 2024 22:08:41 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been avoiding adding a newsletter to my blog for months now. It’s an
  315. obvious thing to do and people ask for it now and then but it just seemed…
  316. hard.&lt;/p&gt;
  317. &lt;p&gt;Then it occurred to me yesterday why — adding integrations suck. The obvious
  318. ways to add newsletter support was to either use a dedicated newsletter service
  319. which takes care of most things or to use a lower-level email API
  320. and manually hook it up a bit. But either way, it’d mean reading a bunch of
  321. docs, getting confused for a while, and writing some tedious, probably difficult
  322. to debug, code.&lt;/p&gt;
  323. &lt;p&gt;What I realized though is there’s another way to do this — I’m not trying to
  324. sign up 10s of thousands of people here, I can probably just do this manually.
  325. I can manually send out verification emails and manually send out each
  326. “newsletter” for each blog post I write just by copy/pasting the post and email
  327. addresses into gmail.&lt;/p&gt;
  328. &lt;p&gt;It’s not particularly hard to send a few verification emails each day. But it
  329. is hard to send 100s of emails each day.&lt;/p&gt;
  330. &lt;p&gt;This is very “do things that don’t scale” Y Combinator style — which is the
  331. right strategy both because you learn more by doing things manually e.g. I
  332. can perhaps turn verification emails into a bit of a conversation and you avoid
  333. expensive automation for “things that scale” as they have high fixed cost and
  334. you’re better off avoiding them until you’re sure you actually need them.&lt;/p&gt;
  335. &lt;p&gt;This is a good example of why problem decomposition is valuable. When I looked
  336. at the problem as a whole of a blog email newsletter, it seemed like I had to
  337. use a service. But when I split up the problem into three:&lt;/p&gt;
  338. &lt;ol&gt;
  339. &lt;li&gt;People want to subscribe&lt;/li&gt;
  340. &lt;li&gt;I need to verify email addresses are real&lt;/li&gt;
  341. &lt;li&gt;I need to send out the email newsletters to the current list of subscribers&lt;/li&gt;
  342. &lt;/ol&gt;
  343. &lt;p&gt;I realized only the first one needed code at all (in theory people could just email
  344. me if they wanted added but that’d probably have an unacceptably low conversion rate)
  345. and the second two could be done manually.&lt;/p&gt;
  346. &lt;p&gt;The famous architect and theorist &lt;a href=&quot;https://en.wikipedia.org/wiki/Christopher_Alexander&quot;&gt;Christopher
  347. Alexander&lt;/a&gt; gave a nice
  348. process for decomposing problems in his book &lt;a href=&quot;https://www.amazon.com/dp/0674627512?tag=doriantaylor-20&quot;&gt;Notes on the Synthesis of
  349. Form&lt;/a&gt; (worth
  350. reading).&lt;/p&gt;
  351. &lt;p&gt;First, that “intractable complex problems are solved by breaking them down into
  352. simpler, more tractable ones”.&lt;/p&gt;
  353. &lt;p&gt;Second, that “for a given problem there are ways to take it apart that are
  354. better than others, and indeed there is often a single, unique decomposition
  355. pattern that is objectively better than the rest.”&lt;/p&gt;
  356. &lt;p&gt;And third, that “Alexander rather innovatively defined a ‘design problem’ as a
  357. network of interacting concerns, such that any two interconnected concerns must
  358. be satisfied in tandem. Since the entire network was connected, this meant the
  359. problem set couldn’t be broken down without severing certain connections.
  360. Alexander’s dissertation showed not only how this could be done, but why it
  361. should be done by severing the fewest connections possible.”&lt;/p&gt;
  362. &lt;p&gt;(I borrowed this summary from this great post &lt;a href=&quot;https://dorian.substack.com/p/at-any-given-moment-in-a-process&quot;&gt;https://dorian.substack.com/p/at-any-given-moment-in-a-process&lt;/a&gt;)&lt;/p&gt;
  363. &lt;p&gt;The only thing connecting my decomposed three problems for my newsletter is
  364. the list of subscribers — so this decomposition satisfies Alexander’s “sever
  365. the fewest connections possible” advice.&lt;/p&gt;
  366. &lt;p&gt;So with the mental block removed, I whipped out the code yesterday
  367. afternoon and this morning and I’m now the proud owner of the world’s simplest
  368. email newsletter setup!&lt;/p&gt;
  369. &lt;p&gt;There’s a form at the end of each post to add your email (feel free to take a
  370. bit of time to go add your email before finishing). This submits to a Gatsby
  371. function which writes out the data to a Postgres db &amp;#x26; sends me a Slack
  372. notification so I can send the verification email.&lt;/p&gt;
  373. &lt;p&gt;This is all hooked up via &lt;a href=&quot;https://electric-sql.com/&quot;&gt;ElectricSQL&lt;/a&gt; to a
  374. one-screen admin app where I can see subscribers &amp;#x26; get emails to send
  375. verification and newsletter emails.&lt;/p&gt;
  376. &lt;p&gt;&lt;span
  377.      class=&quot;gatsby-resp-image-wrapper&quot;
  378.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  379.    &gt;
  380.      &lt;a
  381.    class=&quot;gatsby-resp-image-link&quot;
  382.    href=&quot;/static/22d273cdd691518eb8675e9f4c2cc4ac/fa601/admin-screenshot.png&quot;
  383.    style=&quot;display: block&quot;
  384.    target=&quot;_blank&quot;
  385.    rel=&quot;noopener&quot;
  386.  &gt;
  387.    &lt;span
  388.    class=&quot;gatsby-resp-image-background-image&quot;
  389.    style=&quot;padding-bottom: 50.67567567567568%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABZ0lEQVR42qVSS07DMBTMFRBLTsKWM7Cl4phdsEE9ABJSVfJrfk2aNsb5tCRx4nh4TgtqWbUi0sgvo6fxmzc25v0cqyxFkdQQTY//fkaFCt3QQ3ZQUkpF3F9cJ1jyEo7joqqqkVDqTGM44nLB/X6veF6gaZqI/qeE1yNeCJZu6rpO9X2vT/RSQtcHSHR0CiFGDMMAg7FPtVx6iOO1H0XRw/tsdmOa5t1qtbr1PO/edd03Pwhg286w+DBhOw4834dlO6Mzz/OxzTKs01QPBWO32yEMI5RkOcuYCILwy3GXNZ1tHCcsWa+rOEl0jyIOuiYeQRgijCKk6QbkEnlRjFNryySUgSZFWZagYEb8Wur68WYhOrStQCsO0BY1r3vPdkhCtWXZqe242yCMNsSdQlwShA7yJ0qDFjlt2/aR6ue6rieM8wljfLLJsifiFidpX5YyiSjGmOScS9qhLIpS0hOSPM8lXXb1O/wGC8j9Xo/cyg4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  390.  &gt;&lt;/span&gt;
  391.  &lt;img
  392.        class=&quot;gatsby-resp-image-image&quot;
  393.        alt=&quot;admin screenshot&quot;
  394.        title=&quot;&quot;
  395.        src=&quot;/static/22d273cdd691518eb8675e9f4c2cc4ac/fcda8/admin-screenshot.png&quot;
  396.        srcset=&quot;/static/22d273cdd691518eb8675e9f4c2cc4ac/12f09/admin-screenshot.png 148w,
  397. /static/22d273cdd691518eb8675e9f4c2cc4ac/e4a3f/admin-screenshot.png 295w,
  398. /static/22d273cdd691518eb8675e9f4c2cc4ac/fcda8/admin-screenshot.png 590w,
  399. /static/22d273cdd691518eb8675e9f4c2cc4ac/efc66/admin-screenshot.png 885w,
  400. /static/22d273cdd691518eb8675e9f4c2cc4ac/c83ae/admin-screenshot.png 1180w,
  401. /static/22d273cdd691518eb8675e9f4c2cc4ac/fa601/admin-screenshot.png 1569w&quot;
  402.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  403.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  404.        loading=&quot;lazy&quot;
  405.        decoding=&quot;async&quot;
  406.      /&gt;
  407.  &lt;/a&gt;
  408.    &lt;/span&gt;&lt;/p&gt;
  409. &lt;p&gt;All in all it took me about 3.5 hours to build — 2.5 hours to develop and 1
  410. hour to deploy (ran into some odd errors). There are &lt;a href=&quot;https://github.com/KyleAMathews/blog/blob/master/admin-app/db/migrations/001-create-tables.sql&quot;&gt;two
  411. tables&lt;/a&gt;,
  412. &lt;a href=&quot;https://github.com/KyleAMathews/blog/blob/master/admin-app/src/routes/index.tsx&quot;&gt;an 85-line admin
  413. component&lt;/a&gt;,
  414. and a &lt;a href=&quot;https://github.com/KyleAMathews/blog/blob/master/src/api/register.ts&quot;&gt;99-line API
  415. Function&lt;/a&gt;.&lt;/p&gt;
  416. &lt;p&gt;It’s fun having a blog admin now. I have no idea what else I’ll do with it but
  417. now that it’s there, it’s trivial now to add other interactive bits to the
  418. site. We’ll see if I think of anything.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Build Notes: Where is my time spent when building two micro-apps?]]></title><description><![CDATA[In the past week I built and deployed two micro-apps. I was curious what exactly would take the most time so took fairly detailed notes as I…]]></description><link>https://bricolage.io/build-notes-micro-apps-time-distribution/</link><guid isPermaLink="false">https://bricolage.io/build-notes-micro-apps-time-distribution/</guid><pubDate>Mon, 22 Jan 2024 18:49:20 GMT</pubDate><content:encoded>&lt;p&gt;In the past week I built and deployed two micro-apps.&lt;/p&gt;
  419. &lt;p&gt;I was curious what exactly would take the most time so took fairly detailed notes as I went so I could write this post.&lt;/p&gt;
  420. &lt;p&gt;First a bit about the apps and then I’ll breakdown the time spent and draw a few implications.&lt;/p&gt;
  421. &lt;h3 id=&quot;chocolate-batches-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#chocolate-batches-code&quot; aria-label=&quot;chocolate batches code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Chocolate Batches (&lt;a href=&quot;https://github.com/KyleAMathews/chocolate-batch-tracker&quot;&gt;code&lt;/a&gt;)&lt;/h3&gt;
  422. &lt;p&gt;My wife and I have gotten into making bean-to-bar chocolate over the last year. If you like cooking and you like chocolate, it’s a very fun (and delicious) hobby. I’ll be writing a separate post about this soon actually.&lt;/p&gt;
  423. &lt;p&gt;We didn’t have a consistent way to store information about what we were making, recipes and origins
  424. we were trying, and tasting notes. We had a spreadsheet but it’s fiddly to use and extend.&lt;/p&gt;
  425. &lt;p&gt;So I thought that of course, a new little micro-app would be great for this.&lt;/p&gt;
  426. &lt;p&gt;&lt;span
  427.      class=&quot;gatsby-resp-image-wrapper&quot;
  428.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  429.    &gt;
  430.      &lt;a
  431.    class=&quot;gatsby-resp-image-link&quot;
  432.    href=&quot;/static/25016bc38548bcb10ef815fb327b6641/e1250/chocolate-batches.png&quot;
  433.    style=&quot;display: block&quot;
  434.    target=&quot;_blank&quot;
  435.    rel=&quot;noopener&quot;
  436.  &gt;
  437.    &lt;span
  438.    class=&quot;gatsby-resp-image-background-image&quot;
  439.    style=&quot;padding-bottom: 79.72972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABb0lEQVR42q1TXVODMBDk//8eH/0B+uL45ot0RDsFqZWPlAAJdM0Gk0kpTNXxZjKB5G7vbvcSVVWF9zxHmmao6xpCHPEbO51Odk/iR+RpgkgPA7TWGMzOS+ewFhj+h2eql2iONaKu6/CSJIg3GzzHMZLkFbJt8RdrTVzE6oqiQNM0dvGwNUnGcfSO/O77/ixYKWVXaMSK6KyUnmXqIKX0oNxtMpPIgUjZgt2FRtpshZURgyCOEzoSIASkD0VjItrUkbwEZCu7XYo8318Qr/Vw1roTg4FLZgGnltXiJUeo79WZqjxnlUsT4QE5i+RkfjkXwrVfGv85fx6QgpRl5TO6rKz6aHgKq+Pi3H4cDh4wjLGAS0Przub8TUHsaBJoTpVvWQgxqWa4UVpffWoMJNg84aSyudi+bZFlmX3P5JPqLgVcM8ZFloNvsjmTBKIYnMu18VgHNC+lERXubm/wuc+wxudPzbbcyQZPD/cQZfEvgF+EYOy3XzYb/wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  440.  &gt;&lt;/span&gt;
  441.  &lt;img
  442.        class=&quot;gatsby-resp-image-image&quot;
  443.        alt=&quot;screenshot of chocolate batches pp&quot;
  444.        title=&quot;&quot;
  445.        src=&quot;/static/25016bc38548bcb10ef815fb327b6641/fcda8/chocolate-batches.png&quot;
  446.        srcset=&quot;/static/25016bc38548bcb10ef815fb327b6641/12f09/chocolate-batches.png 148w,
  447. /static/25016bc38548bcb10ef815fb327b6641/e4a3f/chocolate-batches.png 295w,
  448. /static/25016bc38548bcb10ef815fb327b6641/fcda8/chocolate-batches.png 590w,
  449. /static/25016bc38548bcb10ef815fb327b6641/efc66/chocolate-batches.png 885w,
  450. /static/25016bc38548bcb10ef815fb327b6641/c83ae/chocolate-batches.png 1180w,
  451. /static/25016bc38548bcb10ef815fb327b6641/e1250/chocolate-batches.png 1786w&quot;
  452.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  453.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  454.        loading=&quot;lazy&quot;
  455.        decoding=&quot;async&quot;
  456.      /&gt;
  457.  &lt;/a&gt;
  458.    &lt;/span&gt;&lt;/p&gt;
  459. &lt;h3 id=&quot;primal-pulse-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#primal-pulse-code&quot; aria-label=&quot;primal pulse code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Primal Pulse (&lt;a href=&quot;https://github.com/KyleAMathews/primal-pulse&quot;&gt;code&lt;/a&gt;)&lt;/h3&gt;
  460. &lt;p&gt;My goal this year is to get to 12 hours of movement / week. Inspired by &lt;a href=&quot;https://twitter.com/Alan_Couzens&quot;&gt;Alan Couzens&lt;/a&gt; research on how fundamental large volumes of low intensity movement is to good health and as the foundation to all fitness. The name “Primal Pulse” is after the idea that our bodies evolved to work like they did in pre-modern societies i.e. moving all the time. And that much of our health/fitness issues trace to that we’re resting constantly.&lt;/p&gt;
  461. &lt;p&gt;So a good option for a micro-app to track this. I record all my activities from my Garmin watch (walks, runs, bike rides, resistance workouts, etc.). I wrote a script that pulls the data from Garmin and writes to a Postgres database which syncs to my client with &lt;a href=&quot;https://electric-sql.com/&quot;&gt;ElectricSQL&lt;/a&gt; where I create the chart of weekly/monthly movement (with a &lt;a href=&quot;https://github.com/KyleAMathews/primal-pulse/blob/7ba6a240e5a3c981df0583a36fd7226f494df0f0/src/routes/index.tsx#L155-L186&quot;&gt;fancy SQL query&lt;/a&gt; that ChatGPT made for me).&lt;/p&gt;
  462. &lt;p&gt;I’m currently around 5-6 hours / week of movement so a ways to go still.&lt;/p&gt;
  463. &lt;p&gt;&lt;span
  464.      class=&quot;gatsby-resp-image-wrapper&quot;
  465.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  466.    &gt;
  467.      &lt;a
  468.    class=&quot;gatsby-resp-image-link&quot;
  469.    href=&quot;/static/18efc5bff2cb68949d3ea2ff172ff0d9/c6162/primal-pulse.png&quot;
  470.    style=&quot;display: block&quot;
  471.    target=&quot;_blank&quot;
  472.    rel=&quot;noopener&quot;
  473.  &gt;
  474.    &lt;span
  475.    class=&quot;gatsby-resp-image-background-image&quot;
  476.    style=&quot;padding-bottom: 71.62162162162163%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeklEQVR42p2TjW7CMAyEef/32yYNmDQ6QQul/0mTNOntHAobGmVslk5ubPmz67SLpE1Q5S26TsEYA601rLUYx3FWt8x7h+3HCovNe4LVeo3l6qSn5xe8LpcIIeBROzeRQRZFUSDL9kj3GdI0w26XYpMkKMsqTquUunjRMAyzYGsNgWWJXZrikOeo6wZVXaNpGgJLSDMBn1RGyVrmgZzwt93cM8e1SNV5PVfA8y4e0dm09/eBfzGp0BPoCuily3+ArOkJCvTCiBNzvwu5wTnzMv1MbmCuYq3jVPG7ZUwJUG5tbkI1TXALpn1ArQ16wuIPwVgrwB9TTftxUjTd4tXNMm4YVwSK7+ktv00VRnQXoOyBctNexLfci/v2yiE+f8VLE5CpgMaxxg9oCM7bCWiEPjBJia9dwLHn2Z4aWeZlItG28yj6EQcd8FYIdMRRD0jps9qegJUlxIxRhfZo2F05xHNHeNF7nsfYoOzlMjyOyjPHPGM1m7dkaGPxCd7PTB39P3NZAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  477.  &gt;&lt;/span&gt;
  478.  &lt;img
  479.        class=&quot;gatsby-resp-image-image&quot;
  480.        alt=&quot;screenshot of primal pulse app&quot;
  481.        title=&quot;&quot;
  482.        src=&quot;/static/18efc5bff2cb68949d3ea2ff172ff0d9/fcda8/primal-pulse.png&quot;
  483.        srcset=&quot;/static/18efc5bff2cb68949d3ea2ff172ff0d9/12f09/primal-pulse.png 148w,
  484. /static/18efc5bff2cb68949d3ea2ff172ff0d9/e4a3f/primal-pulse.png 295w,
  485. /static/18efc5bff2cb68949d3ea2ff172ff0d9/fcda8/primal-pulse.png 590w,
  486. /static/18efc5bff2cb68949d3ea2ff172ff0d9/efc66/primal-pulse.png 885w,
  487. /static/18efc5bff2cb68949d3ea2ff172ff0d9/c83ae/primal-pulse.png 1180w,
  488. /static/18efc5bff2cb68949d3ea2ff172ff0d9/c6162/primal-pulse.png 2166w&quot;
  489.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  490.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  491.        loading=&quot;lazy&quot;
  492.        decoding=&quot;async&quot;
  493.      /&gt;
  494.  &lt;/a&gt;
  495.    &lt;/span&gt;&lt;/p&gt;
  496. &lt;h2 id=&quot;hours&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hours&quot; aria-label=&quot;hours permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hours&lt;/h2&gt;
  497. &lt;p&gt;It took ~19 hours to build the Chocolate batches app and ~9 hours to build the Primal Pulse app, spread over the last week or so.&lt;/p&gt;
  498. &lt;p&gt;For the Chocolate app I spent:&lt;/p&gt;
  499. &lt;ul&gt;
  500. &lt;li&gt;2 hours on design (typography, colors, general layout)&lt;/li&gt;
  501. &lt;li&gt;9 hours on interactivity (forms, etc)&lt;/li&gt;
  502. &lt;li&gt;4 hours setting up dev environment&lt;/li&gt;
  503. &lt;li&gt;4 hours setting up prod environment&lt;/li&gt;
  504. &lt;/ul&gt;
  505. &lt;p&gt;For the Primal Pulse app I spent:&lt;/p&gt;
  506. &lt;ul&gt;
  507. &lt;li&gt;2 hours on dev/prod setup&lt;/li&gt;
  508. &lt;li&gt;1 hour on fine-tuning the chart (I had a similar one on a previous app that I ported over).&lt;/li&gt;
  509. &lt;li&gt;6 hours researching/learning new tools — most of which was finding the best way for longer-running serverless functions. I evaluated half a dozen tools before settling on &lt;a href=&quot;sst.dev&quot;&gt;SST&lt;/a&gt;’s setup for AWS Lambda functions.&lt;/li&gt;
  510. &lt;/ul&gt;
  511. &lt;h2 id=&quot;analysis&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#analysis&quot; aria-label=&quot;analysis permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Analysis&lt;/h2&gt;
  512. &lt;p&gt;The most general conclusion I can make is that doing anything novel takes much much longer than anything I’m repeating.&lt;/p&gt;
  513. &lt;p&gt;This is the 5th ElectricSQL app I’ve built — I’ve been slowly converting everything I’m learning into a reusable project starter and standard production environment which I repeat on every project. So both the “setup dev and prod” workflows are getting a lot lot faster.&lt;/p&gt;
  514. &lt;p&gt;E.g. setting up my basic development environment for my ElectricSQL apps. I first hand did this with Vite and React last fall over a day or two, etc. then spent a day converting that into a starter which I’ve since refined over 5 apps now. That’s days of work to learn those things which is now compressed into running one command and about 3 minutes of work to get going on a new project.&lt;/p&gt;
  515. &lt;p&gt;It’s the same with my production environment. It took two days to figure out everything when deploying my first app. Now it’s a checklist I follow that takes me ~1 hour. And I’m planning on adding some minor automation that’ll cut that in half again.&lt;/p&gt;
  516. &lt;p&gt;You can see that across these two apps. Just with the experience from the chocolate app, I went from ~8 hours total for the chocolate app to ~2 hours for primal pulse to set up dev/prod.&lt;/p&gt;
  517. &lt;p&gt;You can just ferociously compress how long it takes you to do simple things — as long as you repeat them a few times.&lt;/p&gt;
  518. &lt;p&gt;I read a great book recently: &lt;a href=&quot;https://www.amazon.com/gp/product/B0B3HS4C98/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;#x26;psc=1&quot;&gt;How Big Things Get Done&lt;/a&gt;. A very readable and insightful book into what factors make large and small projects go well and fast or slowly fail. Two factors he discusses are the role of experience and modularity. Which in my mind are often the same thing. If you can make your tools and workflows “modular” i.e. reusable across multiple projects, then you’ll go up the experience curve on these much faster than if they’re slightly different on every project.&lt;/p&gt;
  519. &lt;p&gt;In general, the most optimal tools and workflows aren’t those that are optimal in some sort of global sense, i.e. do the most possible things for you the quickest but those that are small and simple and reusable in many contexts. You can get ridiculously good at these small things fairly quickly and find lots of ways to use them where the more complicated the tool, the harder it is to actually master and the fewer opportunities you’ll find to use them.&lt;/p&gt;
  520. &lt;p&gt;The book talks about how nuclear plants are incredibly complex to build and how each plant tends to differ quite a bit from every other plant — so there’s very learning across plants. And compares them to solar panels where a single solar cell is repeated millions of times. Solar projects are very predictable as to time and costs and the cost / GW for solar has dropped precipitously for decades. Whereas nuclear energy seems to just get more and more costly over time.&lt;/p&gt;
  521. &lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Learning_curve&quot;&gt;Learning Curve&lt;/a&gt; is the technical term for these ideas for those looking for the Wikipedia link.&lt;/p&gt;
  522. &lt;p&gt;So this is my grand strategy (as it were) right now — I’m looking for what to do next and the only way I know to do that is to prototype as many interesting things as possible and then eventually double-down on the most interesting. So I need an approach that optimizes for prototyping time.&lt;/p&gt;
  523. &lt;p&gt;React is my old standby and ElectricSQL is a new tool that eliminates a lot of setup and development time and gives you free real-time sync. I’m also finding that just using raw VMs &amp;#x26; Lambdas are proving much faster than working with PaaSs as I have a lot more flexibility to do weird stuff and don’t run into paywalls whenever I try to do something novel.&lt;/p&gt;
  524. &lt;p&gt;A well-practiced, modular set of low-level tools allows for fluid exploration of higher-level concepts.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Flying Drones in Latent Space]]></title><description><![CDATA[Venkatesh Rao has been on a tear recently with some really insightful posts on AI - if you haven’t subscribed to his substack, Ribbonfarm…]]></description><link>https://bricolage.io/flying-drones-latent-space/</link><guid isPermaLink="false">https://bricolage.io/flying-drones-latent-space/</guid><pubDate>Tue, 19 Dec 2023 22:58:25 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
  525.      class=&quot;gatsby-resp-image-wrapper&quot;
  526.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  527.    &gt;
  528.      &lt;a
  529.    class=&quot;gatsby-resp-image-link&quot;
  530.    href=&quot;/static/0f1832900b191d050e6e46a6949fd860/2bef9/drone-latent-space.png&quot;
  531.    style=&quot;display: block&quot;
  532.    target=&quot;_blank&quot;
  533.    rel=&quot;noopener&quot;
  534.  &gt;
  535.    &lt;span
  536.    class=&quot;gatsby-resp-image-background-image&quot;
  537.    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFiklEQVR42h2UbVAThhnH83mfdu2ud6vrhrMF1FIV8QUJIsosLwKivEkCCAkSiBAIIUASIQQCMe8goWgS3gKIIFHAyMt4kZcqoFTRXm1Xr95uva672+2u6277tPsttw/Px+f34fn//o8g5FchRP02HOHHJ4gRpnAkOIdj0zh4LIl9+4X8fu9p9p8UE5PbwCWtB+/8Nrfmn5Pb2E90gZF9ydV8eDSPDw7l8u6uaAQRuz/m1MGj5OWKsfW4abV3IVXpKVXqEBVfJeJIIgeEGaRIdVxz32P5y2/ZfvsX3IHPKW/rI16s4aM4KWGxJYQdy0MgkdeRfSGTLo8bp9uHb2Kaa80tZGVlo2xqJ1+hJSpRhLajn9mtLwisrDK5/IiR2UUG708juqqlUNuFyj6MtMaGwNrtxXGzn8m5Gaw2B7q6Wlob1aREHyH9XCqFMgXyRjPDD2YJLMzgHBihxmBFabqB+WYf/oUl1l69QtnWQYnKhECenY7daMA/Ncnasw1WVx4yctOMSnaZovQkzkRGIZHXMj0f4LrNTIFCQ35w8XRmGZZuN5tfbKA3GQiNiGbXnmNB4Kkj1MeE05YciUeRy3RXE/M9WtwGJercVDRXinG5uhkaGURRo+Lw8QQORJ3mw9BDlJbL6bjVycn4WEJDIwg/eBKBvfYqTsl5xivPs+WQsGPNYqmpgMXbPfi7TdibGhj29DA2MYbTbESUdp69777H3g92kxQ8iVJvoLC8kmPxnyKqqEXwqKcBR3sNK9Nu1h5047LU88POIttLAR7dH2bI52Zu2Mvi1F18/W4qa6oolEgpKqugVncNc5craMdn1LVbKdO1IfhurpOZgSZcbTI0qsucLy7FOj5P1jUvZwsUVKgqsFqbGfR00tTSSKFcQe/tYW719+Ltc+P1DdA31IfJ5SJNLEPw17eb/PzDBvz8isAdWxBaSKY4l8QiOZGJ5zh1NoaCEjFzAR/L83eZm5lifXWBwPQEU4H7jPjH8QSBepsNQ3s7gm++ecrbr9b55487bK2O89OPm3zmbER4SsjZjDSGBm4wPuHjv//5nn//9Ja//+013755wes/vWDn6xdsvtxiZWOZ5ScLrG3MI/jjzBgv1vz8eXuSnc/H+cf3qzxbH8PhbCbtQirP1iZ59vghL7cX+e7rpzzfXGH27iBDnhu4+27hGxsJ+hlgcWWaxdUHQbHrZIx26NiacbMacPMmCPYP2XC2XuWjsBDE4jzWZ0bZmvOxcH+Q2ZUn9I5M0KCuQm/UY7EbMTnaGL3dhae/E0FVfjIOtYiAV8f6UNDBUQuPH7r51+tZHg46CPR3MDPey6NeOy2FKaiqytEZr1Mik+D1OqitK2ff3lBSk+KQlIgQaOU5GOUXmew1cM90hSmLhCe39aw6ZDwesBBwuxj1BOtptNDZ0kJ6wkms+mo2ni7gMKvJL8ggOeMcnxw/QWzCaQT+O1bmFu6w8GQRb48VdWYsrqoM2vLi6FKKsKjlVAVTl4hzuCwtpehKCfX1ZXSYlNxw6Gg2VOEe6qZCU0V2xhkETSUJ5ItSg++qEnunieaaYqzKS8xP9/HVmw2WlybIP3eGmEP7qasrw+qyI6+Wcjz8fWIjw7DYtGw8X6Z3oBONIgtBdowQ4Z7fkB53mFZVHmN9eqb8wQQ9RlpMDfQMuf9f/ozkOEolOVRWy5BKLlJfW4TP5+Dll0v473Vj7TDQYdcguHQwjKQ9v6YgOhRbzieYyhIpvpRI3KEQEuIiyZdJ0Tmd1LSZ0LQ20dVzHaOpDmdnIwMDZhyWaiorLnIh8w+oa0oQiH/3C6Thv+TCrne4HPY+qRFhRITsYfc773EgZBdn4+MpV6tx9HtpadehMerQmtuClVRQVJhDyqfRnBBGcjQ6ipSYw/wP6GjoFIyyCggAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  538.  &gt;&lt;/span&gt;
  539.  &lt;img
  540.        class=&quot;gatsby-resp-image-image&quot;
  541.        alt=&quot;Drone flying in latent space&quot;
  542.        title=&quot;&quot;
  543.        src=&quot;/static/0f1832900b191d050e6e46a6949fd860/fcda8/drone-latent-space.png&quot;
  544.        srcset=&quot;/static/0f1832900b191d050e6e46a6949fd860/12f09/drone-latent-space.png 148w,
  545. /static/0f1832900b191d050e6e46a6949fd860/e4a3f/drone-latent-space.png 295w,
  546. /static/0f1832900b191d050e6e46a6949fd860/fcda8/drone-latent-space.png 590w,
  547. /static/0f1832900b191d050e6e46a6949fd860/efc66/drone-latent-space.png 885w,
  548. /static/0f1832900b191d050e6e46a6949fd860/2bef9/drone-latent-space.png 1024w&quot;
  549.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  550.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  551.        loading=&quot;lazy&quot;
  552.        decoding=&quot;async&quot;
  553.      /&gt;
  554.  &lt;/a&gt;
  555.    &lt;/span&gt;&lt;/p&gt;
  556. &lt;p&gt;Venkatesh Rao has been on a tear recently with some really insightful posts on AI - if you haven’t subscribed to his substack, &lt;a href=&quot;https://studio.ribbonfarm.com/&quot;&gt;Ribbonfarm Studio&lt;/a&gt;, you should.&lt;/p&gt;
  557. &lt;p&gt;His recent post ”&lt;a href=&quot;https://studio.ribbonfarm.com/p/a-camera-not-an-engine&quot;&gt;A Camera Not An Engine&lt;/a&gt;” is particularly good.&lt;/p&gt;
  558. &lt;p&gt;There he makes the point that, as it turns out, “intelligence” is much the same as data — a structure that can be gathered, browsed, analyzed, processed, and used.&lt;/p&gt;
  559. &lt;p&gt;We’re used to the idea of data being taken from our heads and the environment and organized together into a dataset or database — but taking “intelligence” from our collective lived experiences and merging them together into a coherent, parseable structure is incredibly novel.&lt;/p&gt;
  560. &lt;p&gt;Any dataset can be reliably processed into a sort of frozen “intelligence space”.&lt;/p&gt;
  561. &lt;p&gt;Venkatesh wrote:&lt;/p&gt;
  562. &lt;blockquote&gt;
  563. &lt;p&gt;The specific mechanisms of digesting that data into models don’t seem to matter beyond a point (a Twitter thread I saw argued that the differences among bleeding-edge LxMs are differences among the training data sets, not the minor implementation details or training protocol secret sauces). We might even be getting to some sort of dataset—bounded ceiling: perhaps LxMs are exactly as smart as their training data conceivably could be, or a small delta away from that ceiling.&lt;/p&gt;
  564. &lt;/blockquote&gt;
  565. &lt;p&gt;E.g. one explanation for why the the French AI company &lt;a href=&quot;https://mistral.ai/&quot;&gt;Mistral&lt;/a&gt;’s new models are so good is supposably they’re much more fastidious about cleaning their training data compared to the American giants who’ve largely just dumped in the entire internet and called it good.&lt;/p&gt;
  566. &lt;blockquote&gt;
  567. &lt;p&gt;Once you see intelligence as something embodied by particular pile of data rather than a particular kind of processing, a very powerful sort of decentering of anthropocentric conceits happens; a Copernican consciousness shift gets triggered. You are no more than the sum of data you’ve experienced. A big memory with a small shell script aside. And once you get over the trauma of that realization, you realize something even bigger: any pile of data that has some coherence in its source can be turned into an intelligence that you can relate to, broadening the possibilities of your own existence.&lt;/p&gt;
  568. &lt;/blockquote&gt;
  569. &lt;p&gt;&lt;em&gt;DALL·E 3’s interpretation of the above paragraph&lt;/em&gt;&lt;/p&gt;
  570. &lt;p&gt;&lt;span
  571.      class=&quot;gatsby-resp-image-wrapper&quot;
  572.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  573.    &gt;
  574.      &lt;a
  575.    class=&quot;gatsby-resp-image-link&quot;
  576.    href=&quot;/static/1a7d35380dd1b6caf182177bde70258b/a9a89/human-intelligence.webp&quot;
  577.    style=&quot;display: block&quot;
  578.    target=&quot;_blank&quot;
  579.    rel=&quot;noopener&quot;
  580.  &gt;
  581.    &lt;span
  582.    class=&quot;gatsby-resp-image-background-image&quot;
  583.    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/webp;base64,UklGRswAAABXRUJQVlA4IMAAAAAQBgCdASoUABQAPtFep0+oJKMiKAgBABoJQBOmZDnAQgGsuIMp8eW8Jk1p6H2azTAAGa2nmuxnAgAA/ulM9Fc23/f+eOjRwa9ZGv3lR+uydEkxVwWPu4PGEvu712AhxECRWoPpT0TXkm5+D88rovENx9VF9yfprmSivuWDGaAlYpLNucISOh1y/gZgV5wBUoAxeeqCAPogEbbgDqXlZfDqlDrQ8Iq6pXSuG3yX4STEIQyOlNGkBwtJS/J9SfP7gAA=&apos;); background-size: cover; display: block;&quot;
  584.  &gt;&lt;/span&gt;
  585.  &lt;img
  586.        class=&quot;gatsby-resp-image-image&quot;
  587.        alt=&quot;DALL·E 3&amp;#39;s interpretation of the above paragraph&quot;
  588.        title=&quot;&quot;
  589.        src=&quot;/static/1a7d35380dd1b6caf182177bde70258b/5ca24/human-intelligence.webp&quot;
  590.        srcset=&quot;/static/1a7d35380dd1b6caf182177bde70258b/cbe2e/human-intelligence.webp 148w,
  591. /static/1a7d35380dd1b6caf182177bde70258b/3084c/human-intelligence.webp 295w,
  592. /static/1a7d35380dd1b6caf182177bde70258b/5ca24/human-intelligence.webp 590w,
  593. /static/1a7d35380dd1b6caf182177bde70258b/dad35/human-intelligence.webp 885w,
  594. /static/1a7d35380dd1b6caf182177bde70258b/a9a89/human-intelligence.webp 1024w&quot;
  595.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  596.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  597.        loading=&quot;lazy&quot;
  598.        decoding=&quot;async&quot;
  599.      /&gt;
  600.  &lt;/a&gt;
  601.    &lt;/span&gt;&lt;/p&gt;
  602. &lt;p&gt;The blog speculates across a few more areas (go read it!) but I’ll leave the post now to explore this idea of a “camera” in latent space.&lt;/p&gt;
  603. &lt;h2 id=&quot;flying-cameras&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#flying-cameras&quot; aria-label=&quot;flying cameras permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Flying Cameras&lt;/h2&gt;
  604. &lt;p&gt;I’ve enjoyed photography since I was a child. Starting first with a very short leash on our family’s 35mm film camera (photos used to be expensive!) and then with free reign once we got our first digital camera (640x480 resolution!!). I like how it helps me discover new perspectives on the world as I wonder around. I find I can discover new things about even very familiar environments if I have a camera in hand.&lt;/p&gt;
  605. &lt;p&gt;Then a few years ago, I got my first drone. What convinced me to buy one was watching Philip Bloom’s drone reviews where he calls them “Flying Cameras” (he’s a great film maker - his reviews are worth watching even if you have no interest in drones e.g. this one of the &lt;a href=&quot;https://www.youtube.com/watch?v=35U93YnBmE8&quot;&gt;DJI Mini 3 Pro&lt;/a&gt;).&lt;/p&gt;
  606. &lt;p&gt;The drone as a “flying camera” completely changed how I viewed drones. I never quite saw the point of flying something around but having a flying camera that I can send anywhere I like and point it at anything was/is very exciting to me. Just sending a drone up 15 feet gives you a completely unique perspective on the world that’s almost impossible to see otherwise.&lt;/p&gt;
  607. &lt;p&gt;Here’s a &lt;a href=&quot;https://twitter.com/kylemathews/status/1419874055679664132&quot;&gt;twitter thread with all my early drone experiences&lt;/a&gt;.&lt;/p&gt;
  608. &lt;p&gt;And a few of the photos I’ve taken.&lt;/p&gt;
  609. &lt;p&gt;&lt;span
  610.      class=&quot;gatsby-resp-image-wrapper&quot;
  611.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  612.    &gt;
  613.      &lt;a
  614.    class=&quot;gatsby-resp-image-link&quot;
  615.    href=&quot;/static/125eec5a76d603805e0e1475a67034e9/a0850/berkeley-farmers-market.jpg&quot;
  616.    style=&quot;display: block&quot;
  617.    target=&quot;_blank&quot;
  618.    rel=&quot;noopener&quot;
  619.  &gt;
  620.    &lt;span
  621.    class=&quot;gatsby-resp-image-background-image&quot;
  622.    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB2l7MJior/8QAGRAAAgMBAAAAAAAAAAAAAAAAAQIAAxEi/9oACAEBAAEFAiOQ7iMX1U1RSIK1n//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGxj//EABwQAAICAgMAAAAAAAAAAAAAAAAhATECEVFh4f/aAAgBAQAGPwJTyXL7Fjss8HB//8QAGhABAAMBAQEAAAAAAAAAAAAAAQARIUFRYf/aAAgBAQABPyHTahg9hBbcRY2fUd24PIATIVaC2z//2gAMAwEAAgADAAAAEEfv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EK1//8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAx/9oACAECAQE/EEchX//EABsQAQADAAMBAAAAAAAAAAAAAAEAESExQVHB/9oACAEBAAE/ECESFYhrvfYadYFgPEgi1dsGy5kG6WN3cs0wDeUKYWyeNfJ//9k=&apos;); background-size: cover; display: block;&quot;
  623.  &gt;&lt;/span&gt;
  624.  &lt;img
  625.        class=&quot;gatsby-resp-image-image&quot;
  626.        alt=&quot;Berkeley Farmers Market&quot;
  627.        title=&quot;&quot;
  628.        src=&quot;/static/125eec5a76d603805e0e1475a67034e9/1c72d/berkeley-farmers-market.jpg&quot;
  629.        srcset=&quot;/static/125eec5a76d603805e0e1475a67034e9/a80bd/berkeley-farmers-market.jpg 148w,
  630. /static/125eec5a76d603805e0e1475a67034e9/1c91a/berkeley-farmers-market.jpg 295w,
  631. /static/125eec5a76d603805e0e1475a67034e9/1c72d/berkeley-farmers-market.jpg 590w,
  632. /static/125eec5a76d603805e0e1475a67034e9/a8a14/berkeley-farmers-market.jpg 885w,
  633. /static/125eec5a76d603805e0e1475a67034e9/fbd2c/berkeley-farmers-market.jpg 1180w,
  634. /static/125eec5a76d603805e0e1475a67034e9/a0850/berkeley-farmers-market.jpg 4096w&quot;
  635.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  636.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  637.        loading=&quot;lazy&quot;
  638.        decoding=&quot;async&quot;
  639.      /&gt;
  640.  &lt;/a&gt;
  641.    &lt;/span&gt;
  642. &lt;em&gt;Berkeley Farmers Market&lt;/em&gt;&lt;/p&gt;
  643. &lt;p&gt;&lt;span
  644.      class=&quot;gatsby-resp-image-wrapper&quot;
  645.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  646.    &gt;
  647.      &lt;a
  648.    class=&quot;gatsby-resp-image-link&quot;
  649.    href=&quot;/static/e41196e67840b13fd47d15185d9852de/a0850/baby-crawling.jpg&quot;
  650.    style=&quot;display: block&quot;
  651.    target=&quot;_blank&quot;
  652.    rel=&quot;noopener&quot;
  653.  &gt;
  654.    &lt;span
  655.    class=&quot;gatsby-resp-image-background-image&quot;
  656.    style=&quot;padding-bottom: 66.89189189189189%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/9oADAMBAAIQAxAAAAHU1R1LD//EABgQAQEAAwAAAAAAAAAAAAAAAAARARAh/9oACAEBAAEFAl1jqRX/xAAXEQADAQAAAAAAAAAAAAAAAAACEBES/9oACAEDAQE/AS1V/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BJ//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAIDAQEAAAAAAAAAAAAAAAARATFBIWH/2gAIAQEAAT8hzBngu3BhJKXZHg//2gAMAwEAAgADAAAAEE8v/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAEx/9oACAEDAQE/EJxR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/EAWrf//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQWFR/9oACAEBAAE/ECwU2utkByaX1ilLkeJDQ7O/kuW4ukh179n/2Q==&apos;); background-size: cover; display: block;&quot;
  657.  &gt;&lt;/span&gt;
  658.  &lt;img
  659.        class=&quot;gatsby-resp-image-image&quot;
  660.        alt=&quot;baby crawling&quot;
  661.        title=&quot;&quot;
  662.        src=&quot;/static/e41196e67840b13fd47d15185d9852de/1c72d/baby-crawling.jpg&quot;
  663.        srcset=&quot;/static/e41196e67840b13fd47d15185d9852de/a80bd/baby-crawling.jpg 148w,
  664. /static/e41196e67840b13fd47d15185d9852de/1c91a/baby-crawling.jpg 295w,
  665. /static/e41196e67840b13fd47d15185d9852de/1c72d/baby-crawling.jpg 590w,
  666. /static/e41196e67840b13fd47d15185d9852de/a8a14/baby-crawling.jpg 885w,
  667. /static/e41196e67840b13fd47d15185d9852de/fbd2c/baby-crawling.jpg 1180w,
  668. /static/e41196e67840b13fd47d15185d9852de/a0850/baby-crawling.jpg 4096w&quot;
  669.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  670.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  671.        loading=&quot;lazy&quot;
  672.        decoding=&quot;async&quot;
  673.      /&gt;
  674.  &lt;/a&gt;
  675.    &lt;/span&gt;
  676. &lt;em&gt;Baby Henry crawling around a basketball court at local elementary school&lt;/em&gt;&lt;/p&gt;
  677. &lt;p&gt;&lt;span
  678.      class=&quot;gatsby-resp-image-wrapper&quot;
  679.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  680.    &gt;
  681.      &lt;a
  682.    class=&quot;gatsby-resp-image-link&quot;
  683.    href=&quot;/static/f8d44ed4392db412e2dca101a7114582/a0850/smokey-oregon-valley.jpg&quot;
  684.    style=&quot;display: block&quot;
  685.    target=&quot;_blank&quot;
  686.    rel=&quot;noopener&quot;
  687.  &gt;
  688.    &lt;span
  689.    class=&quot;gatsby-resp-image-background-image&quot;
  690.    style=&quot;padding-bottom: 48.64864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABWtQlNaYmFf/EABoQAAICAwAAAAAAAAAAAAAAAAACAQMTFDL/2gAIAQEAAQUC2rYEveVzMML0f//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8BmkR//8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEREiH/2gAIAQIBAT8BnCzP/8QAGBAAAgMAAAAAAAAAAAAAAAAAADEBICH/2gAIAQEABj8C2Rjp/8QAGxAAAgMAAwAAAAAAAAAAAAAAAAERIWEQkbH/2gAIAQEAAT8hiQwXpvqMXQtHlx//2gAMAwEAAgADAAAAEMAf/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERYf/aAAgBAwEBPxCFBkf/xAAXEQEAAwAAAAAAAAAAAAAAAAAAESFh/9oACAECAQE/EJ2bP//EABoQAQEBAQADAAAAAAAAAAAAAAERACEQUdH/2gAIAQEAAT8QaSXg2NzoKQsne7MFKCm5AcPvx//Z&apos;); background-size: cover; display: block;&quot;
  691.  &gt;&lt;/span&gt;
  692.  &lt;img
  693.        class=&quot;gatsby-resp-image-image&quot;
  694.        alt=&quot;smoky oregon valley&quot;
  695.        title=&quot;&quot;
  696.        src=&quot;/static/f8d44ed4392db412e2dca101a7114582/1c72d/smokey-oregon-valley.jpg&quot;
  697.        srcset=&quot;/static/f8d44ed4392db412e2dca101a7114582/a80bd/smokey-oregon-valley.jpg 148w,
  698. /static/f8d44ed4392db412e2dca101a7114582/1c91a/smokey-oregon-valley.jpg 295w,
  699. /static/f8d44ed4392db412e2dca101a7114582/1c72d/smokey-oregon-valley.jpg 590w,
  700. /static/f8d44ed4392db412e2dca101a7114582/a8a14/smokey-oregon-valley.jpg 885w,
  701. /static/f8d44ed4392db412e2dca101a7114582/fbd2c/smokey-oregon-valley.jpg 1180w,
  702. /static/f8d44ed4392db412e2dca101a7114582/a0850/smokey-oregon-valley.jpg 4096w&quot;
  703.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  704.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  705.        loading=&quot;lazy&quot;
  706.        decoding=&quot;async&quot;
  707.      /&gt;
  708.  &lt;/a&gt;
  709.    &lt;/span&gt;
  710. &lt;em&gt;Small smoky Oregon valley&lt;/em&gt;&lt;/p&gt;
  711. &lt;p&gt;&lt;span
  712.      class=&quot;gatsby-resp-image-wrapper&quot;
  713.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  714.    &gt;
  715.      &lt;a
  716.    class=&quot;gatsby-resp-image-link&quot;
  717.    href=&quot;/static/96ff2430b09f8f186714dd8aface82bf/73d69/cone-baseball-field.jpg&quot;
  718.    style=&quot;display: block&quot;
  719.    target=&quot;_blank&quot;
  720.    rel=&quot;noopener&quot;
  721.  &gt;
  722.    &lt;span
  723.    class=&quot;gatsby-resp-image-background-image&quot;
  724.    style=&quot;padding-bottom: 66.89189189189189%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAwABAv/EABUBAQEAAAAAAAAAAAAAAAAAAAME/9oADAMBAAIQAxAAAAFB3uZVjkb/xAAZEAEAAwEBAAAAAAAAAAAAAAABABExAhL/2gAIAQEAAQUCeoHpyVbis//EABcRAQADAAAAAAAAAAAAAAAAAAIQESH/2gAIAQMBAT8BJvY//8QAFhEAAwAAAAAAAAAAAAAAAAAAAQIQ/9oACAECAQE/AVE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAGRABAQADAQAAAAAAAAAAAAAAAQARITFB/9oACAEBAAE/IdbdrkAMXol0Fsv/2gAMAwEAAgADAAAAEFfP/8QAFREBAQAAAAAAAAAAAAAAAAAAMRD/2gAIAQMBAT8QcJ//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQIBAT8QBNsv/8QAGxABAAICAwAAAAAAAAAAAAAAAQARITFBUYH/2gAIAQEAAT8QIR51HZwDTBAAA1AAWrqKGEsPIgp//9k=&apos;); background-size: cover; display: block;&quot;
  725.  &gt;&lt;/span&gt;
  726.  &lt;img
  727.        class=&quot;gatsby-resp-image-image&quot;
  728.        alt=&quot;Cone in Baseball Field&quot;
  729.        title=&quot;&quot;
  730.        src=&quot;/static/96ff2430b09f8f186714dd8aface82bf/1c72d/cone-baseball-field.jpg&quot;
  731.        srcset=&quot;/static/96ff2430b09f8f186714dd8aface82bf/a80bd/cone-baseball-field.jpg 148w,
  732. /static/96ff2430b09f8f186714dd8aface82bf/1c91a/cone-baseball-field.jpg 295w,
  733. /static/96ff2430b09f8f186714dd8aface82bf/1c72d/cone-baseball-field.jpg 590w,
  734. /static/96ff2430b09f8f186714dd8aface82bf/a8a14/cone-baseball-field.jpg 885w,
  735. /static/96ff2430b09f8f186714dd8aface82bf/fbd2c/cone-baseball-field.jpg 1180w,
  736. /static/96ff2430b09f8f186714dd8aface82bf/73d69/cone-baseball-field.jpg 3874w&quot;
  737.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  738.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  739.        loading=&quot;lazy&quot;
  740.        decoding=&quot;async&quot;
  741.      /&gt;
  742.  &lt;/a&gt;
  743.    &lt;/span&gt;
  744. &lt;em&gt;Cone in baseball field&lt;/em&gt;&lt;/p&gt;
  745. &lt;p&gt;&lt;span
  746.      class=&quot;gatsby-resp-image-wrapper&quot;
  747.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  748.    &gt;
  749.      &lt;a
  750.    class=&quot;gatsby-resp-image-link&quot;
  751.    href=&quot;/static/f99a23f5d70f97c8641b983d9362499f/a0850/parking-lot.jpg&quot;
  752.    style=&quot;display: block&quot;
  753.    target=&quot;_blank&quot;
  754.    rel=&quot;noopener&quot;
  755.  &gt;
  756.    &lt;span
  757.    class=&quot;gatsby-resp-image-background-image&quot;
  758.    style=&quot;padding-bottom: 66.89189189189189%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABsQ2MY0P/xAAaEAEAAQUAAAAAAAAAAAAAAAABAAIQETEy/9oACAEBAAEFAiPNOi2An//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAQADAQAAAAAAAAAAAAAAAAABECEx/9oACAEBAAY/Ak3rj//EABkQAQEBAAMAAAAAAAAAAAAAAAEAEWFxof/aAAgBAQABPyEcxyO6Vg6DScwer//aAAwDAQACAAMAAAAQFP8A/8QAFREBAQAAAAAAAAAAAAAAAAAAAAH/2gAIAQMBAT8QR//EABURAQEAAAAAAAAAAAAAAAAAAAAB/9oACAECAQE/EFf/xAAbEAEBAAMBAQEAAAAAAAAAAAABEQAhMVFBof/aAAgBAQABPxAXo3XLYdh3Z9yCSovr+uUc7wZQY99yyGyu3c//2Q==&apos;); background-size: cover; display: block;&quot;
  759.  &gt;&lt;/span&gt;
  760.  &lt;img
  761.        class=&quot;gatsby-resp-image-image&quot;
  762.        alt=&quot;Parking Lot&quot;
  763.        title=&quot;&quot;
  764.        src=&quot;/static/f99a23f5d70f97c8641b983d9362499f/1c72d/parking-lot.jpg&quot;
  765.        srcset=&quot;/static/f99a23f5d70f97c8641b983d9362499f/a80bd/parking-lot.jpg 148w,
  766. /static/f99a23f5d70f97c8641b983d9362499f/1c91a/parking-lot.jpg 295w,
  767. /static/f99a23f5d70f97c8641b983d9362499f/1c72d/parking-lot.jpg 590w,
  768. /static/f99a23f5d70f97c8641b983d9362499f/a8a14/parking-lot.jpg 885w,
  769. /static/f99a23f5d70f97c8641b983d9362499f/fbd2c/parking-lot.jpg 1180w,
  770. /static/f99a23f5d70f97c8641b983d9362499f/a0850/parking-lot.jpg 4096w&quot;
  771.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  772.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  773.        loading=&quot;lazy&quot;
  774.        decoding=&quot;async&quot;
  775.      /&gt;
  776.  &lt;/a&gt;
  777.    &lt;/span&gt;
  778. &lt;em&gt;Parking lot&lt;/em&gt;&lt;/p&gt;
  779. &lt;p&gt;&lt;span
  780.      class=&quot;gatsby-resp-image-wrapper&quot;
  781.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  782.    &gt;
  783.      &lt;a
  784.    class=&quot;gatsby-resp-image-link&quot;
  785.    href=&quot;/static/ec33ec066c4095588a183280ecdcb9b4/a0850/toledo-oregon-panorma.jpg&quot;
  786.    style=&quot;display: block&quot;
  787.    target=&quot;_blank&quot;
  788.    rel=&quot;noopener&quot;
  789.  &gt;
  790.    &lt;span
  791.    class=&quot;gatsby-resp-image-background-image&quot;
  792.    style=&quot;padding-bottom: 52.02702702702703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAaRz9UeFSP/EABsQAAIBBQAAAAAAAAAAAAAAAAABAgMREzFB/9oACAEBAAEFAlWuZRTOPZ//xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlEo//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESAv/aAAgBAgEBPwG2Xo//xAAZEAADAAMAAAAAAAAAAAAAAAAAAjEBIJH/2gAIAQEABj8CmOEQi6f/xAAbEAEBAAMAAwAAAAAAAAAAAAABACFBsXHB8f/aAAgBAQABPyFRmyPpCnqZUGdvLgRvzf/aAAwDAQACAAMAAAAQiB//xAAVEQEBAAAAAAAAAAAAAAAAAAAAYf/aAAgBAwEBPxCCL//EABgRAAIDAAAAAAAAAAAAAAAAAAABETFh/9oACAECAQE/ENRzWf/EAB4QAQACAQQDAAAAAAAAAAAAAAEAESExYXGxUaHR/9oACAEBAAE/ELHwbPTLAN/jUcwKim32hAIKsMe27eNyvKu5/9k=&apos;); background-size: cover; display: block;&quot;
  793.  &gt;&lt;/span&gt;
  794.  &lt;img
  795.        class=&quot;gatsby-resp-image-image&quot;
  796.        alt=&quot;Toledo Oregon Panorama (where I grew up)&quot;
  797.        title=&quot;&quot;
  798.        src=&quot;/static/ec33ec066c4095588a183280ecdcb9b4/1c72d/toledo-oregon-panorma.jpg&quot;
  799.        srcset=&quot;/static/ec33ec066c4095588a183280ecdcb9b4/a80bd/toledo-oregon-panorma.jpg 148w,
  800. /static/ec33ec066c4095588a183280ecdcb9b4/1c91a/toledo-oregon-panorma.jpg 295w,
  801. /static/ec33ec066c4095588a183280ecdcb9b4/1c72d/toledo-oregon-panorma.jpg 590w,
  802. /static/ec33ec066c4095588a183280ecdcb9b4/a8a14/toledo-oregon-panorma.jpg 885w,
  803. /static/ec33ec066c4095588a183280ecdcb9b4/fbd2c/toledo-oregon-panorma.jpg 1180w,
  804. /static/ec33ec066c4095588a183280ecdcb9b4/a0850/toledo-oregon-panorma.jpg 4096w&quot;
  805.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  806.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  807.        loading=&quot;lazy&quot;
  808.        decoding=&quot;async&quot;
  809.      /&gt;
  810.  &lt;/a&gt;
  811.    &lt;/span&gt;
  812. &lt;em&gt;Toledo Oregon panorama (where I grew up)&lt;/em&gt;&lt;/p&gt;
  813. &lt;p&gt;&lt;span
  814.      class=&quot;gatsby-resp-image-wrapper&quot;
  815.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  816.    &gt;
  817.      &lt;a
  818.    class=&quot;gatsby-resp-image-link&quot;
  819.    href=&quot;/static/f642be5e5a00f6d28c95c35f4e33b446/a0850/cows-in-snow.jpg&quot;
  820.    style=&quot;display: block&quot;
  821.    target=&quot;_blank&quot;
  822.    rel=&quot;noopener&quot;
  823.  &gt;
  824.    &lt;span
  825.    class=&quot;gatsby-resp-image-background-image&quot;
  826.    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB1HZ0oJD/xAAXEAEBAQEAAAAAAAAAAAAAAAABEAAi/9oACAEBAAEFAlTdQv8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEhIP/aAAgBAQAGPwKIqz//xAAbEAEAAgIDAAAAAAAAAAAAAAABADEQQREhYf/aAAgBAQABPyEROxpg006nHkphuf/aAAwDAQACAAMAAAAQD/8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAQEAAwEAAAAAAAAAAAAAAREAITFRYf/aAAgBAQABPxCmEPke3VFRKvrNNYfHGw9PDngmbW//2Q==&apos;); background-size: cover; display: block;&quot;
  827.  &gt;&lt;/span&gt;
  828.  &lt;img
  829.        class=&quot;gatsby-resp-image-image&quot;
  830.        alt=&quot;cows in fresh snow&quot;
  831.        title=&quot;&quot;
  832.        src=&quot;/static/f642be5e5a00f6d28c95c35f4e33b446/1c72d/cows-in-snow.jpg&quot;
  833.        srcset=&quot;/static/f642be5e5a00f6d28c95c35f4e33b446/a80bd/cows-in-snow.jpg 148w,
  834. /static/f642be5e5a00f6d28c95c35f4e33b446/1c91a/cows-in-snow.jpg 295w,
  835. /static/f642be5e5a00f6d28c95c35f4e33b446/1c72d/cows-in-snow.jpg 590w,
  836. /static/f642be5e5a00f6d28c95c35f4e33b446/a8a14/cows-in-snow.jpg 885w,
  837. /static/f642be5e5a00f6d28c95c35f4e33b446/fbd2c/cows-in-snow.jpg 1180w,
  838. /static/f642be5e5a00f6d28c95c35f4e33b446/a0850/cows-in-snow.jpg 4096w&quot;
  839.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  840.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  841.        loading=&quot;lazy&quot;
  842.        decoding=&quot;async&quot;
  843.      /&gt;
  844.  &lt;/a&gt;
  845.    &lt;/span&gt;
  846. &lt;em&gt;Cows in fresh snow&lt;/em&gt;&lt;/p&gt;
  847. &lt;p&gt;&lt;span
  848.      class=&quot;gatsby-resp-image-wrapper&quot;
  849.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  850.    &gt;
  851.      &lt;a
  852.    class=&quot;gatsby-resp-image-link&quot;
  853.    href=&quot;/static/fb912e3e48c99c620e39db4e0a7dc655/a0850/berkeley-street-scene.jpg&quot;
  854.    style=&quot;display: block&quot;
  855.    target=&quot;_blank&quot;
  856.    rel=&quot;noopener&quot;
  857.  &gt;
  858.    &lt;span
  859.    class=&quot;gatsby-resp-image-background-image&quot;
  860.    style=&quot;padding-bottom: 66.89189189189189%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAECBP/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHFVOHYIK//xAAZEAEBAQEBAQAAAAAAAAAAAAABAgATAxH/2gAIAQEAAQUC5LiUxfmHRMXip+f/xAAVEQEBAAAAAAAAAAAAAAAAAAAAIf/aAAgBAwEBPwFH/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEh/9oACAECAQE/AY1//8QAGRAAAgMBAAAAAAAAAAAAAAAAAAERITIx/9oACAEBAAY/ApRdGWQcRhH/xAAaEAEBAAIDAAAAAAAAAAAAAAABABExYZGh/9oACAEBAAE/IUeziBGAh42Y7nVkAWJmTH//2gAMAwEAAgADAAAAELvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAACFx/9oACAEDAQE/EIy//8QAFhEAAwAAAAAAAAAAAAAAAAAAACFB/9oACAECAQE/EHotP//EAB4QAQADAAEFAQAAAAAAAAAAAAEAESFhMUFRgaGx/9oACAEBAAE/EFrYy2LtELpA0r2OPLLjGdXb9isFpoL+JSkXBuz3dwFZcKT/2Q==&apos;); background-size: cover; display: block;&quot;
  861.  &gt;&lt;/span&gt;
  862.  &lt;img
  863.        class=&quot;gatsby-resp-image-image&quot;
  864.        alt=&quot;Berkeley street scene&quot;
  865.        title=&quot;&quot;
  866.        src=&quot;/static/fb912e3e48c99c620e39db4e0a7dc655/1c72d/berkeley-street-scene.jpg&quot;
  867.        srcset=&quot;/static/fb912e3e48c99c620e39db4e0a7dc655/a80bd/berkeley-street-scene.jpg 148w,
  868. /static/fb912e3e48c99c620e39db4e0a7dc655/1c91a/berkeley-street-scene.jpg 295w,
  869. /static/fb912e3e48c99c620e39db4e0a7dc655/1c72d/berkeley-street-scene.jpg 590w,
  870. /static/fb912e3e48c99c620e39db4e0a7dc655/a8a14/berkeley-street-scene.jpg 885w,
  871. /static/fb912e3e48c99c620e39db4e0a7dc655/fbd2c/berkeley-street-scene.jpg 1180w,
  872. /static/fb912e3e48c99c620e39db4e0a7dc655/a0850/berkeley-street-scene.jpg 4096w&quot;
  873.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  874.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  875.        loading=&quot;lazy&quot;
  876.        decoding=&quot;async&quot;
  877.      /&gt;
  878.  &lt;/a&gt;
  879.    &lt;/span&gt;
  880. &lt;em&gt;Berkeley street scene&lt;/em&gt;&lt;/p&gt;
  881. &lt;h2 id=&quot;photos-in-latent-space&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#photos-in-latent-space&quot; aria-label=&quot;photos in latent space permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Photos in latent space&lt;/h2&gt;
  882. &lt;p&gt;Ok back to latent space.&lt;/p&gt;
  883. &lt;p&gt;I’m arguing “prompts as a photograph” is a much more useful metaphor for the latest AI than what other people are proposing e.g. they’re reasoning engines or LLMs are roleplaying, etc.&lt;/p&gt;
  884. &lt;p&gt;Large models are hyperdimensional static lossy representations of their dataset and prompts elicit specific snapshots from within this space. I like that process to “drone cameras” that we can position and point anywhere within a latent space to take snapshots from that particular perspective.&lt;/p&gt;
  885. &lt;p&gt;Writing a prompt is how we position and point the “latent space camera”. The output from the prompt is the unique snapshot. And like with photography where we can adjust the perspective, position, exposure, time of day, lightning conditions, zoom, depth of field to change the photograph of the same subject, we can also endlessly tweak our prompts to change the output.&lt;/p&gt;
  886. &lt;p&gt;Regular light cameras capture a snapshot of reality. Latent space cameras capture a snapshot of intelligence.&lt;/p&gt;
  887. &lt;p&gt;And like with drones, we can send our latent space cameras anywhere within the space.&lt;/p&gt;
  888. &lt;p&gt;Ted Chiang got at this idea a bit with his article ”&lt;a href=&quot;https://www.newyorker.com/tech/annals-of-technology/chatgpt-is-a-blurry-jpeg-of-the-web&quot;&gt;ChatGPT is a Blurry JPEG of the Web&lt;/a&gt;”&lt;/p&gt;
  889. &lt;p&gt;&lt;a href=&quot;https://mirror.xyz/herndondryhurst.eth/eZG6mucl9fqU897XvJs0vUUMnm5OITpSWN8S-6KWamY&quot;&gt;Infinite Images and the latent camera&lt;/a&gt; is another interesting exploration.&lt;/p&gt;
  890. &lt;p&gt;I asked ChatGPT what it thought about this idea and this is what it came up with:&lt;/p&gt;
  891. &lt;blockquote&gt;
  892. &lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt;&lt;/p&gt;
  893. &lt;p&gt;what does “latent camera” mean in relationship to prompts to LLMs?&lt;/p&gt;
  894. &lt;p&gt;&lt;strong&gt;ChatGPT:&lt;/strong&gt;&lt;/p&gt;
  895. &lt;p&gt;The term “latent camera” in relation to prompts to Large Language Models (LLMs) like GPT-4 is a metaphorical concept. It’s not a literal device but rather a way to describe how an LLM interprets and processes prompts, especially those that involve generating or interpreting images.&lt;/p&gt;
  896. &lt;p&gt;In traditional photography, a camera captures an image based on the light reflected from objects. In the world of AI and LLMs, the “latent camera” conceptually captures the essence or the ‘latent’ features of a prompt. Here’s a breakdown:&lt;/p&gt;
  897. &lt;p&gt;Latent Space Representation: In AI, particularly in models like GPT or DALL-E, data (text or images) is converted into a high-dimensional space known as latent space. This space represents abstract features of the data, which the model can manipulate or interpret.&lt;/p&gt;
  898. &lt;p&gt;Prompts as ‘Photographs’: When you provide a prompt to an LLM, it’s akin to taking a picture with this ‘latent camera.’ The model ‘views’ the prompt through its trained understanding, analyzing the words and their associations as a camera would analyze light and shapes.&lt;/p&gt;
  899. &lt;p&gt;Interpreting and Generating Responses: Just as a camera processes light to create a photo, the LLM processes the prompt in its latent space to generate a response. This can include creating text, generating an image (as with DALL-E), or interpreting and answering questions.&lt;/p&gt;
  900. &lt;p&gt;Complexity and Creativity: The ‘latent camera’ of an LLM is much more sophisticated than a regular camera. It’s capable of creative and complex tasks, like understanding abstract concepts, making associations, and even creating art or poetry.&lt;/p&gt;
  901. &lt;p&gt;Limitations and Biases: Like any camera, the ‘latent camera’ of an LLM has its limitations and biases, based on the data it was trained on and the algorithms it uses. It might ‘see’ things differently based on its programming, much like how different camera lenses capture different perspectives.&lt;/p&gt;
  902. &lt;p&gt;In summary, “latent camera” is a way to conceptualize how LLMs process prompts, turning abstract textual data into meaningful responses, much like how a camera turns light into images.&lt;/p&gt;
  903. &lt;/blockquote&gt;
  904. &lt;h2 id=&quot;drones-can-move&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#drones-can-move&quot; aria-label=&quot;drones can move permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Drones can move&lt;/h2&gt;
  905. &lt;p&gt;While the vast majority of my drone work has been static photos — where I nudged the drone around foot by foot until I got the shot I wanted — it’s also really interesting to explore how drones can move in 3d space along paths that are almost impossible to traverse with any other tool. One my favorites is &lt;a href=&quot;https://twitter.com/kylemathews/status/1436174216429117441&quot;&gt;this video of my drone flying on a foggy day on the Oregon coast descending from above the trees to the forest floor&lt;/a&gt;. It’s magical to me watching the shift from the cool greys and greens and textures of the fog and tree tops to the warm greens and browns and rich plant life of the forst floor.&lt;/p&gt;
  906. &lt;p&gt;And what I’ve been playing with recently is that our “latent camera” can take video as well. Video is just a series of photos that when played back, create the illusion of movement. Our latent camera isn’t limited to snapshots but can actually fly around the latent space of the model taking video.&lt;/p&gt;
  907. &lt;p&gt;Here are some of my favorite prompts that I’ve come up with:&lt;/p&gt;
  908. &lt;h3 id=&quot;technology-zoom-camera&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#technology-zoom-camera&quot; aria-label=&quot;technology zoom camera permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Technology Zoom Camera&lt;/h3&gt;
  909. &lt;p&gt;My idea here is you give the prompt any sort of technology and it’ll “zoom” into the technology’s subcomponents. I’ve just walkd around the house taking photos of everyday items and it’s really fun to learn more about how stuff is made.&lt;/p&gt;
  910. &lt;p&gt;Sometimes zooming into sub-components takes you deep into the industrial processes behind seemingly trivial household items e.g. this picture I took of a moisture absorbing container.&lt;/p&gt;
  911. &lt;p&gt;&lt;span
  912.      class=&quot;gatsby-resp-image-wrapper&quot;
  913.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  914.    &gt;
  915.      &lt;a
  916.    class=&quot;gatsby-resp-image-link&quot;
  917.    href=&quot;/static/0efe0571a18008db40facc331aa913c2/7f09e/moisture-absorbing-container.jpg&quot;
  918.    style=&quot;display: block&quot;
  919.    target=&quot;_blank&quot;
  920.    rel=&quot;noopener&quot;
  921.  &gt;
  922.    &lt;span
  923.    class=&quot;gatsby-resp-image-background-image&quot;
  924.    style=&quot;padding-bottom: 133.1081081081081%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAwABAgT/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/2gAMAwEAAhADEAAAAVQMm2ONfwj05zHI/wD/xAAeEAEAAQMFAQAAAAAAAAAAAAABAgAREgQQEyEiQf/aAAgBAQABBQKMrv1ongc60y71AYx8s28lXf8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAECAQE/AUTP/8QAGhAAAgMBAQAAAAAAAAAAAAAAEBEAATEhIv/aAAgBAQAGPwJFqplDzHo7Z//EABsQAQEBAQADAQAAAAAAAAAAAAEAESExQWHw/9oACAEBAAE/Ian52HYRDPjUloHf5ZdNmaDuuzOjVqMrqMXu/9oADAMBAAIAAwAAABAXMw3/xAAYEQEBAAMAAAAAAAAAAAAAAAABABARQf/aAAgBAwEBPxADtucf/8QAFxEAAwEAAAAAAAAAAAAAAAAAARARMf/aAAgBAgEBPxA04ghf/8QAHBABAQEBAQADAQAAAAAAAAAAAREAITFBUWGh/9oACAEBAAE/ELyvPo+MCIlJ7HfzBd3bCEmjlAlQnR/cSnTHD2IrgiYdgQzmUPJdaI/Xec9S/e//2Q==&apos;); background-size: cover; display: block;&quot;
  925.  &gt;&lt;/span&gt;
  926.  &lt;img
  927.        class=&quot;gatsby-resp-image-image&quot;
  928.        alt=&quot;Moisture absorbing container&quot;
  929.        title=&quot;&quot;
  930.        src=&quot;/static/0efe0571a18008db40facc331aa913c2/1c72d/moisture-absorbing-container.jpg&quot;
  931.        srcset=&quot;/static/0efe0571a18008db40facc331aa913c2/a80bd/moisture-absorbing-container.jpg 148w,
  932. /static/0efe0571a18008db40facc331aa913c2/1c91a/moisture-absorbing-container.jpg 295w,
  933. /static/0efe0571a18008db40facc331aa913c2/1c72d/moisture-absorbing-container.jpg 590w,
  934. /static/0efe0571a18008db40facc331aa913c2/a8a14/moisture-absorbing-container.jpg 885w,
  935. /static/0efe0571a18008db40facc331aa913c2/7f09e/moisture-absorbing-container.jpg 1156w&quot;
  936.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  937.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  938.        loading=&quot;lazy&quot;
  939.        decoding=&quot;async&quot;
  940.      /&gt;
  941.  &lt;/a&gt;
  942.    &lt;/span&gt;&lt;/p&gt;
  943. &lt;p&gt;ChatGPT responded:&lt;/p&gt;
  944. &lt;blockquote&gt;
  945. &lt;p&gt;The image shows a container labeled “Moisture Absorber,” which is a product designed to reduce humidity in the air. Let’s delve into the technology and its components:&lt;/p&gt;
  946. &lt;p&gt;&lt;strong&gt;Moisture Absorber&lt;/strong&gt;: This product is designed to attract and trap water from the air, reducing humidity and preventing mold and mildew. The technology is based on the hygroscopic property of certain substances, meaning they can attract and hold water molecules from their surroundings.&lt;/p&gt;
  947. &lt;p&gt;&lt;strong&gt;Desiccant&lt;/strong&gt;: Inside the container, the most important component is the desiccant. Common desiccants include silica gel, calcium chloride, or activated alumina. They work through adsorption or absorption, pulling moisture from the air onto their surface or into their structure.&lt;/p&gt;
  948. &lt;p&gt;&lt;strong&gt;Calcium Chloride&lt;/strong&gt;: If calcium chloride is the active ingredient, it’s notable for its high hygroscopicity. As a deliquescent substance, it can absorb so much moisture that it dissolves in the water it collects.&lt;/p&gt;
  949. &lt;p&gt;&lt;strong&gt;Chemical Production of Calcium Chloride&lt;/strong&gt;: Calcium chloride is produced by various methods, including as a byproduct of the Solvay process in the manufacturing of sodium carbonate, or by reacting hydrochloric acid with calcium carbonate.&lt;/p&gt;
  950. &lt;p&gt;&lt;strong&gt;Solvay Process&lt;/strong&gt;: The Solvay process is a major industrial chemical process that’s used to produce sodium carbonate and calcium chloride. It involves the reaction of sodium chloride, ammonia, and carbon dioxide in water.&lt;/p&gt;
  951. &lt;p&gt;The technology behind moisture absorbers is deeply rooted in chemical engineering, where control of reactions and an understanding of material properties are essential.&lt;/p&gt;
  952. &lt;/blockquote&gt;
  953. &lt;p&gt;I turned this into a custom GPT — &lt;a href=&quot;https://chat.openai.com/g/g-sdDRJIFLW-technology-zoom-camera&quot;&gt;https://chat.openai.com/g/g-sdDRJIFLW-technology-zoom-camera&lt;/a&gt; if you’d like to play with it more.&lt;/p&gt;
  954. &lt;p&gt;The prompt I’ve iterated to is:&lt;/p&gt;
  955. &lt;blockquote&gt;
  956. &lt;p&gt;For five steps, describe a technology (including any natural phenomenon it relies on and the last significant development in the technology with date (if you’re confident about what this is)) and then pick the most important or well-known or charismatic of its sub-components and describe that. A technology is anything that meets a human purpose e.g. media, writing, software, algorithms, consumer devices. or machinery of any sort. If a technology derives from a natural phenomenon, jump to that and then more specific parts of the natural law. Don’t pick an adjacent component. The next step must always be a new constituent component of the current technology.&lt;/p&gt;
  957. &lt;p&gt;If you reach a natural element like Aluminium, instead of going into the chemistry of the element, pick its primary ore that’s mined and then focus on the mining technology to extract that ore.&lt;/p&gt;
  958. &lt;p&gt;In general, choose technologies over natural phenomenons (though still describe which ones a technology relies on) and choose natural phenomenons over delving deeper into the specific chemistry of a material.&lt;/p&gt;
  959. &lt;p&gt;If you reach mining and haven’t yet hit five steps, circle back to the original technology and pick the second most important, or well-known, or charismatic of its sub-components and continue the process. E.g. for the technology “pencil”, you would choose pencil, graphite core, graphite mining, and then return to the pencil wood and then describing logging the wood used in pencils.&lt;/p&gt;
  960. &lt;p&gt;Generally people will only include the top-level technology but if they provide a series of subcomponent, follow the ones they choose instead of your own.&lt;/p&gt;
  961. &lt;/blockquote&gt;
  962. &lt;h2 id=&quot;prompts-that-program-a-flight-path-through-latent-space&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prompts-that-program-a-flight-path-through-latent-space&quot; aria-label=&quot;prompts that program a flight path through latent space permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prompts that program a “flight path” through latent space&lt;/h2&gt;
  963. &lt;p&gt;Many drones let you program a “flight path” e.g. flying between certain geography points or flying upwards at a 70 degree angle for 250 feet, etc.&lt;/p&gt;
  964. &lt;p&gt;What I love about this prompt is it’s a repeatable flight path through a particular territory of ideas — the technology component tree in this case.&lt;/p&gt;
  965. &lt;p&gt;Once you see prompts as instructions to fly to particular point and then (optionally) fly along a programmed flight path taking a series of photos in a specific way — the possibilities really open up.&lt;/p&gt;
  966. &lt;p&gt;Here’s a few more of my favorites:&lt;/p&gt;
  967. &lt;h3 id=&quot;randomize-story-generation-around-a-few-attributes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#randomize-story-generation-around-a-few-attributes&quot; aria-label=&quot;randomize story generation around a few attributes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Randomize story generation around a few attributes&lt;/h3&gt;
  968. &lt;blockquote&gt;
  969. &lt;p&gt;&lt;strong&gt;You&lt;/strong&gt;
  970. take a short story idea and then retell it 3 times varying randomly the main subject, perspective,  tone, mood, depth of field, and environment. Before each telling of the story, list what you choose for each attribute and then tell the story.&lt;/p&gt;
  971. &lt;p&gt;boy meets girl&lt;/p&gt;
  972. &lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;&lt;/p&gt;
  973. &lt;p&gt;Story Idea: Boy Meets Girl&lt;/p&gt;
  974. &lt;ol&gt;
  975. &lt;li&gt;Main Subject: Time Travel&lt;/li&gt;
  976. &lt;/ol&gt;
  977. &lt;ul&gt;
  978. &lt;li&gt;Perspective: First Person (Boy)&lt;/li&gt;
  979. &lt;li&gt;Tone: Whimsical&lt;/li&gt;
  980. &lt;li&gt;Mood: Nostalgic&lt;/li&gt;
  981. &lt;li&gt;Depth of Field: Focused on Emotional Complexity&lt;/li&gt;
  982. &lt;li&gt;Environment: Victorian London&lt;/li&gt;
  983. &lt;/ul&gt;
  984. &lt;p&gt;Story:&lt;br&gt;
  985. I, a time traveler, found myself in Victorian London. Amidst the fog and carriages, I met her, an enigma with a parasol. Each day, I’d leap through time to see her, our conversations a delightful anachronism. But, with every visit, I noticed subtle changes – a glance, a word amiss. I realized, each journey altered our shared moments, painting them with a nostalgic hue, leaving me yearning for a past untouched by time’s whims.&lt;/p&gt;
  986. &lt;ol start=&quot;2&quot;&gt;
  987. &lt;li&gt;Main Subject: Alien Encounter&lt;/li&gt;
  988. &lt;/ol&gt;
  989. &lt;ul&gt;
  990. &lt;li&gt;Perspective: Third Person Omniscient&lt;/li&gt;
  991. &lt;li&gt;Tone: Mysterious&lt;/li&gt;
  992. &lt;li&gt;Mood: Foreboding&lt;/li&gt;
  993. &lt;li&gt;Depth of Field: Expansive, Cosmic Scale&lt;/li&gt;
  994. &lt;li&gt;Environment: Dystopian Earth&lt;/li&gt;
  995. &lt;/ul&gt;
  996. &lt;p&gt;Story:&lt;br&gt;
  997. On a dystopian Earth, he, a lone wanderer, stumbled upon her, not a girl, but an alien entity. The world watched, breath bated, as their encounter unfolded. This meeting, under a blood-red sky, hinted at secrets beyond human comprehension. The air was thick with a foreboding sense of wonder and terror, as if their interaction could determine the fate of worlds. Yet, they stood, two beings from different universes, finding an unlikely connection amidst chaos.&lt;/p&gt;
  998. &lt;ol start=&quot;3&quot;&gt;
  999. &lt;li&gt;Main Subject: Ghostly Reunion&lt;/li&gt;
  1000. &lt;/ol&gt;
  1001. &lt;ul&gt;
  1002. &lt;li&gt;Perspective: Second Person (You are the Girl)&lt;/li&gt;
  1003. &lt;li&gt;Tone: Eerie&lt;/li&gt;
  1004. &lt;li&gt;Mood: Melancholic&lt;/li&gt;
  1005. &lt;li&gt;Depth of Field: Introspective, Ethereal&lt;/li&gt;
  1006. &lt;li&gt;Environment: Abandoned Mansion&lt;/li&gt;
  1007. &lt;/ul&gt;
  1008. &lt;p&gt;Story:&lt;br&gt;
  1009. You roam the halls of an abandoned mansion, a spectral figure. One night, you encounter him, a boy you once knew, now a ghost like you. In this eerie stillness, you both relive faded memories, each echo a reminder of lost love. The mansion, with its creaking floors and whispered secrets, becomes a haven for your melancholic reunion, a space where time stands still, and love endures, even in death.&lt;/p&gt;
  1010. &lt;/blockquote&gt;
  1011. &lt;h3 id=&quot;see-how-a-characteristic-varies-across-countries&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#see-how-a-characteristic-varies-across-countries&quot; aria-label=&quot;see how a characteristic varies across countries permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;See how a characteristic varies across countries&lt;/h3&gt;
  1012. &lt;blockquote&gt;
  1013. &lt;p&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;br&gt;
  1014. what is the sterotypical “poor person’s food” in different countries in europe?&lt;/p&gt;
  1015. &lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;
  1016. The concept of “poor person’s food” across different European countries often reflects inexpensive, easily accessible, and hearty ingredients. These foods, originally born out of necessity, have often become integral parts of national cuisines and are cherished for their simplicity and flavor. Here’s a look at some examples:&lt;/p&gt;
  1017. &lt;p&gt;Poland: Pierogi - These are dumplings made with simple ingredients like flour and water, traditionally filled with potatoes, cheese, or sauerkraut. They are a staple in Polish cuisine and were historically a popular, affordable food for the working class.&lt;/p&gt;
  1018. &lt;p&gt;Italy: Polenta - Once considered food for the poor, polenta, made from ground cornmeal, was a staple for those who couldn’t afford more expensive ingredients. It’s versatile and can be paired with various sauces and meats.&lt;/p&gt;
  1019. &lt;p&gt;Spain: Tortilla Española - A simple, filling dish made with inexpensive ingredients like eggs, potatoes, and onions. This dish originated as a cheap, filling meal for laborers and has become a beloved part of Spanish cuisine.&lt;/p&gt;
  1020. &lt;p&gt;United Kingdom: Bread and Butter Pudding - A dessert made from stale bread, milk, sugar, and eggs. It’s a classic example of British ingenuity in using leftover food to create something delicious.&lt;/p&gt;
  1021. &lt;p&gt;France: Ratatouille - Originating from Nice, ratatouille is a vegetable stew made with tomatoes, eggplant, zucchini, bell peppers, and onions. Historically, it was a way to use up leftover vegetables and was a common dish among the poor.&lt;/p&gt;
  1022. &lt;p&gt;Portugal: Caldo Verde - A simple soup made from potatoes, kale, and chorizo. It’s a traditional dish that was inexpensive to make and could feed many people.&lt;/p&gt;
  1023. &lt;p&gt;Germany: Kartoffelsuppe - Potato soup, often made with broth, potatoes, and vegetables. It’s a hearty, comforting dish that was historically easy and cheap to make.&lt;/p&gt;
  1024. &lt;p&gt;Greece: Fasolada - A bean soup often referred to as the “national food of the Greeks.” Made with white beans, olive oil, and vegetables, it’s a nutritious and economical meal.&lt;/p&gt;
  1025. &lt;p&gt;These dishes reflect the resourcefulness of people in times of scarcity, transforming simple, affordable ingredients into beloved national dishes. It’s interesting to note how many of these “poor man’s meals” have transcended their humble origins to become cherished culinary traditions.&lt;/p&gt;
  1026. &lt;/blockquote&gt;
  1027. &lt;h2 id=&quot;attribute-interpolation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#attribute-interpolation&quot; aria-label=&quot;attribute interpolation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Attribute interpolation&lt;/h2&gt;
  1028. &lt;p&gt;Another technique / metaphor I’ve hit on is &lt;em&gt;keyframe interpolation&lt;/em&gt;. If you’re familiar with animation or video editing software like After Effects, it’s what lets you do things like “fade to black”. This is done normally by placing a black background behind the video and then iterpolating the &lt;em&gt;opacity&lt;/em&gt; of the video from 100% to 0% across say two seconds.&lt;/p&gt;
  1029. &lt;p&gt;You can animate any attribute of videos — opacity, speed, contrast, etc. — many common editing tasks involves keyframe interpolation.&lt;/p&gt;
  1030. &lt;p&gt;It turns out you can do the exact same thing with our latent cameras, e.g. this prompt.&lt;/p&gt;
  1031. &lt;blockquote&gt;
  1032. &lt;p&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;/p&gt;
  1033. &lt;p&gt;Rewrite this statement from one friend to another interpolating from 100% happy to 100% sad in 10% increments (so rewrite the statement 10 times).&lt;/p&gt;
  1034. &lt;p&gt;I haven’t heard from you in a while&lt;/p&gt;
  1035. &lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;&lt;/p&gt;
  1036. &lt;p&gt;This task involves rewriting the statement “I haven’t heard from you in a while” in a way that gradually transitions from a completely happy tone to a completely sad one, in ten increments. Each version will represent a 10% shift in emotion from happy to sad.&lt;/p&gt;
  1037. &lt;p&gt;100% Happy (0% Sad): “Hey there! It’s been a moment since we last chatted, I hope you’re having an adventure out there!”&lt;/p&gt;
  1038. &lt;p&gt;90% Happy (10% Sad): “Hi! I’ve noticed it’s been a little while since we last caught up. Hope all is well and exciting in your world!”&lt;/p&gt;
  1039. &lt;p&gt;80% Happy (20% Sad): “Hello! It’s been some time since our last conversation. I’m missing our chats but I’m sure you’re busy with fun things!”&lt;/p&gt;
  1040. &lt;p&gt;70% Happy (30% Sad): “Hey, just realized it’s been quite a while since we last spoke. Hope you’re doing okay and finding some joy in your days.”&lt;/p&gt;
  1041. &lt;p&gt;60% Happy (40% Sad): “Hi, it’s been a significant amount of time since we’ve talked. I’m starting to miss our conversations, hope everything’s alright.”&lt;/p&gt;
  1042. &lt;p&gt;50% Happy (50% Sad): “Hello, I can’t help but notice it’s been quite long since we last connected. I hope you’re doing okay, I’m here if you need to talk.”&lt;/p&gt;
  1043. &lt;p&gt;40% Happy (60% Sad): “Hey, it’s been a while since we’ve spoken. I’m beginning to worry a bit, just hoping you’re in a good place.”&lt;/p&gt;
  1044. &lt;p&gt;30% Happy (70% Sad): “Hi, I’ve realized it’s been a really long time since our last conversation. I’m quite concerned, I hope you’re managing okay.”&lt;/p&gt;
  1045. &lt;p&gt;20% Happy (80% Sad): “Hello, it’s been too long since we last talked. I’m feeling quite sad about it, just hoping you’re safe and well.”&lt;/p&gt;
  1046. &lt;p&gt;10% Happy (90% Sad): “Hey, it’s been an incredibly long time since I’ve heard from you. I’m deeply worried and missing you a lot, hope you’re alright.”&lt;/p&gt;
  1047. &lt;p&gt;0% Happy (100% Sad): “It’s been such a long time since I’ve heard from you. I’m feeling really down about it, just wishing to know if you’re okay.”&lt;/p&gt;
  1048. &lt;p&gt;Each iteration reflects a subtle shift in emotional tone, representing the changing balance between happiness and sadness in the context of missing a friend.&lt;/p&gt;
  1049. &lt;/blockquote&gt;
  1050. &lt;p&gt;You can tell ChatGPT to interpolate literally anything. You can easily come up with some pretty bizarre and funny stuff by interpolating things out of their normal range e.g.&lt;/p&gt;
  1051. &lt;blockquote&gt;
  1052. &lt;p&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;/p&gt;
  1053. &lt;p&gt;Describe 3 times in a deft, wry, journalistic tone, using less than 40 words, a man using a shovel — gradually increasing the shovels length from 1 foot to 20 feet&lt;/p&gt;
  1054. &lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;&lt;/p&gt;
  1055. &lt;p&gt;“In a comical twist of DIY, local man tackles garden woes with a one-foot shovel, proving size isn’t everything – except in digging efficiency.”&lt;/p&gt;
  1056. &lt;p&gt;“Suburban spectacle: Man with 10-foot shovel attempts yard work, neighbors debate practicality versus sheer absurdity of his ‘innovative’ tool choice.”&lt;/p&gt;
  1057. &lt;p&gt;“Breaking: Man with 20-foot shovel turns heads, defies physics and common sense in backyard endeavor. Lawn care or performance art? Jury’s still out.”&lt;/p&gt;
  1058. &lt;/blockquote&gt;
  1059. &lt;p&gt;This is similar to the &lt;a href=&quot;https://knowyourmeme.com/memes/make-it-more-ai-trend&quot;&gt;“Make it more” meme&lt;/a&gt; that’s been going round.&lt;/p&gt;
  1060. &lt;p&gt;I think this idea of flying through a particular idea space is also the source of the enduring appeal of searching/browsing wikipedia, reddit threads, twitter, youtube, tiktok, Amazon reviews, etc. — to do a quick scan of some slice of humanity’s intelligence.&lt;/p&gt;
  1061. &lt;h2 id=&quot;a-change-of-perspective-is-worth-80-iq-points&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-change-of-perspective-is-worth-80-iq-points&quot; aria-label=&quot;a change of perspective is worth 80 iq points permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;“A change of perspective is worth 80 IQ points.”&lt;/h2&gt;
  1062. &lt;p&gt;Alan Kay’s famous quote gets at where this can get really valuable. Perhaps the most useful AI copilots will be ones that are continually helping us view a problem or set of concepts from different perspectives.&lt;/p&gt;
  1063. &lt;p&gt;Next time your’re faced with a problem, try writing a prompt that captures the problem and then identify all key attributes on which your perspective could vary on the subject and then ask the LLM to interpolate through all the possible perspectives.&lt;/p&gt;
  1064. &lt;p&gt;(Though &lt;a href=&quot;https://hitchhikers.fandom.com/wiki/Total_Perspective_Vortex&quot;&gt;Douglas Adams&lt;/a&gt; and &lt;a href=&quot;https://www.reddit.com/r/calvinandhobbes/comments/aw7k2x/neocubist/&quot;&gt;Bill Watterson&lt;/a&gt; would warn against trying to absorb &lt;em&gt;too&lt;/em&gt; many perspectives).&lt;/p&gt;
  1065. &lt;p&gt;This prompt does a pretty good job guiding you through this process:&lt;/p&gt;
  1066. &lt;blockquote&gt;
  1067. &lt;p&gt;The user is looking for additional perspective on a problem or idea. Your job is to take their description of what they’re thinking about and suggest 10 key attributes on which they might look for different perspectives on. Suggest those to them. Ask them to pick 3 of them. Take those 3 attributes and generate 9 new perspectives on the problem or idea by varying the different attributes they picked. Output for each nine how you changed the attribute(s) and then what’s different and what they might be able to learn from it.&lt;/p&gt;
  1068. &lt;p&gt;If the user doesn’t immediately provide the problem or idea, simply ask them to provide it.&lt;/p&gt;
  1069. &lt;/blockquote&gt;
  1070. &lt;p&gt;We’re all connected now to these bizarre but amazing databases of human intelligence. We might as well get good at them.&lt;/p&gt;
  1071. &lt;p&gt;Come up with an interesting prompt? I’d love to see it! Share it on &lt;a href=&quot;https://twitter.com/kylemathews/status/1737633927937085816&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;https://warpcast.com/~/conversations/0x1dd60ed3aede0ea704a365d16c624a6eac18bcdd&quot;&gt;Warpcast&lt;/a&gt;, or &lt;a href=&quot;https://bsky.app/profile/kam.bsky.social/post/3kgzdnes4j22x&quot;&gt;Bluesky&lt;/a&gt;.&lt;/p&gt;
  1072. &lt;p&gt;&lt;span
  1073.      class=&quot;gatsby-resp-image-wrapper&quot;
  1074.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1075.    &gt;
  1076.      &lt;a
  1077.    class=&quot;gatsby-resp-image-link&quot;
  1078.    href=&quot;/static/6966469b9dd634727718d48b2027544d/a9a89/llm-organic-database.webp&quot;
  1079.    style=&quot;display: block&quot;
  1080.    target=&quot;_blank&quot;
  1081.    rel=&quot;noopener&quot;
  1082.  &gt;
  1083.    &lt;span
  1084.    class=&quot;gatsby-resp-image-background-image&quot;
  1085.    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/webp;base64,UklGRswAAABXRUJQVlA4IMAAAABQBQCdASoUABQAPtFYpUyoJSOiKA1RABoJYgCdMt8lsArlihP9v0d2bjX1f2JykNZWKoAA/pBYac7RWvnMB1rJB/TmePhw1+FK5Zs4oL0+GorNN0GESDOaP1rYRxfVnkM4UqK0Pwj87UzlvwZnmy/JeDc9uea4EakQdjuZPNQvbZLfPfjbl4njysgNZiRCeF1Fsjt7NXqeueBQh0KufFRwQxpmfA4YADARWXnuzC/C26boyuDrjEezFPiBFg9AAAA=&apos;); background-size: cover; display: block;&quot;
  1086.  &gt;&lt;/span&gt;
  1087.  &lt;img
  1088.        class=&quot;gatsby-resp-image-image&quot;
  1089.        alt=&quot;LLM organic database&quot;
  1090.        title=&quot;&quot;
  1091.        src=&quot;/static/6966469b9dd634727718d48b2027544d/5ca24/llm-organic-database.webp&quot;
  1092.        srcset=&quot;/static/6966469b9dd634727718d48b2027544d/cbe2e/llm-organic-database.webp 148w,
  1093. /static/6966469b9dd634727718d48b2027544d/3084c/llm-organic-database.webp 295w,
  1094. /static/6966469b9dd634727718d48b2027544d/5ca24/llm-organic-database.webp 590w,
  1095. /static/6966469b9dd634727718d48b2027544d/dad35/llm-organic-database.webp 885w,
  1096. /static/6966469b9dd634727718d48b2027544d/a9a89/llm-organic-database.webp 1024w&quot;
  1097.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1098.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1099.        loading=&quot;lazy&quot;
  1100.        decoding=&quot;async&quot;
  1101.      /&gt;
  1102.  &lt;/a&gt;
  1103.    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Build Notes: Creating a Local-First, AI-powered YouTube Summarizer]]></title><description><![CDATA[My wife and I have been working on a side project for a while — an AI-powered tool that summarizes YouTube videos. This tool was highly…]]></description><link>https://bricolage.io/build-notes-ai-powered-youtube-summarizer/</link><guid isPermaLink="false">https://bricolage.io/build-notes-ai-powered-youtube-summarizer/</guid><pubDate>Wed, 13 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My wife and I have been working on a side project for a while — an AI-powered tool that summarizes YouTube videos.&lt;/p&gt;
  1104. &lt;p&gt;This tool was highly inspired by &lt;a href=&quot;https://www.summarize.tech/&quot;&gt;https://www.summarize.tech/&lt;/a&gt; — which I used a lot before building my own — so thanks Pete Hunt!&lt;/p&gt;
  1105. &lt;p&gt;I’m much more of a reader than video watcher so tools like this are perfect when I run across an interesting looking YouTube video. I might still end up watching but the video summary at least quickly satisfies my curiousity.&lt;/p&gt;
  1106. &lt;p&gt;&lt;span
  1107.      class=&quot;gatsby-resp-image-wrapper&quot;
  1108.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1109.    &gt;
  1110.      &lt;a
  1111.    class=&quot;gatsby-resp-image-link&quot;
  1112.    href=&quot;/static/155807463c86f04ae569863d15860dbd/e6c84/screenshot.png&quot;
  1113.    style=&quot;display: block&quot;
  1114.    target=&quot;_blank&quot;
  1115.    rel=&quot;noopener&quot;
  1116.  &gt;
  1117.    &lt;span
  1118.    class=&quot;gatsby-resp-image-background-image&quot;
  1119.    style=&quot;padding-bottom: 110.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACvklEQVR42p1Uy3LaQBDU9/vsg6tcvvroj/DZMSSAUGRASIiXkEAvEO/O9LqGCBdJVbJVXbOzO9s70zuShdo4n8/GrlYrvL6+YjqdotfrwXVdpGkK27bR7XbNWhzHV2d0WPVFtcvlEvf393h4eMDT05OxLy8veHx8xPPzM+7u7vD29mZiT6fTFan1NbvD4WCC9vs9ttstdrudWauqCsfj0fhc59rNDAeDgSnF8zxTGm2r1TbzesmM6/f7aDabxv/4+IDjOGg0GsbXC6zRKEDgD2Wzi3A0EpIJ7E4HnXZbDrnwhx6CwEdbfBJ0ZI9km80GeZ4bvdfr9e8MPT/Ee9tBzwswXawQTiO8t2zxffSGI3y3f8LteZLpZ0Yk0Ae5Naxye0JcHLEsBcUJq2KHWOZ5dUa6OSETVLvzVSf8CZ8a5hmcNIFf5GgtFxgWGdx0CWeVoJ+n+J5ESHdb3GqvmxkGSYIfkxCDaI6m6OmIhpx3JmN4UWTWxhJTiF5ZlhndaIuiuLIEL7Ki2Qz+wEMm2lSyuRGUeYF1WWIt86oosZE5G5ughgQJaEvZ0zVDyH4r5SB7zJRzwfky/5dh2aJVI1mgGUf4Fs1QHQ8X4v8ZliuN/C6N7YpWsfTTXhqU2R6+2L/NFYYwkZ4aS0MTc9GTXwcxHo8xn88xmUwQhiFmshcEwcUnNI6WsfwsLYpJJ5IX5SHaOpkG61yJCMYSI0mGlg1vJdISvJkkBDd5iFZ9HlbLPa6TwPf9q2oog0VnOBxelcEfBEESZs0YWiWrEzGG2TOe1VpMU7MjuMnbmDUJ6Kt2WgnJtQK9hJZ9agg1kLfydgbrmmbAKpSEqD+QSsGvyOLfWTdUC82CdrFYmH3NnNrpA3FOYn1Mto55FBVZb+dBQl+z3kokUz3rOvIvbvpQb1EdeEDL19I1Q0Jf+2tj6+/rFyGidkunqj+aAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  1120.  &gt;&lt;/span&gt;
  1121.  &lt;img
  1122.        class=&quot;gatsby-resp-image-image&quot;
  1123.        alt=&quot;Screenshot of the Samurize app&quot;
  1124.        title=&quot;&quot;
  1125.        src=&quot;/static/155807463c86f04ae569863d15860dbd/fcda8/screenshot.png&quot;
  1126.        srcset=&quot;/static/155807463c86f04ae569863d15860dbd/12f09/screenshot.png 148w,
  1127. /static/155807463c86f04ae569863d15860dbd/e4a3f/screenshot.png 295w,
  1128. /static/155807463c86f04ae569863d15860dbd/fcda8/screenshot.png 590w,
  1129. /static/155807463c86f04ae569863d15860dbd/efc66/screenshot.png 885w,
  1130. /static/155807463c86f04ae569863d15860dbd/e6c84/screenshot.png 1148w&quot;
  1131.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1132.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1133.        loading=&quot;lazy&quot;
  1134.        decoding=&quot;async&quot;
  1135.      /&gt;
  1136.  &lt;/a&gt;
  1137.    &lt;/span&gt;&lt;/p&gt;
  1138. &lt;p&gt;This was also an excuse to build something with LLMs and Local-First tools (&lt;a href=&quot;https://electric-sql.com/&quot;&gt;ElectricSQL&lt;/a&gt; in this case). If you’re new to &lt;a href=&quot;https://bricolage.io/some-notes-on-local-first-development/&quot;&gt;Local-First — check out my explainer post from a few months ago&lt;/a&gt;.&lt;/p&gt;
  1139. &lt;p&gt;Check it out at &lt;a href=&quot;https://samurize.shannon-soper.com&quot;&gt;https://samurize.shannon-soper.com&lt;/a&gt; and then read on for some build notes.&lt;/p&gt;
  1140. &lt;h3 id=&quot;table-of-contents&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#table-of-contents&quot; aria-label=&quot;table of contents permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Table of Contents&lt;/h3&gt;
  1141. &lt;div class=&quot;toc&quot;&gt;
  1142. &lt;ul&gt;
  1143. &lt;li&gt;
  1144. &lt;p&gt;&lt;a href=&quot;#lazy-syncing-and-pre-running-route-queries-for-fast--smooth-route-transitions&quot;&gt;Lazy syncing and pre-running route queries for fast &amp;#x26; smooth route transitions&lt;/a&gt;&lt;/p&gt;
  1145. &lt;ul&gt;
  1146. &lt;li&gt;&lt;a href=&quot;#route-syncing&quot;&gt;Route Syncing&lt;/a&gt;&lt;/li&gt;
  1147. &lt;li&gt;&lt;a href=&quot;#pre-running-queries&quot;&gt;Pre-running queries&lt;/a&gt;&lt;/li&gt;
  1148. &lt;li&gt;&lt;a href=&quot;#glitchy-transition&quot;&gt;Glitchy transition&lt;/a&gt;&lt;/li&gt;
  1149. &lt;li&gt;&lt;a href=&quot;#smooth-transition&quot;&gt;Smooth transition&lt;/a&gt;&lt;/li&gt;
  1150. &lt;/ul&gt;
  1151. &lt;/li&gt;
  1152. &lt;li&gt;
  1153. &lt;p&gt;&lt;a href=&quot;#llmai-summarization-stuff&quot;&gt;LLM/AI Summarization stuff&lt;/a&gt;&lt;/p&gt;
  1154. &lt;/li&gt;
  1155. &lt;li&gt;
  1156. &lt;p&gt;&lt;a href=&quot;#real-timey-bits&quot;&gt;Real-timey bits&lt;/a&gt;&lt;/p&gt;
  1157. &lt;/li&gt;
  1158. &lt;li&gt;
  1159. &lt;p&gt;&lt;a href=&quot;#deployment&quot;&gt;Deployment&lt;/a&gt;&lt;/p&gt;
  1160. &lt;/li&gt;
  1161. &lt;/ul&gt;
  1162. &lt;/div&gt;
  1163. &lt;h2 id=&quot;lazy-syncing-and-pre-running-route-queries-for-fast--smooth-route-transitions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lazy-syncing-and-pre-running-route-queries-for-fast--smooth-route-transitions&quot; aria-label=&quot;lazy syncing and pre running route queries for fast  smooth route transitions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lazy syncing and pre-running route queries for fast &amp;#x26; smooth route transitions&lt;/h2&gt;
  1164. &lt;p&gt;ElectricSQL syncs data between a backend Postgres database and client SQLite databases. Instead of loading route data through a backend API, you just run reactive SQL queries against the local database!&lt;/p&gt;
  1165. &lt;p&gt;Which is awesome! I love having the full power of SQL to query data + built-in reactivity for real-time updates. It’s really everything I’ve ever wanted for client-side data.&lt;/p&gt;
  1166. &lt;p&gt;But there’s two issues before your reactive queries can go to work. First is ensuring the data you want to query is synced. And the second is pre-running the query so the new route can immediately render.&lt;/p&gt;
  1167. &lt;h3 id=&quot;route-syncing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#route-syncing&quot; aria-label=&quot;route syncing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Route Syncing&lt;/h3&gt;
  1168. &lt;p&gt;The simplest way to build a local-first app is to just sync upfront all data but this gets slow as the data size grows. So just like with code splitting, you can split data syncing along route boundaries so the user waits for only the minimal amount of data to be synced.&lt;/p&gt;
  1169. &lt;p&gt;It’d be really rare to want an entire database synced to each client. So instead you can specify which tables and even which subsets of tables — e.g. only load the latest 10 notifications.&lt;/p&gt;
  1170. &lt;p&gt;ElectricSQL has this concept of “&lt;a href=&quot;https://electric-sql.com/docs/usage/data-access/shapes&quot;&gt;Shapes&lt;/a&gt;” — which let you declare the shape of data you want synced to construct a particular route’s UI. It’s basically the declarative equivalent of making an API call (an imperative operation). Instead of saying “fetch this shape of data”, you say “sync this shape of data”. You get the same initial load but ElectricSQL also ensures any updates across the system continue to get synced to you in real-time.&lt;/p&gt;
  1171. &lt;p&gt;Shapes is very similar to code splitting in some ways. Small apps can easily load all code in one go but as apps get larger, splitting up code loading (often by route) becomes increasingly necessary. Same with data - many apps have only a mb or two total of data so easily could sync all data up front. But the largest apps effectively have unbounded data sets so “data spitting” is necessary. One big advantage of data over code however is that the data on the client is at rest mostly and not in RAM. Browsers these days allow apps to load GBs of data and SQLite makes it efficient to query against that.&lt;/p&gt;
  1172. &lt;p&gt;This switch to declarative syncing is basically jQuery -&gt; React again — jQuery made you push the DOM around and add event listeners, etc. — work we don’t have to do with React and other new reactive JS frameworks. And in the same sense, sync engines like ElectricSQL give you a real-time reactive data system for your entire stack. Your client can declare the data it needs and ElectricSQL makes it so.&lt;/p&gt;
  1173. &lt;p&gt;So shapes are great but the next question is where to put them. The route loader function (in React Router) seems to me the obvious place and what I did with Samurize.&lt;/p&gt;
  1174. &lt;p&gt;I &lt;a href=&quot;https://github.com/electric-sql/electric/discussions/704&quot;&gt;proposed a &lt;code class=&quot;language-text&quot;&gt;SyncManager&lt;/code&gt; API for this to ElectricSQL&lt;/a&gt; that looks like:&lt;/p&gt;
  1175. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1176.  path&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/video/:videoId&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1177.  element&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Video &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1178.  &lt;span class=&quot;token function-variable function&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; params &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1179.    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; syncManager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  1180.      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1181.        &lt;span class=&quot;token function-variable function&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  1182.          db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;users&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1183.            where&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1184.          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1185.        &lt;span class=&quot;token function-variable function&quot;&gt;isDone&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shapeMetatdata&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  1186.          &lt;span class=&quot;token comment&quot;&gt;// Allow data that&apos;s up to 12 hours stale.&lt;/span&gt;
  1187.          shapeMetadata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;msSinceLastSynced &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
  1188.          shapeMetadata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;SYNCED&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1189.      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1190.      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1191.        &lt;span class=&quot;token function-variable function&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  1192.          db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;youtube_videos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1193.            where&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;video_id &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1194.          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1195.        &lt;span class=&quot;token function-variable function&quot;&gt;isDone&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shapeMetatdata&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  1196.          &lt;span class=&quot;token comment&quot;&gt;// Allow data that&apos;s up to 12 hours stale.&lt;/span&gt;
  1197.          shapeMetadata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;msSinceLastSynced &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
  1198.          shapeMetadata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;SYNCED&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1199.      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1200.    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1201.    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;
  1202.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1203. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  1204. &lt;p&gt;As these are all functions, you could reuse common shapes across routes e.g. user and org data. You can also flexibly say what “done” is—e.g. for some routes, somewhat stale data is fine, so don’t wait on loading for the freshest data to be loaded from the server.&lt;/p&gt;
  1205. &lt;p&gt;One big current caveat to all this is that ElectricSQL is still working on shipping Shapes as of December 2023. So currently Samurize syncs all video data to each client as you can’t yet say “only sync videos that I’m looking at”. Once that arrives, Samurize will be able to lazily sync data as needed making this approach suitable for however many videos people summarize.&lt;/p&gt;
  1206. &lt;h3 id=&quot;pre-running-queries&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pre-running-queries&quot; aria-label=&quot;pre running queries permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pre-running queries&lt;/h3&gt;
  1207. &lt;p&gt;The other problem I ran into is that while local SQLite queries run very fast, they are async and take a bit of time, so on transitioning to a route, there’s some number of frames where nothing renders. So while fast, it causes a very noticeable blink in the UI.&lt;/p&gt;
  1208. &lt;p&gt;I fixed that by running each routes’ queries in the loader function, storing those in a cache, and then using the pre-run query results until the reactive live queries start running.&lt;/p&gt;
  1209. &lt;p&gt;The difference is stark:&lt;/p&gt;
  1210. &lt;h3 id=&quot;glitchy-transition&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#glitchy-transition&quot; aria-label=&quot;glitchy transition permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Glitchy transition&lt;/h3&gt;
  1211. &lt;video controls width=&quot;100%&quot;&gt;
  1212.  &lt;source src=&quot;/3abbe22ff208e903b8135226e79dc080/glitchy-route-transition.mp4&quot; type=&quot;video/mp4&quot; /&gt;
  1213. &lt;/video&gt;
  1214. &lt;h3 id=&quot;smooth-transition&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#smooth-transition&quot; aria-label=&quot;smooth transition permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Smooth transition&lt;/h3&gt;
  1215. &lt;video controls width=&quot;100%&quot;&gt;
  1216.  &lt;source src=&quot;/c6b7b872cba02b477ed8f9e944b80f61/smooth-route-transition.mp4&quot; type=&quot;video/mp4&quot; /&gt;
  1217. &lt;/video&gt;
  1218. &lt;p&gt;It wasn’t much code but I think it’s a critical pattern to follow so I’ll be pulling it out into its own library very soon.&lt;/p&gt;
  1219. &lt;p&gt;Another approach to this problem is making queries sync. &lt;a href=&quot;https://riffle.systems/&quot;&gt;Riffle&lt;/a&gt; explores this approach (soon to be open sourced). Sync queries mean that the first render of the component would have all the data it needs. This comes with the tradeoff of having SQLite running in the UI thread (vs. a worker) and with all data in memory (vs on disk in IndexedDb or OPFS).&lt;/p&gt;
  1220. &lt;p&gt;Pre-running queries is similar to how people use tools like &lt;a href=&quot;https://tanstack.com/router/v1/docs/guide/external-data-loading#a-more-realistic-example-using-tanstack-query&quot;&gt;TanStack Query&lt;/a&gt; — where they prefetch in the loader to warm the cache so the query hook in the route component can respond immediately.&lt;/p&gt;
  1221. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre class=&quot;language-tsx&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Route &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@tanstack/react-router&apos;&lt;/span&gt;
  1222.  
  1223. &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; postsQueryOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;queryOptions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1224.  queryKey&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;posts&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1225.  &lt;span class=&quot;token function-variable function&quot;&gt;queryFn&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; fetchPosts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1226. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1227.  
  1228. &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; postsRoute &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Route&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1229.  &lt;span class=&quot;token function-variable function&quot;&gt;getParentPath&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; rootRoute&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1230.  path&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;posts&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1231.  &lt;span class=&quot;token comment&quot;&gt;// Use the `loader` option to ensure that the data is loaded&lt;/span&gt;
  1232.  &lt;span class=&quot;token function-variable function&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; queryClient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ensureQueryData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postsQueryOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1233.  &lt;span class=&quot;token function-variable function&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1234.    &lt;span class=&quot;token comment&quot;&gt;// Read the data from the cache and subscribe to updates&lt;/span&gt;
  1235.    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; posts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useSuspenseQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postsQueryOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1236.  
  1237.    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  1238.      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  1239.        &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;posts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  1240.          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Post&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  1241.        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  1242.      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  1243.    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1244.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1245. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  1246. &lt;h2 id=&quot;llmai-summarization-stuff&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#llmai-summarization-stuff&quot; aria-label=&quot;llmai summarization stuff permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LLM/AI Summarization stuff&lt;/h2&gt;
  1247. &lt;p&gt;The AI bits are pretty standard so I won’t spend a lot of time on them.&lt;/p&gt;
  1248. &lt;p&gt;When a new video is submitted, it’s pushed to a node.js backend which fetches video metadata including the transcript. The transcript is then summarized using the map/reduce technique. Basically I split longer videos into five minute segments, summarize each segment and then summarize together the segments. This handles transcripts that are longer than token limits but also conveniently gives the user both an overall summary plus more detailed summaries about each segment of the video. Often I’ll only read the overall summary but sometimes I want to learn more so open the more detailed summaries.&lt;/p&gt;
  1249. &lt;p&gt;I started prototyping this with OpenAI’s GPT 3.5 model but got frustrated as response times were highly variable. Sometimes I’d wait as long as 45-60 seconds for a summarization to finish. With that speed, I might as well just skim through the video! So I went looking for other options and found &lt;a href=&quot;https://blog.perplexity.ai/blog/introducing-pplx-api&quot;&gt;Perplexity.ai’s new LLM API&lt;/a&gt; which hosts a number of open source models. I tested them all and Mistral 7B was very fast (5-10 seconds!) &amp;#x26; acceptably good at summarization so switched over.&lt;/p&gt;
  1250. &lt;p&gt;Even basic LLMs are already good enough at many tasks so I think many workloads will keep shifting to whatever is fastest/cheapest.&lt;/p&gt;
  1251. &lt;h2 id=&quot;real-timey-bits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#real-timey-bits&quot; aria-label=&quot;real timey bits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Real-timey bits&lt;/h2&gt;
  1252. &lt;p&gt;This was a pretty stock standard app. The only thing I did which really took advantage of ElectricSQL superpowers was the progress bar for indicating progress of the summarization.&lt;/p&gt;
  1253. &lt;video controls width=&quot;100%&quot;&gt;
  1254.  &lt;source src=&quot;/f74c9b80f4007bdcc218da8c8df2bce1/progress-bar.mp4&quot; type=&quot;video/mp4&quot; /&gt;
  1255. &lt;/video&gt;
  1256. &lt;p&gt;As ElectricSQL gives you a full-stack reactive data layer for free — it was quite easy. A progress bar is just a value between 0 &amp;#x26; 1, i.e., what percentage of the work has been done. The question for this sort of long-running job is how to get that value from the backend doing the work to the frontend for the user to see. Normally it’d be some sort of string and glue hacky setup where the backend pushes events over websockets which the client code then has custom code to intercept and direct to the component through a global data store of some sort.&lt;/p&gt;
  1257. &lt;p&gt;But none of that here. I have a &lt;code class=&quot;language-text&quot;&gt;youtube_video&lt;/code&gt; table for each video which has a &lt;code class=&quot;language-text&quot;&gt;progress&lt;/code&gt; column. The backend just keeps writing new values to that as summarization calls finish, and the new value is synced directly into the Video component.&lt;/p&gt;
  1258. &lt;p&gt;This is what the code looks like:&lt;/p&gt;
  1259. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;tsx&quot;&gt;&lt;pre class=&quot;language-tsx&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; video &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useLiveQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;youtube_videos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;liveUnique&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1260.  select&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1261.    title&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1262.    author_url&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1263.    author_name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1264.    progress&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1265.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1266.  where&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1267. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  1268. &lt;p&gt;The component just &lt;a href=&quot;https://github.com/KyleAMathews/samurize/blob/959e9e0c44aa1a5215888411e06eda12938e7f56/src/routes/video.tsx#L119-L141&quot;&gt;checks if &lt;code class=&quot;language-text&quot;&gt;video.progress !== 1&lt;/code&gt; to see if it should display a progress bar or not.&lt;/a&gt;&lt;/p&gt;
  1269. &lt;p&gt;There was no custom code to set this up. Just global reactive state.&lt;/p&gt;
  1270. &lt;h2 id=&quot;deployment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deployment&quot; aria-label=&quot;deployment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deployment&lt;/h2&gt;
  1271. &lt;p&gt;This was my first time deploying Electric so it took some experimentation and research to decide on a solution.&lt;/p&gt;
  1272. &lt;p&gt;An ElectricSQL app has three components&lt;/p&gt;
  1273. &lt;ul&gt;
  1274. &lt;li&gt;The client — which works the same as any other web/mobile app — I used React/react-router and am hosting on Vercel.&lt;/li&gt;
  1275. &lt;li&gt;Postgres — any of the 1000s of Postgres hosting options (as long as it supports Logical Replication)&lt;/li&gt;
  1276. &lt;li&gt;The Electric sync service — it runs anywhere Docker runs and the Samurize instance is currently using ~325 MB of ram.&lt;/li&gt;
  1277. &lt;/ul&gt;
  1278. &lt;p&gt;Postgres hosting gives you a lot of nice things like backups and a dashboard. But for a side project like this, I don’t care about losing data really, and psql works for a dashboard. So I got a DigitalOcean VM and created a Docker Compose file with containers for Postgres and Electric. I needed a way to terminate SSL for an encrypted websocket connection and after looking at Nginx and Caddy, decided on Caddy as it’s extremely easy to use — you just tell it what domain it’s handling and it automatically gets an SSL cert from Let’s Encrypt. Ngnix works well too but it’s much more manual to get certs. I was pleasantly surprised to see Caddy is only using ~13 MB of ram w/ my extremely low traffic side project.&lt;/p&gt;
  1279. &lt;p&gt;&lt;a href=&quot;https://github.com/KyleAMathews/samurize/blob/main/src/backend/compose/docker-compose-prod.yaml&quot;&gt;Check out the Docker Compose file&lt;/a&gt;.&lt;/p&gt;
  1280. &lt;p&gt;The backend Node.js process I run on the same VM with PM2. It’s not actually exposed to the world as it’s just listening for new inserts in the database to do the LLM work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Build Notes: Creating a Local First Vite/React/ElectricSQL Starter]]></title><description><![CDATA[I was thinking last night about the new starter I released — that in the past, I’d do a short Twitter thread dumping out the various…]]></description><link>https://bricolage.io/build-notes-electric-sql-starter/</link><guid isPermaLink="false">https://bricolage.io/build-notes-electric-sql-starter/</guid><pubDate>Wed, 15 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I was thinking last night about &lt;a href=&quot;https://github.com/KyleAMathews/vite-react-router-electric-sql-starter&quot;&gt;the new starter I released&lt;/a&gt; — that in the past, I’d do a short Twitter thread dumping out the various observations I made to myself during the project. But now, with Twitter but a shadow of its former self (at least when it comes to tech discussions), it seems less enticing to do that. So back to the original blogging platform pre-micro-blogging (who remembers that term haha).&lt;/p&gt;
  1281. &lt;p&gt;So here’s my blogged Tweet thread:&lt;/p&gt;
  1282. &lt;ul&gt;
  1283. &lt;li&gt;The DX felt impeccable. I like React.js as much as I did back at the beginning. Vite has HMR at faster than the speed of thought. React Router is subtle and smooth and anticipates all my needs. And ElectricSQL really completes the story.&lt;/li&gt;
  1284. &lt;li&gt;I chatted yesterday with a systems programmer type person who’s also lately doing some frontend work. I remarked that frontend feels a bit like designing/playing a game as you’re creating interactions and visual layouts and constantly clicking around on things to test stuff. Adds some fun to the problem solving that I miss when I’m doing more backend/systems work.&lt;/li&gt;
  1285. &lt;li&gt;I love programming from my schema out. Design the schema and then figure out everything else. ElectricSQL’s database-centric approach means you first design your tables and then start writing UI code.&lt;/li&gt;
  1286. &lt;li&gt;Without ElectricSQL that’d be somewhat tedious as you create the tables &amp;#x26; then have to write a bunch of glue API code, etc. — often I just skip that and do everything in the browser until patterns are settled. But because sync engines let you skip the API entirely, you just define your tables and that’s it. You have a client library in your frontend code that you can immediately start reading/writing.&lt;/li&gt;
  1287. &lt;li&gt;A huge benefit of ElectricSQL’s use of Postgres and SQLite is there’s already a lot of great tooling and docs out there I can rely on. Googling/ChatGPT answered all my random questions with ease. As they like to put it, ElectricSQL isn’t a new database, it’s just a sync engine.&lt;/li&gt;
  1288. &lt;li&gt;There’s been &lt;a href=&quot;/some-notes-on-local-first-development/&quot;&gt;great quantities of ink spilled on the benefits of local-first/sync engines&lt;/a&gt; e.g. super fast UIs as all writes happen locally, built-in real-time cross-tab/browser/device sync, easy multiplayer, etc. But it is still pretty remarkable to feel. I mostly focused on figuring out the DX story for the starter but it was still really fun to open the app in another browser at one point and see all the changes syncing seamlessly in the background. I like free stuff. I didn’t &lt;em&gt;need&lt;/em&gt; real-time sync per se but it’s really nice to have for free.&lt;/li&gt;
  1289. &lt;li&gt;The starter is more-or-less the Vite react-ts starter w/ React Router &amp;#x26; ElectricSQL added. I also ported the React Router tutorial app to use ElectricSQL — which was good practice puzzling over how to reconcile normal server-centric Form handling with local-first.&lt;/li&gt;
  1290. &lt;li&gt;It was interesting puzzling through the data access layer — ElectricSQL’s query hook, &lt;code class=&quot;language-text&quot;&gt;useLiveQuery&lt;/code&gt; is very nice and exactly what you want but writing mutations felt a bit odd. I poked around at &lt;a href=&quot;https://tanstack.com/query/v4/docs/react/guides/mutations&quot;&gt;TanStack Mutations&lt;/a&gt; and really liked their mutation hook — especially how they systematize handling side effects — which I find always one of the trickiest and most important parts of your app to get right. I don’t think their hook makes sense as is in a local-first context as it’s focused on consuming server APIs but a port for local-first would be sweet. I might tackle that soon.&lt;/li&gt;
  1291. &lt;/ul&gt;
  1292. &lt;p&gt;There you go. I might do more of these.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Announcing trpc-crdt]]></title><description><![CDATA[Since my last blog post on local-first and CRDTs two months ago, I’ve continued to explore the possibilities around systems that colocate…]]></description><link>https://bricolage.io/announcing-trpc-crdt/</link><guid isPermaLink="false">https://bricolage.io/announcing-trpc-crdt/</guid><pubDate>Fri, 10 Nov 2023 18:59:39 GMT</pubDate><content:encoded>&lt;p&gt;Since &lt;a href=&quot;https://bricolage.io/some-notes-on-local-first-development/&quot;&gt;my last blog post on local-first&lt;/a&gt; and CRDTs two months ago, I’ve continued to explore the possibilities around systems that colocate code with subsets of data, interconnected by sync engines.&lt;/p&gt;
  1293. &lt;p&gt;I’ve been working on a set of libraries that let you run RPC calls to server functions over different CRDT libraries — powered by the wonderful &lt;a href=&quot;https://trpc.io/&quot;&gt;tRPC library&lt;/a&gt;.&lt;/p&gt;
  1294. &lt;p&gt;Now available on NPM:&lt;/p&gt;
  1295. &lt;ul&gt;
  1296. &lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;trpc-yjs&lt;/code&gt; for &lt;a href=&quot;https://yjs.dev/&quot;&gt;Yjs&lt;/a&gt;&lt;/li&gt;
  1297. &lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;trpc-electric-sql&lt;/code&gt; for &lt;a href=&quot;https://electric-sql.com/&quot;&gt;ElectricSQL&lt;/a&gt;&lt;/li&gt;
  1298. &lt;/ul&gt;
  1299. &lt;p&gt;I’m working with members of the &lt;a href=&quot;https://jazz.tools/&quot;&gt;Jazz&lt;/a&gt; and &lt;a href=&quot;https://automerge.org/&quot;&gt;Automerge&lt;/a&gt; communities to finish up libraries for those systems. Other CRDT library maintainers, please jump in!&lt;/p&gt;
  1300. &lt;p&gt;All code can be found at &lt;a href=&quot;https://github.com/KyleAMathews/trpc-crdt&quot;&gt;https://github.com/KyleAMathews/trpc-crdt&lt;/a&gt;&lt;/p&gt;
  1301. &lt;h2 id=&quot;why-build-applications-with-crdts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-build-applications-with-crdts&quot; aria-label=&quot;why build applications with crdts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why build applications with CRDTs?&lt;/h2&gt;
  1302. &lt;p&gt;These libraries probably only make sense if you’re already building an application with CRDTs, so let me quickly recap the argument for “why CRDTs”.&lt;/p&gt;
  1303. &lt;p&gt;CRDTs enable local-first style development — local-first is a software architecture which shifts reads/writes to an embedded database in each client. Local writes are replicated between clients by a Sync Engine.&lt;/p&gt;
  1304. &lt;p&gt;The benefits are multiple:&lt;/p&gt;
  1305. &lt;ul&gt;
  1306. &lt;li&gt;Simplified state management for developers&lt;/li&gt;
  1307. &lt;li&gt;Built-in support for real-time sync, offline usage, and multiplayer collaborative features&lt;/li&gt;
  1308. &lt;li&gt;Faster (60 FPS) CRUD&lt;/li&gt;
  1309. &lt;li&gt;More robust applications for end-users&lt;/li&gt;
  1310. &lt;/ul&gt;
  1311. &lt;p&gt;Ok, so CRDTs are nice — but why trpc-crdt?&lt;/p&gt;
  1312. &lt;p&gt;Given CRDTs/local-first are so client-centric, I’ll first make the, probably obvious, arguments for why running code on a server is often necessary. Followed by my explanation of the, perhaps not so obvious, rationale for using a CRDT as the transport layer for RPC calls from client to servers (at least when building an application with a CRDT).&lt;/p&gt;
  1313. &lt;h2 id=&quot;sometimes-you-just-need-a-server&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sometimes-you-just-need-a-server&quot; aria-label=&quot;sometimes you just need a server permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sometimes you just need a server&lt;/h2&gt;
  1314. &lt;p&gt;In &lt;a href=&quot;https://bricolage.io/some-notes-on-local-first-development/&quot;&gt;my last blog post on local-first&lt;/a&gt;, I wrote that while local-first tech allows far more reads and writes to happen on the client, you still often need to run code on a server.&lt;/p&gt;
  1315. &lt;p&gt;This can happen because:&lt;/p&gt;
  1316. &lt;ul&gt;
  1317. &lt;li&gt;An optimistic client mutation isn’t safe — CRDTs make optimistic client mutations far safer than normal but an authoritative server is still often needed for:
  1318. &lt;ul&gt;
  1319. &lt;li&gt;mutations that need complex or secure validation (e.g. money transfer)&lt;/li&gt;
  1320. &lt;li&gt;mutations that include writes to external systems that must be completed in the same transaction e.g. writes to a 3rd party API&lt;/li&gt;
  1321. &lt;li&gt;mutations to complex data that’s not easily expressed in CRDTs&lt;/li&gt;
  1322. &lt;/ul&gt;
  1323. &lt;/li&gt;
  1324. &lt;li&gt;Only the server can run the code as the code:
  1325. &lt;ul&gt;
  1326. &lt;li&gt;needs more compute resources than the client has&lt;/li&gt;
  1327. &lt;li&gt;is an ongoing background processes&lt;/li&gt;
  1328. &lt;li&gt;is written in a language other than JS (WASM is changing this)&lt;/li&gt;
  1329. &lt;/ul&gt;
  1330. &lt;/li&gt;
  1331. &lt;/ul&gt;
  1332. &lt;p&gt;In the post, I wrote about a pattern to solve this with a &lt;a href=&quot;https://bricolage.io/some-notes-on-local-first-development/#using-a-distributed-state-machine-to-handle-complex-writes&quot;&gt;“distributed state machine” running across client and server&lt;/a&gt; — where the server is just another node in the network but with super powers. I outlined the mechanics and suggested the pattern could be wrapped up in a simple RPC library.&lt;/p&gt;
  1333. &lt;h2 id=&quot;but-why-do-server-authoritative-calls-over-a-crdt&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#but-why-do-server-authoritative-calls-over-a-crdt&quot; aria-label=&quot;but why do server authoritative calls over a crdt permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But why do server authoritative calls over a CRDT?&lt;/h2&gt;
  1334. &lt;p&gt;About now, you might be wondering “why do this distributed state machine thing when we already have perfectly good ways to run code on a server e.g. REST/GraphQL) APIs?”&lt;/p&gt;
  1335. &lt;p&gt;They work, but there are some interesting advantages to keeping everything in CRDT-land:&lt;/p&gt;
  1336. &lt;ul&gt;
  1337. &lt;li&gt;No need for client-side state invalidation/refetching after server writes. The server handling the mutation writes mutations directly to the CRDT meaning all server mutations are pushed immediately to all clients. Data across your component tree will be updated simultaneously along with your UI — this solves neatly a major pain point with normal API mutations!&lt;/li&gt;
  1338. &lt;li&gt;RPC calls get all the benefits of of CRDTs:
  1339. &lt;ul&gt;
  1340. &lt;li&gt;server calls over CRDTs are resilient to network glitches with guaranteed exactly-once delivery. No need to add retry logic to your calls.&lt;/li&gt;
  1341. &lt;li&gt;RPC calls are now replicated (if you choose) in real-time to other users of the application&lt;/li&gt;
  1342. &lt;/ul&gt;
  1343. &lt;/li&gt;
  1344. &lt;li&gt;Simplify your architecture. If you’re using CRDTs extensively in your applications, RPC calls over CRDT helps keep your architecture simple and consistent.&lt;/li&gt;
  1345. &lt;li&gt;A free audit log! Which may or may not be useful but it can be handy or even essential to see a log of all mutations.&lt;/li&gt;
  1346. &lt;li&gt;Easy real-time updates for long-running requests e.g. the server can simply update a progress percentage or what step the request is on. If some requests are of interest to a wider audience e.g. in group collaboration, running requests over CRDT means you get free real-time job notifications.&lt;/li&gt;
  1347. &lt;/ul&gt;
  1348. &lt;h2 id=&quot;exploring-trpc&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#exploring-trpc&quot; aria-label=&quot;exploring trpc permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Exploring tRPC&lt;/h2&gt;
  1349. &lt;p&gt;A few weeks ago, I set off to see how to build this. While looking around, I kept thinking that &lt;a href=&quot;https://trpc.io&quot;&gt;tRPC&lt;/a&gt; was very close to what I wanted API wise. TRPC has simple patterns for defining server functions and automatically generates a nice typed client for calling the functions.&lt;/p&gt;
  1350. &lt;p&gt;Looking closer, I discovered their &lt;a href=&quot;https://trpc.io/docs/client/links&quot;&gt;transport layer is pluggable&lt;/a&gt;! They have built-in HTTP/WebSocket plugins and with a quick prototype later, I had my own plugin running API calls over Yjs!&lt;/p&gt;
  1351. &lt;p&gt;TRPC over Yjs looks like this:&lt;/p&gt;
  1352. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Server&lt;/span&gt;
  1353. &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; appRouter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1354.  userCreate&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; publicProcedure
  1355.    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1356.    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mutation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1357.      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1358.        input&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1359.        ctx&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1360.      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; opts
  1361.      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;input &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  1362.      &lt;span class=&quot;token comment&quot;&gt;// Set the new user on the Y.Map users.&lt;/span&gt;
  1363.      users&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1364.    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1365. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1366.  
  1367. &lt;span class=&quot;token comment&quot;&gt;// Client&lt;/span&gt;
  1368. &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; trpc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;userCreate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mutate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Kyle&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  1369. Users&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// The new user is now available on the Users map in the client&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  1370. &lt;p&gt;See the &lt;a href=&quot;https://github.com/KyleAMathews/trpc-crdt&quot;&gt;GitHub repo for installation and usage instructions and example code&lt;/a&gt;. I’m quite pleased with the experience using them while building some simple applications. It’s a straightforward RPC experience but with CRDT superpowers.&lt;/p&gt;
  1371. &lt;p&gt;I’d love to hear what y’all think.&lt;/p&gt;
  1372. &lt;h2 id=&quot;afterthought-what-about-syncing-data-between-servers-on-the-backend&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#afterthought-what-about-syncing-data-between-servers-on-the-backend&quot; aria-label=&quot;afterthought what about syncing data between servers on the backend permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Afterthought: What about syncing data between servers on the backend?&lt;/h2&gt;
  1373. &lt;p&gt;During this experience, I keep thinking about how this idea of colocated data connected with sync engines might change how we build backend applications. Just as local-first and sync engines are suggesting changes to frontend architectures, it seems they could also push a rethink of backends.&lt;/p&gt;
  1374. &lt;p&gt;It’s interesting to think about building Gatsby Cloud and how much time we spent building internal APIs, writing/debugging caching logic, scaling (and scaling some more) Postgres/Redis, debugging p99 spikes from internal API call swarms, etc. — all work to just get fresh-ish data out of the db into the right function at the right time. All of that could be replaced by queries to a local sqlite db with data automatically kept up to date by a sync engine.&lt;/p&gt;
  1375. &lt;p&gt;Fly.io wrote up a good blog post on their explorations on this topic on how replicated data lets them avoid writing internal APIs — &lt;a href=&quot;https://fly.io/blog/skip-the-api/&quot;&gt;https://fly.io/blog/skip-the-api/&lt;/a&gt;&lt;/p&gt;
  1376. &lt;p&gt;The HN discussion on the article was &lt;em&gt;very&lt;/em&gt; hostile to the idea — &lt;a href=&quot;https://news.ycombinator.com/item?id=37497345&quot;&gt;https://news.ycombinator.com/item?id=37497345&lt;/a&gt; — e.g. a popular comment:&lt;/p&gt;
  1377. &lt;blockquote&gt;
  1378. &lt;p&gt;“If you give access to your DB directly, your API effectively becomes your API with all the contract obligations of the API. Suddenly you don’t completely control your schema: you can’t freely change it, you need to add things there for your clients only. I’ve seen it done multiple times and it always ends poorly. You save some time now by removing the need to build an API, but later you end up spending much more time trying to decouple your internal representation from the schema you made public.”&lt;/p&gt;
  1379. &lt;/blockquote&gt;
  1380. &lt;p&gt;Schema evolution in distributed systems are hard in general — so I’m very sympathetic to the objections — APIs do help solve this problem by decoupling the internal and external schema so the two can evolve separately.&lt;/p&gt;
  1381. &lt;p&gt;This is a vivid problem when building with synced colocated databases in each client as it converts clients into full-blown nodes within the distributed system — each with their own copy of the schema. &lt;a href=&quot;https://www.inkandswitch.com/&quot;&gt;Ink &amp;#x26; Switch&lt;/a&gt; has done some interesting explorations around solving schema evolution with their &lt;a href=&quot;https://dl.acm.org/doi/pdf/10.1145/3447865.3457963&quot;&gt;Cambria library and “edit lens”&lt;/a&gt;. &lt;a href=&quot;https://electric-sql.com/docs/usage/data-access/shapes&quot;&gt;ElectricSQL’s “shape” API&lt;/a&gt; is also interesting in that it lets you only expose subsets of a schema to consumers. But this area definitely still needs more work.&lt;/p&gt;
  1382. &lt;h2 id=&quot;discussion-questions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#discussion-questions&quot; aria-label=&quot;discussion questions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Discussion Questions:&lt;/h2&gt;
  1383. &lt;ol&gt;
  1384. &lt;li&gt;Is making RPC calls over a CRDT actually a good idea? For high-volume calls and/or those with large inputs — it perhaps doesn’t make sense to store them all in a CRDT. You also lose the depth of HTTP tooling / infra. You could make normal HTTP API calls and then write responses back from the server through the CRDT and get many of the same benefits. The tradeoff you’d lose from not using CRDTs is auditability, offline support, guaranteed delivery, easy visibility of requests in collaborative settings. All of which people do build into HTTP APIs but you get for free with the CRDT approach.&lt;/li&gt;
  1385. &lt;li&gt;There are a lot of ways of setting this up in the CRDT depending on how visible/private you want the tRPC calls to be. You can go from extremes where “everyone can see everyone’s calls” to “a user can only see their calls”. Both are useful depending on what you’re going for.&lt;/li&gt;
  1386. &lt;li&gt;The Sync Engine in this sort of system becomes &lt;em&gt;the&lt;/em&gt; SPOF / bottleneck. To be broadly usable for running entire apps, It has to handle terabytes of data at really high throughput and really low latency and be ~bug free — database-level quality. There aren’t any yet at this level of quality (though some great teams are pushing hard to make sync engines amazing).&lt;/li&gt;
  1387. &lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Building a "per-user database" SaaS app with Turso]]></title><description><![CDATA[Turso is a SQLite-in-the-cloud startup with automatic backup and multi-region leader-follower replication across dozens of regions. Last…]]></description><link>https://bricolage.io/turso-per-user-db-saas/</link><guid isPermaLink="false">https://bricolage.io/turso-per-user-db-saas/</guid><pubDate>Tue, 03 Oct 2023 06:37:26 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://turso.tech/&quot;&gt;Turso&lt;/a&gt; is a SQLite-in-the-cloud startup with automatic backup and multi-region leader-follower replication across dozens of regions.&lt;/p&gt;
  1388. &lt;p&gt;Last week they &lt;a href=&quot;https://blog.turso.tech/turso-radically-increases-the-amount-of-databases-available-on-their-starter-and-scaler-plans-10a69ad94055&quot;&gt;announced that you can now have up to 10,000 databases&lt;/a&gt;! A huge jump over their previous limit of 6.&lt;/p&gt;
  1389. &lt;p&gt;This new capability lets us do something interesting — build a SaaS app where instead of one shared database, each user or customer gets their own database. Why?&lt;/p&gt;
  1390. &lt;p&gt;Two reasons:&lt;/p&gt;
  1391. &lt;ul&gt;
  1392. &lt;li&gt;Data isolation&lt;/li&gt;
  1393. &lt;li&gt;Compliance and data sovereignty&lt;/li&gt;
  1394. &lt;/ul&gt;
  1395. &lt;p&gt;To quote their launch blog post:&lt;/p&gt;
  1396. &lt;blockquote&gt;
  1397. &lt;p&gt;If you have sensitive customer data that you need to keep isolated, a database per customer is the best solution. With this architecture, you won’t need to build any complex permission logic on the backend. Also, exporting data, should your customer request, is trivial: just give them a copy of the entire database!&lt;/p&gt;
  1398. &lt;p&gt;Turso is great for replicating your data across the world. But not all data needs to be replicated everywhere. In fact, some data cannot legally be replicated outside its jurisdiction.&lt;/p&gt;
  1399. &lt;p&gt;Want to keep data replicated where it matters most, but still take advantage of great edge-based replication? Spin a database for each user, and replicate it only in the locations where you need it.&lt;/p&gt;
  1400. &lt;/blockquote&gt;
  1401. &lt;p&gt;I’ve been advising them for a while and worked with them to build a small TODOs demo SaaS product to explore closer how this would work.&lt;/p&gt;
  1402. &lt;p&gt;I built “TODOs” — a SaaS app that lets anyone create their own TODO list. You can play around with a live instance at &lt;a href=&quot;https://admin-todos-saas.fly.dev/&quot;&gt;https://admin-todos-saas.fly.dev/&lt;/a&gt; &amp;#x26; browse the code at &lt;a href=&quot;https://github.com/KyleAMathews/multi-tenancy-saas-demo&quot;&gt;https://github.com/KyleAMathews/multi-tenancy-saas-demo&lt;/a&gt;&lt;/p&gt;
  1403. &lt;h2 id=&quot;a-sample-todos-list&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-sample-todos-list&quot; aria-label=&quot;a sample todos list permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Sample TODOs list&lt;/h2&gt;
  1404. &lt;p&gt;&lt;span
  1405.      class=&quot;gatsby-resp-image-wrapper&quot;
  1406.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1407.    &gt;
  1408.      &lt;a
  1409.    class=&quot;gatsby-resp-image-link&quot;
  1410.    href=&quot;/static/a5a82df73e490bf8704f55bba4c639a5/35252/sample-todos-list.png&quot;
  1411.    style=&quot;display: block&quot;
  1412.    target=&quot;_blank&quot;
  1413.    rel=&quot;noopener&quot;
  1414.  &gt;
  1415.    &lt;span
  1416.    class=&quot;gatsby-resp-image-background-image&quot;
  1417.    style=&quot;padding-bottom: 38.513513513513516%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7klEQVR42qVRW06EQBCc+x9FT+AVZiVoZHmHIHxAwoQlQHgP5XbHiasu/liToib9UV3UCPzAPM+QUsJxHIRhyGpZFnzfh23b8DwP+77jCKLrOlRVhbZteaC1xjAMGMcRy7LwgmmaWA3JkA5BzQq1euc7TYRJ0vf94dZ7ifSuWZ8bC6/ykd309SOCIECapsjznEn3JElQFAWnPIIxPF1OeJEPX4ZZliGOY0RRxKS0ruuiLEv8BZP63J0Rvj2xIdUgqLNt27CuK+ttZzSjHg1piVLqmyH3+ZmWH+XXr1wXGHPSW9Z1jaZpDnu9a/hffABrGGwe5r0wDwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  1418.  &gt;&lt;/span&gt;
  1419.  &lt;img
  1420.        class=&quot;gatsby-resp-image-image&quot;
  1421.        alt=&quot;Screenshot of a sample TODOs list&quot;
  1422.        title=&quot;&quot;
  1423.        src=&quot;/static/a5a82df73e490bf8704f55bba4c639a5/fcda8/sample-todos-list.png&quot;
  1424.        srcset=&quot;/static/a5a82df73e490bf8704f55bba4c639a5/12f09/sample-todos-list.png 148w,
  1425. /static/a5a82df73e490bf8704f55bba4c639a5/e4a3f/sample-todos-list.png 295w,
  1426. /static/a5a82df73e490bf8704f55bba4c639a5/fcda8/sample-todos-list.png 590w,
  1427. /static/a5a82df73e490bf8704f55bba4c639a5/efc66/sample-todos-list.png 885w,
  1428. /static/a5a82df73e490bf8704f55bba4c639a5/c83ae/sample-todos-list.png 1180w,
  1429. /static/a5a82df73e490bf8704f55bba4c639a5/35252/sample-todos-list.png 1204w&quot;
  1430.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1431.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1432.        loading=&quot;lazy&quot;
  1433.        decoding=&quot;async&quot;
  1434.      /&gt;
  1435.  &lt;/a&gt;
  1436.    &lt;/span&gt;&lt;/p&gt;
  1437. &lt;p&gt;Then for admins, there’s an Admin app that shows at a glance critical information about each TODO list instance e.g. when it was last active, the number of TODOs, and its Turso DB url. It also lets admins take quick actions like creating and deleting list instances.&lt;/p&gt;
  1438. &lt;p&gt;&lt;span
  1439.      class=&quot;gatsby-resp-image-wrapper&quot;
  1440.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1441.    &gt;
  1442.      &lt;a
  1443.    class=&quot;gatsby-resp-image-link&quot;
  1444.    href=&quot;/static/55c443f2411f979348958e67a2ad591a/6f175/admin-view.png&quot;
  1445.    style=&quot;display: block&quot;
  1446.    target=&quot;_blank&quot;
  1447.    rel=&quot;noopener&quot;
  1448.  &gt;
  1449.    &lt;span
  1450.    class=&quot;gatsby-resp-image-background-image&quot;
  1451.    style=&quot;padding-bottom: 89.1891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABYlAAAWJQFJUiTwAAABe0lEQVR42qWUb0+DMBDG+/0/1N44TabRmcWoLyduA8qfUmiBAuPxjolZfCPIJUeTNlzv7vdcRaZzrNYbrG42eNy9Dn57v8XT7g3rzRZ3D8/YvryDrcffJtqugx9GOPoSgYwRJSm8wwkqy3GifT7jvakm6trRzxpJqlCWFfq+xxIT/HHOIUkSWGtxPp9/gvI6+uSAZVVBxvFQms4LLDVhbEXBUmS5RdO0ywMWpsb+M6UsDVKlURiLtu3gmgZN205k+wtKRP0LpYSMEgShRExUjS3B7ZgLSTSUCfdOaw1TFAOcPM+HQwY010VV19RDiVNw0SHD4bKvKc+HIjMq0VGJNToS+iIotnTwjgphROVeQalJm6PPuURU1PiIdRj45AH2Hx6tIbgVhoRuaXoutCcGdK4hqgopjZ4lsjw17NdTwj4ZCsvDO/gIohi6MIvG7huKw+GUk3SaoTzOeBGUioR99C/PFEuHnyp+ulibfMHsgKOwR0FLmhil1L8z/AL6xYLaj9a+hwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  1452.  &gt;&lt;/span&gt;
  1453.  &lt;img
  1454.        class=&quot;gatsby-resp-image-image&quot;
  1455.        alt=&quot;Screenshot of TODOs admin app&quot;
  1456.        title=&quot;&quot;
  1457.        src=&quot;/static/55c443f2411f979348958e67a2ad591a/fcda8/admin-view.png&quot;
  1458.        srcset=&quot;/static/55c443f2411f979348958e67a2ad591a/12f09/admin-view.png 148w,
  1459. /static/55c443f2411f979348958e67a2ad591a/e4a3f/admin-view.png 295w,
  1460. /static/55c443f2411f979348958e67a2ad591a/fcda8/admin-view.png 590w,
  1461. /static/55c443f2411f979348958e67a2ad591a/efc66/admin-view.png 885w,
  1462. /static/55c443f2411f979348958e67a2ad591a/c83ae/admin-view.png 1180w,
  1463. /static/55c443f2411f979348958e67a2ad591a/6f175/admin-view.png 2036w&quot;
  1464.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1465.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1466.        loading=&quot;lazy&quot;
  1467.        decoding=&quot;async&quot;
  1468.      /&gt;
  1469.  &lt;/a&gt;
  1470.    &lt;/span&gt;&lt;/p&gt;
  1471. &lt;p&gt;Two other interesting features.&lt;/p&gt;
  1472. &lt;ul&gt;
  1473. &lt;li&gt;You can run queries directly from the Admin db directly against each instances’ db. Great for quickly introspecting on live data.&lt;/li&gt;
  1474. &lt;li&gt;Every TODO list can be cloned. This is great for debugging e.g. capturing a broken instance for further debugging locally as well as creating demo instances for showing potential customers. This leverages Turso’s new database branching feature. Because all data for an instance is in a single database, cloning an instance is literally one API call to Turso.&lt;/li&gt;
  1475. &lt;/ul&gt;
  1476. &lt;p&gt;The tech stack is:&lt;/p&gt;
  1477. &lt;ul&gt;
  1478. &lt;li&gt;Turso for admin &amp;#x26; instance databases (obviously)&lt;/li&gt;
  1479. &lt;li&gt;Remix for the admin &amp;#x26; TODO apps&lt;/li&gt;
  1480. &lt;li&gt;Fly.io for hosting&lt;/li&gt;
  1481. &lt;/ul&gt;
  1482. &lt;p&gt;There’s an admin db that stores all the information about instances. The Remix app server uses an embedded replica of this db (&lt;a href=&quot;https://blog.turso.tech/introducing-embedded-replicas-deploy-turso-anywhere-2085aa0dc242&quot;&gt;another new feature!&lt;/a&gt;) to get db credentials, etc. for each instance.&lt;/p&gt;
  1483. &lt;h2 id=&quot;reflections&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#reflections&quot; aria-label=&quot;reflections permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reflections&lt;/h2&gt;
  1484. &lt;p&gt;SQLite is really delightful to use — it just feels very light to develop against it. Both that it’s very fast of course but also, that there’s just not much to think about. No Docker instance to babysit for the DB. Just import a library and a few SQL commands.&lt;/p&gt;
  1485. &lt;p&gt;Turso extends that feel to the cloud. To move your local dev SQLite setup to a cloud-hosted database, you just add a Turso db URL &amp;#x26; authToken and you’re done.&lt;/p&gt;
  1486. &lt;p&gt;SQLite has always been great but never felt quite production-ready without some extra leg work like moving the db file to each process, backups, and multi-region replication. Turso has now done that legwork for you.&lt;/p&gt;
  1487. &lt;p&gt;It’s been remarkable watching the emergence of cloud database hosting during my career. Outside of tightly integrated frameworks like Rails, etc. databases were a lot of work to setup and operate. Now they’re (almost) trivial to setup and start running.&lt;/p&gt;
  1488. &lt;p&gt;I love all the energy in developer tools because they’re enabling more and better software to be built. The world increasingly runs on software and it’s to everyone’s benefit if that software continues to get better and better.&lt;/p&gt;
  1489. &lt;p&gt;Turso opens a lot of new design space for architectures and I’m excited to see what people build with it in the coming years. If you’re prototyping a new feature or app and you’ve looked at SQLite or are interested in edge dbs and data locality, you should give Turso a try.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Some notes on Local-First Development]]></title><description><![CDATA[A few months ago in June, I attended a local-first meetup in Berlin organized by Johannes Schickling, formerly the founder of Prisma. An…]]></description><link>https://bricolage.io/some-notes-on-local-first-development/</link><guid isPermaLink="false">https://bricolage.io/some-notes-on-local-first-development/</guid><pubDate>Fri, 08 Sep 2023 06:37:26 GMT</pubDate><content:encoded>&lt;p&gt;A few months ago in June, I attended &lt;a href=&quot;https://www.youtube.com/results?search_query=Local-First+Meetup+Berlin+%231&quot;&gt;a local-first meetup in Berlin&lt;/a&gt; organized by Johannes Schickling, formerly the founder of Prisma. An intellectual crackle filled the air as we watched demos of new libraries and products. Many of us had been independently playing around with local-first development ideas for a while — in my case, over a decade — and the in-person meetup gave us the chance to trade notes late into the night.&lt;/p&gt;
  1490. &lt;p&gt;&lt;span
  1491.      class=&quot;gatsby-resp-image-wrapper&quot;
  1492.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1493.    &gt;
  1494.      &lt;a
  1495.    class=&quot;gatsby-resp-image-link&quot;
  1496.    href=&quot;/static/0437f7e6c171f69089530459c0d8d109/49ee4/berlin-meetup.jpg&quot;
  1497.    style=&quot;display: block&quot;
  1498.    target=&quot;_blank&quot;
  1499.    rel=&quot;noopener&quot;
  1500.  &gt;
  1501.    &lt;span
  1502.    class=&quot;gatsby-resp-image-background-image&quot;
  1503.    style=&quot;padding-bottom: 56.75675675675676%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFAQT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAABU+Po2TmC/8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECAyERE//aAAgBAQABBQKu1RFekvSJzJCw/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHhAAAAQHAAAAAAAAAAAAAAAAAAEQIQIRIjJBYaH/2gAIAQEABj8CiNzFRvoXcSWE/8QAGxABAAMBAAMAAAAAAAAAAAAAAQARITFBUfD/2gAIAQEAAT8h2Sx70JSFaXiobqwdLinhDVD0yEFAfE//2gAMAwEAAgADAAAAEDjf/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EMCwv//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxDVtb//xAAdEAEAAgMAAwEAAAAAAAAAAAABACERMUFRYYHh/9oACAEBAAE/EAtp1QvBHI0Dg3tglGMHD1Wom8cD9hOkgI7f7KAAAZB48z//2Q==&apos;); background-size: cover; display: block;&quot;
  1504.  &gt;&lt;/span&gt;
  1505.  &lt;img
  1506.        class=&quot;gatsby-resp-image-image&quot;
  1507.        alt=&quot;Picture of Berlin Local-First meetup&quot;
  1508.        title=&quot;&quot;
  1509.        src=&quot;/static/0437f7e6c171f69089530459c0d8d109/1c72d/berlin-meetup.jpg&quot;
  1510.        srcset=&quot;/static/0437f7e6c171f69089530459c0d8d109/a80bd/berlin-meetup.jpg 148w,
  1511. /static/0437f7e6c171f69089530459c0d8d109/1c91a/berlin-meetup.jpg 295w,
  1512. /static/0437f7e6c171f69089530459c0d8d109/1c72d/berlin-meetup.jpg 590w,
  1513. /static/0437f7e6c171f69089530459c0d8d109/a8a14/berlin-meetup.jpg 885w,
  1514. /static/0437f7e6c171f69089530459c0d8d109/fbd2c/berlin-meetup.jpg 1180w,
  1515. /static/0437f7e6c171f69089530459c0d8d109/49ee4/berlin-meetup.jpg 3630w&quot;
  1516.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1517.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1518.        loading=&quot;lazy&quot;
  1519.        decoding=&quot;async&quot;
  1520.      /&gt;
  1521.  &lt;/a&gt;
  1522.    &lt;/span&gt;&lt;/p&gt;
  1523. &lt;p&gt;In the months since, I’ve continued to tinker with these technologies and collected some point-in-time notes on significant developments and what might happen in the years to come.&lt;/p&gt;
  1524. &lt;h3 id=&quot;table-of-contents&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#table-of-contents&quot; aria-label=&quot;table of contents permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Table of Contents&lt;/h3&gt;
  1525. &lt;div class=&quot;toc&quot;&gt;
  1526. &lt;ul&gt;
  1527. &lt;li&gt;
  1528. &lt;p&gt;&lt;a href=&quot;#whats-happening&quot;&gt;What’s Happening?&lt;/a&gt;&lt;/p&gt;
  1529. &lt;/li&gt;
  1530. &lt;li&gt;
  1531. &lt;p&gt;&lt;a href=&quot;#why-is-local-first-happening-now&quot;&gt;Why is Local-First Happening Now?&lt;/a&gt;&lt;/p&gt;
  1532. &lt;/li&gt;
  1533. &lt;li&gt;
  1534. &lt;p&gt;&lt;a href=&quot;#will-most-rich-client-apps-use-local-first&quot;&gt;Will Most Rich Client Apps Use Local-First?&lt;/a&gt;&lt;/p&gt;
  1535. &lt;ul&gt;
  1536. &lt;li&gt;&lt;a href=&quot;#crud-with-crdt-based-sync-engines&quot;&gt;CRUD with CRDT-based Sync Engines&lt;/a&gt;&lt;/li&gt;
  1537. &lt;li&gt;&lt;a href=&quot;#using-a-distributed-state-machine-to-handle-complex-writes&quot;&gt;Using a Distributed State Machine to Handle Complex Writes&lt;/a&gt;&lt;/li&gt;
  1538. &lt;li&gt;&lt;a href=&quot;#local-first-dx-is-still-being-explored&quot;&gt;Local-First DX is Still Being Explored&lt;/a&gt;&lt;/li&gt;
  1539. &lt;/ul&gt;
  1540. &lt;/li&gt;
  1541. &lt;li&gt;
  1542. &lt;p&gt;&lt;a href=&quot;#what-approaches-are-people-exploring-now&quot;&gt;What Approaches are People Exploring Now?&lt;/a&gt;&lt;/p&gt;
  1543. &lt;ul&gt;
  1544. &lt;li&gt;
  1545. &lt;p&gt;&lt;a href=&quot;#1-replicated-data-structures&quot;&gt;1. Replicated Data Structures&lt;/a&gt;&lt;/p&gt;
  1546. &lt;/li&gt;
  1547. &lt;li&gt;
  1548. &lt;p&gt;&lt;a href=&quot;#2-replicated-database-tables&quot;&gt;2. Replicated Database Tables&lt;/a&gt;&lt;/p&gt;
  1549. &lt;ul&gt;
  1550. &lt;li&gt;&lt;a href=&quot;#postgres-to-sqlite&quot;&gt;Postgres to SQLite:&lt;/a&gt;&lt;/li&gt;
  1551. &lt;li&gt;&lt;a href=&quot;#some-related-database-syncing-tools&quot;&gt;Some Related Database Syncing Tools:&lt;/a&gt;&lt;/li&gt;
  1552. &lt;/ul&gt;
  1553. &lt;/li&gt;
  1554. &lt;li&gt;
  1555. &lt;p&gt;&lt;a href=&quot;#3-replication-as-a-protocol&quot;&gt;3. Replication as a Protocol&lt;/a&gt;&lt;/p&gt;
  1556. &lt;/li&gt;
  1557. &lt;/ul&gt;
  1558. &lt;/li&gt;
  1559. &lt;li&gt;
  1560. &lt;p&gt;&lt;a href=&quot;#soshould-you-go-local-first&quot;&gt;So…Should You Go Local-First?&lt;/a&gt;&lt;/p&gt;
  1561. &lt;/li&gt;
  1562. &lt;/ul&gt;
  1563. &lt;/div&gt;
  1564. &lt;h2 id=&quot;whats-happening&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-happening&quot; aria-label=&quot;whats happening permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s Happening?&lt;/h2&gt;
  1565. &lt;p&gt;The web feels ready for a major upgrade. We had tightly coupled web frameworks in the Rails/Django years and lost them with the shift to API-powered SPAs. The developing database-grade sync technology will tightly recouple our application stacks allowing for a new era of framework innovation.&lt;/p&gt;
  1566. &lt;p&gt;I see “local-first” as shifting reads and writes to an embedded database in each client via“sync engines” that facilitate data exchange between clients and servers. Applications like Figma and Linear pioneered this approach, but it’s becoming increasingly easy to do. The benefits are multiple:&lt;/p&gt;
  1567. &lt;ul&gt;
  1568. &lt;li&gt;Simplified state management for developers&lt;/li&gt;
  1569. &lt;li&gt;Built-in support for real-time sync, offline usage, and multiplayer collaborative features&lt;/li&gt;
  1570. &lt;li&gt;Faster (60 FPS) CRUD&lt;/li&gt;
  1571. &lt;li&gt;More robust applications for end-users&lt;/li&gt;
  1572. &lt;/ul&gt;
  1573. &lt;p&gt;(Some good reading material: this local-first case study on &lt;a href=&quot;https://riffle.systems/essays/prelude/&quot;&gt;building reactive, data-centric apps&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=jxuXGeMJsBU&amp;#x26;t=1s&quot;&gt;Johannes’ talk in Berlin&lt;/a&gt;; I will include some more links later.)&lt;/p&gt;
  1574. &lt;p&gt;Like the shift to componentized JavaScript UI over the last decade, I believe local-first will be the next large paradigm shift for rich client apps and work its way through the application world over the next decade&lt;/p&gt;
  1575. &lt;h2 id=&quot;why-is-local-first-happening-now&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-is-local-first-happening-now&quot; aria-label=&quot;why is local first happening now permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why is Local-First Happening Now?&lt;/h2&gt;
  1576. &lt;p&gt;I’ve read about and played with local-first type ideas for a decade or so but only now does it seem to be gaining steam with many young startups rushing to productize its ideas.&lt;/p&gt;
  1577. &lt;p&gt;Figma, Superhuman, and Linear are good examples of pioneering startups in the local-first paradigm and all rely on local-first ideas and bespoke sync engines to support their speed and multiplayer UX.&lt;/p&gt;
  1578. &lt;p&gt;Many builders now see local-first as a key way to differentiate their applications.&lt;/p&gt;
  1579. &lt;p&gt;Why is this happening now?&lt;/p&gt;
  1580. &lt;p&gt;My general model for change in technology is that a given community of practice (like application developers) can only adopt one large paradigm shift at a time. While local-first ideas have been floating around for decades, practitioners have so far been focused on more fundamental changes.&lt;/p&gt;
  1581. &lt;p&gt;What we’ve seen over the last decade is that application speed and collaboration features are powerful vectors to shake up an incumbent industry. Figma used local-first to displace Sketch and InVision; Linear is using local-first to displace Jira.&lt;/p&gt;
  1582. &lt;p&gt;We’ve shifted from Rails-type server-rendered apps, to single-page-apps powered by APIs. A core lesson from this transition is that while standard REST and GraphQL APIs are very easy to get started with for solving client/server sync, they require significant effort and skill to scale and refine and they struggle with use-cases like multiplayer and offline support.&lt;/p&gt;
  1583. &lt;p&gt;Sync engines are a robust database-grade syncing technology to ensure that data is consistent and up-to-date. It’s an ecosystem-wide refactor that many talented groups are exploring to attempt to simplify the application stack.&lt;/p&gt;
  1584. &lt;p&gt;Assuming they succeed, they’ll provide a solid substrate for new types of framework that can rely on local data and rock solid sync.&lt;/p&gt;
  1585. &lt;h2 id=&quot;will-most-rich-client-apps-use-local-first&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#will-most-rich-client-apps-use-local-first&quot; aria-label=&quot;will most rich client apps use local first permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Will Most Rich Client Apps Use Local-First?&lt;/h2&gt;
  1586. &lt;p&gt;I’ve chatted with a number of developers who — frustrated at maintaining the homegrown bespoke sync systems they wrote — are replacing it with new local-first tooling. The tooling feels a lot better and having standard primitives make it easier to build great experiences.&lt;/p&gt;
  1587. &lt;p&gt;Local-first is developing into an ecosystem similar to authentication services but for handling data and features that need to be real-time, collaborative, or offline.&lt;/p&gt;
  1588. &lt;p&gt;The key question for us technologists is whether local-first will remain a niche technology or if it’ll gradually replace the current API-based approach.&lt;/p&gt;
  1589. &lt;p&gt;It’s still early but I’m confident that at a minimum, we’ll see multiple breakout startups along with a few healthy open-source ecosystems around the different approaches. And if local-first becomes the new default paradigm for handling data, it will be much larger and reshape many parts of the cloud ecosystem.&lt;/p&gt;
  1590. &lt;p&gt;But: there are many issues to solve first! Let’s look in detail at one of the first issues that people encounter: handling CRUD operations.&lt;/p&gt;
  1591. &lt;h3 id=&quot;crud-with-crdt-based-sync-engines&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#crud-with-crdt-based-sync-engines&quot; aria-label=&quot;crud with crdt based sync engines permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CRUD with CRDT-based Sync Engines&lt;/h3&gt;
  1592. &lt;p&gt;To fully replace client-server APIs, sync engines need robust support for fine-grained access control and complex write validation.&lt;/p&gt;
  1593. &lt;p&gt;The most basic use case for an API is &lt;em&gt;state transfer&lt;/em&gt; from the server to the client. The client wants to show information about an object so reads the necessary data through the API.&lt;/p&gt;
  1594. &lt;p&gt;Local-first tools all handle this perfectly. They ensure the latest object data is synced correctly to the client db for querying from the UI.&lt;/p&gt;
  1595. &lt;p&gt;But while reads are generally easy, support for complex writes is still immature in local-first tooling. Clients tend to have unrestricted write access and updates are immediately synced to other clients. While this is generally fine for text collaboration or multiplayer drawing, this wouldn’t work for a typical ecommerce or SaaS application.&lt;/p&gt;
  1596. &lt;p&gt;Local-first tools need somewhere to put arbitrary business logic written in code, because real-world systems start out elegant and simple and, over time, accumulate lots of messy, important chunks of logic.&lt;/p&gt;
  1597. &lt;p&gt;A data property might normally be limited to 20 but Acme Corp paid $50k to get a limit of 100. Or write access needs to be restricted for sensitive information like account balances. Or writes need validation by third party APIs, like a calendar booking system that needs to ask an external calendar API if a time slot is open.&lt;/p&gt;
  1598. &lt;p&gt;Normally, these inevitable chunks of code and logic live on the server behind an API. And we still need somewhere to put them in a local-first world.&lt;/p&gt;
  1599. &lt;p&gt;Put differently: local-first CRDT-based sync engines can drive consistency within a system but real-world systems also need an authoritative server which can enforce consistency within external constraints and systems.&lt;/p&gt;
  1600. &lt;p&gt;Or as Aaron Boodman, a &lt;a href=&quot;https://replicache.dev/&quot;&gt;Replicache&lt;/a&gt; co-founder, put it: “CRDTs converge, but to where?”&lt;/p&gt;
  1601. &lt;h3 id=&quot;using-a-distributed-state-machine-to-handle-complex-writes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#using-a-distributed-state-machine-to-handle-complex-writes&quot; aria-label=&quot;using a distributed state machine to handle complex writes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Using a Distributed State Machine to Handle Complex Writes&lt;/h3&gt;
  1602. &lt;p&gt;I asked Anselm Eickhoff and James Arthur (founders of &lt;a href=&quot;https://jazz.tools/&quot;&gt;Jazz&lt;/a&gt; and &lt;a href=&quot;https://electric-sql.com/&quot;&gt;ElectricSQL&lt;/a&gt; respectively, both CRDT-based tools) about how they suggest handling writes that need an authoritative server.&lt;/p&gt;
  1603. &lt;p&gt;They both suggested emulating API request/response patterns through a distributed state machine running on a replicated object.&lt;/p&gt;
  1604. &lt;p&gt;So let’s say a client wants to update the user name. It creates the following object:&lt;/p&gt;
  1605. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1606.  &lt;span class=&quot;token property&quot;&gt;&quot;machine&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;updateUserName&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1607.  &lt;span class=&quot;token property&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;requestedUpdate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1608.  &lt;span class=&quot;token property&quot;&gt;&quot;request&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1609.    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fred&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1610.    &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1611.    &lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1694122496&lt;/span&gt;
  1612.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1613.  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  1614. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  1615.  
  1616. &lt;span class=&quot;token comment&quot;&gt;// User 123&lt;/span&gt;
  1617. &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1618.  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1619.  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;
  1620. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  1621. &lt;p&gt;The server listens for writes and upon receiving this one, validates the request and updates the state machine object along with the name on the user object (which again are synced back to clients as the “server” is just another client):&lt;/p&gt;
  1622. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1623.  &lt;span class=&quot;token property&quot;&gt;&quot;machine&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;updateUserName&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1624.  &lt;span class=&quot;token property&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;finished&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1625.  &lt;span class=&quot;token property&quot;&gt;&quot;request&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1626.    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fred&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1627.    &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1628.    &lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1694122496&lt;/span&gt;
  1629.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  1630.  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1631.    &lt;span class=&quot;token property&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1632.    &lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1694122996&lt;/span&gt;
  1633.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  1634. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  1635.  
  1636. &lt;span class=&quot;token comment&quot;&gt;// User 123&lt;/span&gt;
  1637. &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  1638.  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fred&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  1639.  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;
  1640. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  1641. &lt;p&gt;This has the interesting and useful implication that in-flight requests are synced to other clients and it’s trivial for the server to emit progress updates. E.g. an app that supports a team of users uploading images for some nifty AI enhancements. The client can emit progress updates on the upload and the server as it works through enhancements.&lt;/p&gt;
  1642. &lt;p&gt;In other words, requests/responses have the same multiplayer, offline, real-time sync properties as the rest of the app.&lt;/p&gt;
  1643. &lt;p&gt;This pattern can be wrapped up in a standard mutation function e.g. &lt;code class=&quot;language-text&quot;&gt;const {res, error} = await updateName({ name: &quot;fred&quot; })&lt;/code&gt;&lt;/p&gt;
  1644. &lt;p&gt;Jazz also lets you restrict writes to certain object fields to a specific role. Sensitive information would be marked read-only for clients who would need to request the server to update them.&lt;/p&gt;
  1645. &lt;h3 id=&quot;local-first-dx-is-still-being-explored&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#local-first-dx-is-still-being-explored&quot; aria-label=&quot;local first dx is still being explored permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Local-First DX is Still Being Explored&lt;/h3&gt;
  1646. &lt;p&gt;Beyond the question of &lt;em&gt;can&lt;/em&gt; you build any application with local-first tools, there’s still the question of whether devs will &lt;em&gt;want&lt;/em&gt; to.&lt;/p&gt;
  1647. &lt;ul&gt;
  1648. &lt;li&gt;Do advantages make it worth learning a new stack and migrating applications?&lt;/li&gt;
  1649. &lt;li&gt;There’s a lot of missing components still — what will a full production DX for a local-first toolchain look like?&lt;/li&gt;
  1650. &lt;li&gt;How complex will it feel to build a simple app?&lt;/li&gt;
  1651. &lt;li&gt;Is there enough demand to fund all the new libraries and products that’ll need to be built?&lt;/li&gt;
  1652. &lt;/ul&gt;
  1653. &lt;p&gt;The success of Figma, Superhuman, and Linear suggest these issues will get solved in time.&lt;/p&gt;
  1654. &lt;h2 id=&quot;what-approaches-are-people-exploring-now&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-approaches-are-people-exploring-now&quot; aria-label=&quot;what approaches are people exploring now permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What Approaches are People Exploring Now?&lt;/h2&gt;
  1655. &lt;p&gt;I’m grouping approaches I see into three broad categories.&lt;/p&gt;
  1656. &lt;h3 id=&quot;1-replicated-data-structures&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-replicated-data-structures&quot; aria-label=&quot;1 replicated data structures permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Replicated Data Structures&lt;/h3&gt;
  1657. &lt;p&gt;These projects provide support for replicated data structures. They are convenient building blocks for any sort of real-time or multiplayer project. They typically give you APIs similar to native JavaScript maps and arrays but which guarantee state updates are replicated to other clients and to the server.&lt;/p&gt;
  1658. &lt;p&gt;It feels like magic when you can build a simple application and and see changes instantly replicate between devices with no additional work.&lt;/p&gt;
  1659. &lt;p&gt;Most replicated data structures rely on CRDT algorithms to merge concurrent and offline edits from multiple clients.&lt;/p&gt;
  1660. &lt;p&gt;There’s a number of open source and hosted projects offering replicated data structures, including the granddaddy in this space, Firebase, plus many newer ones.&lt;/p&gt;
  1661. &lt;p&gt;These services are great for making parts of an app real-time / multiplayer. E.g. a drawing surface, a chat room, a notification system, presence, etc. They’re very simple to get started with and the shared data structures approach offers a much better DX than manually passing events through with websockets or push messaging services.&lt;/p&gt;
  1662. &lt;p&gt;Open source projects:&lt;/p&gt;
  1663. &lt;ul&gt;
  1664. &lt;li&gt;&lt;a href=&quot;https://yjs.dev/&quot;&gt;Yjs&lt;/a&gt;&lt;/li&gt;
  1665. &lt;li&gt;&lt;a href=&quot;https://automerge.org/&quot;&gt;Automerge&lt;/a&gt;&lt;/li&gt;
  1666. &lt;li&gt;&lt;a href=&quot;https://jazz.tools/&quot;&gt;Jazz&lt;/a&gt;&lt;/li&gt;
  1667. &lt;li&gt;&lt;a href=&quot;https://www.evolu.dev/&quot;&gt;Evolu&lt;/a&gt;&lt;/li&gt;
  1668. &lt;/ul&gt;
  1669. &lt;p&gt;Hosted services:&lt;/p&gt;
  1670. &lt;ul&gt;
  1671. &lt;li&gt;&lt;a href=&quot;https://firebase.google.com/&quot;&gt;Firebase&lt;/a&gt;&lt;/li&gt;
  1672. &lt;li&gt;&lt;a href=&quot;https://liveblocks.io/&quot;&gt;Liveblocks&lt;/a&gt;&lt;/li&gt;
  1673. &lt;li&gt;&lt;a href=&quot;https://www.partykit.io/&quot;&gt;Partykit&lt;/a&gt;&lt;/li&gt;
  1674. &lt;li&gt;&lt;a href=&quot;https://www.triplit.dev/&quot;&gt;Triplit&lt;/a&gt;&lt;/li&gt;
  1675. &lt;li&gt;&lt;a href=&quot;https://reflect.net/&quot;&gt;Reflect&lt;/a&gt;&lt;/li&gt;
  1676. &lt;li&gt;&lt;a href=&quot;https://www.instantdb.com/&quot;&gt;Instant&lt;/a&gt;&lt;/li&gt;
  1677. &lt;li&gt;&lt;a href=&quot;https://www.ditto.live/&quot;&gt;Ditto&lt;/a&gt;&lt;/li&gt;
  1678. &lt;li&gt;&lt;a href=&quot;https://dexie.org/cloud/&quot;&gt;Dexie Cloud&lt;/a&gt;&lt;/li&gt;
  1679. &lt;/ul&gt;
  1680. &lt;h3 id=&quot;2-replicated-database-tables&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-replicated-database-tables&quot; aria-label=&quot;2 replicated database tables permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Replicated Database Tables&lt;/h3&gt;
  1681. &lt;p&gt;An approach several projects are taking is to sync from Postgres to a client db (generally SQLite). You pick tables (or materialized views) to sync to the client and then they get loaded along with real-time updates as writes land in Postgres.&lt;/p&gt;
  1682. &lt;p&gt;SQLite in the browser is one big advantage of this approach as it gives you the rich, familiar querying power of SQL in the client.&lt;/p&gt;
  1683. &lt;p&gt;Given Postgres’ widespread usage and central position in most application architectures, this is a great way to start with local-first. Instead of syncing data in and out of replicated data structures, you can read and write directly to Postgres as normal, confident that clients will be in sync.&lt;/p&gt;
  1684. &lt;p&gt;I’ve built a number of job queues and notification systems over the years and they’ve all struggled with their version of the Byzantine Generals problem. Clients would miss an update (usually due to being offline), and then users would complain about zombie jobs that never finished. In contrast, replicated database tables mean the background process can simply write updates to Postgres, confident all connected clients will get the update.&lt;/p&gt;
  1685. &lt;h4 id=&quot;postgres-to-sqlite&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#postgres-to-sqlite&quot; aria-label=&quot;postgres to sqlite permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Postgres to SQLite:&lt;/h4&gt;
  1686. &lt;ul&gt;
  1687. &lt;li&gt;&lt;a href=&quot;https://electric-sql.com/&quot;&gt;ElectricSQL&lt;/a&gt;&lt;/li&gt;
  1688. &lt;li&gt;&lt;a href=&quot;https://www.powersync.co/&quot;&gt;Powersync&lt;/a&gt;&lt;/li&gt;
  1689. &lt;li&gt;&lt;a href=&quot;https://github.com/zknill/sqledge&quot;&gt;SQLedge&lt;/a&gt;&lt;/li&gt;
  1690. &lt;/ul&gt;
  1691. &lt;p&gt;ElectricSQL and Powersync support syncing client writes back to Postgres and other clients.&lt;/p&gt;
  1692. &lt;h4 id=&quot;some-related-database-syncing-tools&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#some-related-database-syncing-tools&quot; aria-label=&quot;some related database syncing tools permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Some Related Database Syncing Tools:&lt;/h4&gt;
  1693. &lt;ul&gt;
  1694. &lt;li&gt;
  1695. &lt;p&gt;SQLite to SQLite&lt;/p&gt;
  1696. &lt;ul&gt;
  1697. &lt;li&gt;&lt;a href=&quot;https://libsql.org/&quot;&gt;libSQL&lt;/a&gt;&lt;/li&gt;
  1698. &lt;li&gt;&lt;a href=&quot;https://github.com/orbitinghail/sqlsync&quot;&gt;SQLSync&lt;/a&gt;&lt;/li&gt;
  1699. &lt;li&gt;&lt;a href=&quot;https://vlcn.io/&quot;&gt;VLCN&lt;/a&gt;&lt;/li&gt;
  1700. &lt;li&gt;&lt;a href=&quot;https://mycelial.com/&quot;&gt;Mycelite&lt;/a&gt;&lt;/li&gt;
  1701. &lt;/ul&gt;
  1702. &lt;/li&gt;
  1703. &lt;li&gt;
  1704. &lt;p&gt;MongoDB to Client DB&lt;/p&gt;
  1705. &lt;ul&gt;
  1706. &lt;li&gt;&lt;a href=&quot;https://realm.io/&quot;&gt;Realm&lt;/a&gt;&lt;/li&gt;
  1707. &lt;/ul&gt;
  1708. &lt;/li&gt;
  1709. &lt;/ul&gt;
  1710. &lt;h3 id=&quot;3-replication-as-a-protocol&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-replication-as-a-protocol&quot; aria-label=&quot;3 replication as a protocol permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Replication as a Protocol&lt;/h3&gt;
  1711. &lt;p&gt;The startup &lt;a href=&quot;https://replicache.dev/&quot;&gt;Replicache&lt;/a&gt; has a unique “replication as a protocol” approach. Replicache is a client JS library along with a replication protocol — which lets you integrate arbitrary backends, provided you follow the spec. It’s more upfront work, as the sync engine is “some assembly required”, but as Replicache is mostly your own code, it gives the most flexibility and power of any local-first tool I’ve seen to date. The startup behind Replicache is also building Reflect, a hosted backend for Replicache.&lt;/p&gt;
  1712. &lt;h2 id=&quot;soshould-you-go-local-first&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#soshould-you-go-local-first&quot; aria-label=&quot;soshould you go local first permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So…Should You Go Local-First?&lt;/h2&gt;
  1713. &lt;p&gt;I think it depends on your use case and risk tolerance.&lt;/p&gt;
  1714. &lt;p&gt;For the right people and teams, it’s an exciting time to jump in. Realtime, multiplayer, and offline features will significantly improve much of our day-to-day software.&lt;/p&gt;
  1715. &lt;p&gt;For almost any &lt;strong&gt;real-time use case&lt;/strong&gt;, I’d choose &lt;em&gt;replicated data structures&lt;/em&gt; over raw web sockets as they give you a much simpler DX and robust guarantees that clients will get updates.&lt;/p&gt;
  1716. &lt;p&gt;For &lt;strong&gt;multiplayer and offline&lt;/strong&gt;, again you’ll almost certainly want to pick an open source &lt;em&gt;replicated data structure&lt;/em&gt; or hosted service. There’s a lot of difficult problems that they help solve.&lt;/p&gt;
  1717. &lt;p&gt;The &lt;em&gt;Replicated Database&lt;/em&gt; approach also works for the real-time, multiplayer, offline use cases. It should be especially useful for data-heavy applications and ones with many background processing writing into Postgres.&lt;/p&gt;
  1718. &lt;p&gt;But in general, I’d still be wary of using local-first outside real-time / multiplayer / offline use cases. Local-first is definitely still bleeding-edge. You will hit unexpected problems. A good community has rapidly developed, but there’ll still be some stretches on the road where you’ll have to solve novel problems.&lt;/p&gt;
  1719. &lt;p&gt;So: if you need local-first, see if it makes sense to isolate the local-first parts and architect the rest of the app (for now) in a more conventional fashion.&lt;/p&gt;
  1720. &lt;p&gt;I’ve found that most of the major tools have plenty of examples and demos to play with and active Discord channels. There’s also a general local-first community over at &lt;a href=&quot;https://localfirstweb.dev/&quot;&gt;https://localfirstweb.dev/&lt;/a&gt; and they hold regular meetups.&lt;/p&gt;
  1721. &lt;p&gt;Following along, I’m getting a lot of the same vibes that I got in the then-nascent React community circa 2014 or 2015.&lt;/p&gt;
  1722. &lt;p&gt;There are also a lot of interesting implications of local-first development in the realm of privacy, decentralization, data control and so on, but I’ll leave it to others more well-versed in these topics to flesh them out.&lt;/p&gt;
  1723. &lt;p&gt;And some more links below. Happy building!&lt;/p&gt;
  1724. &lt;ul&gt;
  1725. &lt;li&gt;&lt;a href=&quot;https://www.inkandswitch.com/local-first/&quot;&gt;https://www.inkandswitch.com/local-first/&lt;/a&gt;&lt;/li&gt;
  1726. &lt;li&gt;&lt;a href=&quot;https://tantaman.com/2022-08-23-why-sqlite-why-now.html&quot;&gt;https://tantaman.com/2022-08-23-why-sqlite-why-now.html&lt;/a&gt;&lt;/li&gt;
  1727. &lt;li&gt;&lt;a href=&quot;https://tonsky.me/blog/the-web-after-tomorrow/&quot;&gt;https://tonsky.me/blog/the-web-after-tomorrow/&lt;/a&gt;&lt;/li&gt;
  1728. &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=aJh2VVEDWw4&quot;&gt;https://www.youtube.com/watch?v=aJh2VVEDWw4&lt;/a&gt;&lt;/li&gt;
  1729. &lt;li&gt;&lt;a href=&quot;https://www.powersync.co/blog/sqlite-persistence-on-the-web&quot;&gt;https://www.powersync.co/blog/sqlite-persistence-on-the-web&lt;/a&gt;&lt;/li&gt;
  1730. &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Wo2m3jaJixU&quot;&gt;https://www.youtube.com/watch?v=Wo2m3jaJixU&lt;/a&gt;&lt;/li&gt;
  1731. &lt;li&gt;&lt;a href=&quot;https://www.wired.com/story/the-cloud-is-a-prison-can-the-local-first-software-movement-set-us-free/&quot;&gt;https://www.wired.com/story/the-cloud-is-a-prison-can-the-local-first-software-movement-set-us-free/&lt;/a&gt;&lt;/li&gt;
  1732. &lt;li&gt;&lt;a href=&quot;https://stopa.io/post/296&quot;&gt;https://stopa.io/post/296&lt;/a&gt;&lt;/li&gt;
  1733. &lt;li&gt;&lt;a href=&quot;https://www.figma.com/blog/how-figmas-multiplayer-technology-works/&quot;&gt;https://www.figma.com/blog/how-figmas-multiplayer-technology-works/&lt;/a&gt;&lt;/li&gt;
  1734. &lt;li&gt;&lt;a href=&quot;https://electric-sql.com/blog/2023/02/09/developing-local-first-software&quot;&gt;https://electric-sql.com/blog/2023/02/09/developing-local-first-software&lt;/a&gt;&lt;/li&gt;
  1735. &lt;li&gt;&lt;a href=&quot;https://electric-sql.com/blog/2022/12/16/evolution-state-transfer&quot;&gt;https://electric-sql.com/blog/2022/12/16/evolution-state-transfer&lt;/a&gt;&lt;/li&gt;
  1736. &lt;li&gt;&lt;a href=&quot;https://electric-sql.com/docs/reference/alternatives&quot;&gt;https://electric-sql.com/docs/reference/alternatives&lt;/a&gt;&lt;/li&gt;
  1737. &lt;li&gt;&lt;a href=&quot;https://twitter.com/artman/status/1558081796914483201&quot;&gt;Linear’s CTO’s thread on DX advantages of Local-First&lt;/a&gt;&lt;/li&gt;
  1738. &lt;li&gt;&lt;a href=&quot;https://gist.github.com/pesterhazy/3e039677f2e314cb77ffe3497ebca07b&quot;&gt;Building an offline realtime sync engine&lt;/a&gt;&lt;/li&gt;
  1739. &lt;li&gt;&lt;a href=&quot;https://twitter.com/samwillis/status/1694328387601362966&quot;&gt;Twitter thread with local-first use cases&lt;/a&gt;&lt;/li&gt;
  1740. &lt;/ul&gt;
  1741. &lt;p&gt;Discuss this post on &lt;a href=&quot;&quot;&gt;X.com née Twitter&lt;/a&gt;, &lt;a href=&quot;https://warpcast.com/kam/0x0c1632&quot;&gt;Farcaster&lt;/a&gt;, or &lt;a href=&quot;https://bsky.app/profile/kam.bsky.social/post/3k77qihvoip2h&quot;&gt;Bluesky&lt;/a&gt;&lt;/p&gt;
  1742. &lt;p&gt;&lt;em&gt;Thanks to Sam Bhagwat, Shannon Soper, Johannes Schickling, Andreas Klinger, Pekka Enberg, Anselm Eickhoff, and James Arthur for reading drafts of this post&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LLM Test Runners for Content]]></title><description><![CDATA[I wrote, maintained, and thought a lot about documentation for Gatsby. One thing that always bothered me is we couldn’t write tests for our…]]></description><link>https://bricolage.io/llm-test-runner-for-content/</link><guid isPermaLink="false">https://bricolage.io/llm-test-runner-for-content/</guid><pubDate>Thu, 16 Mar 2023 18:47:56 GMT</pubDate><content:encoded>&lt;p&gt;I wrote, maintained, and thought a lot about documentation for &lt;a href=&quot;https://www.gatsbyjs.com&quot;&gt;Gatsby&lt;/a&gt;. One thing that always bothered me is we couldn’t write tests for our docs. Automated tests are ubiquitous in software engineering because they help ensure that all critical behavior works as designed e.g. &lt;code class=&quot;language-text&quot;&gt;expect(add(2, 2)).toEqual(4)&lt;/code&gt;. Tests are especially helpful when many people edit the code as many people won’t fully understand every part of the codebase. Without tests, it’s easy to break behaviors while making unrelated changes.&lt;/p&gt;
  1743. &lt;p&gt;Documentation has this same problem. It might start correct but then over time, errors drift into the docs as it continues to be maintained and updated by many hands.&lt;/p&gt;
  1744. &lt;p&gt;But with LLMs, it looks like we can finally write tests for documentation. One of &lt;a href=&quot;https://www.youtube.com/live/outcGtbnMuQ?feature=share&amp;#x26;t=1147&quot;&gt;OpenAI’s demos for their recent GPT-4 launch&lt;/a&gt; showed them pasting a large chunk of the tax code and then asking it a complex question.&lt;/p&gt;
  1745. &lt;p&gt;Following this pattern, we can write tests for documentation. E.g. for an open source library’s README.md, we could ask it how to install the package and how to write a “hello world” implementation and assert against the responses. Potentially we could even write tests to run against the returned code. “LLM, write a server that processes user input and checks for these errors”. TDD for docs would be possible. What 10 questions should this new doc answer? Write the tests and keep improving the doc until the tests pass.&lt;/p&gt;
  1746. &lt;p&gt;This approach could be useful for testing any form of informative text. Perhaps you have code that generates a wide variety of emails. You could write tests to ensure recipients can understand the key information for each email variant.&lt;/p&gt;
  1747. &lt;p&gt;With LLMs, text is both now a compile target &lt;em&gt;and&lt;/em&gt; source code.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A Social Protocols OS]]></title><description><![CDATA[My wife and I often talk about the difficulty of making friends as adults. There’s lots of articles online about this so I won’t rehash them…]]></description><link>https://bricolage.io/a-social-protocols-os/</link><guid isPermaLink="false">https://bricolage.io/a-social-protocols-os/</guid><pubDate>Tue, 14 Mar 2023 18:47:56 GMT</pubDate><content:encoded>&lt;p&gt;My wife and I often talk about the difficulty of making friends as adults. There’s lots of articles online about this so I won’t rehash them — what’s been on my mind recently is that the root of the problem is broader than it appears, and understanding that root leads to novel solutions.&lt;/p&gt;
  1748. &lt;p&gt;The root issue is that we’ve collectively forgotten how to run complex social arrangements. Institutional decay is everywhere and our societal base of knowledge/skill to revitalize them have weakened.&lt;/p&gt;
  1749. &lt;p&gt;In the past, making friends was a byproduct of participating in the larger social protocols of society. You meet people at church, civic groups, gardening clubs, etc. and gradually become friends and frequently hangout. These rich lower-level relationships strengthened and informed the higher-level institutions.&lt;/p&gt;
  1750. &lt;p&gt;Because people participated in these social protocols from childhood, they were more skilled at running them. To give some literary examples, Mark Twain’s “Cannibalism in the Cars” narrates how a group of snowbound train passengers instantly enact comprehensive parliamentary procedures to vote on who gets eaten. Twain clearly assumes that any educated person in the story and reading the story would be familiar with parliamentary rules. The series of teenage novels “Mad Scientist Club” written in the 60s in the US has a group of teenager friends who decide to create a scientist club and immediately elect officials and a treasurer for shared expenses w/o any preamble to explain how they all work. I suspect not even 1 in 10 people alive today could organize and run a club without reading a book about it first.&lt;/p&gt;
  1751. &lt;p&gt;This isn’t a new thesis — the book “Bowling Alone”, released in 2000, extensively documented the decline of social and civic involvement from the 1970s on — pinning the blame largely on TV, that it proved more interesting than hanging out with people.&lt;/p&gt;
  1752. &lt;p&gt;Social media is furthering this trend of digital leisure activities supplanting IRL socializing and civic involvement.&lt;/p&gt;
  1753. &lt;p&gt;I’m not arguing against this trend per se — TV and social media are very fun — I’m perfectly happy staying home most nights of the week — but I’m convinced we’ll always need close IRL friends &amp;#x26; varied social interactions to be happy &amp;#x26; generative throughout life. Many of the richest experiences we can have are in deep complex, creative relationships with others.&lt;/p&gt;
  1754. &lt;p&gt;But we’re not going to stop watching TV or scrolling through feeds. So how can our society bootstrap the individual skills and group social capital necessary for the vast majority of people to have great social experiences and to keep solving all the problems reality keeps throwing at us? Build a sort of Strategic Social Capital Reserve?&lt;/p&gt;
  1755. &lt;p&gt;Many of us in the Web 1.0 and early 2.0 eras expected the internet to help with this. And while I love Twitter, etc. and have found many friends through them —  they have a big weakness — social networking platforms have little incentive to help us form friendships or to support strong IRL communities. They’re ad-driven and ads work best when we’re glued to our screens consuming the best content from around the globe. They’d much rather us quote tweeting each other in dark rooms in our underwear than enjoying a relaxing dinner out with friends.&lt;/p&gt;
  1756. &lt;p&gt;Cory Doctorow wrote recently about how and why social networks steadily get less aligned with our interests — &lt;a href=&quot;https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys&quot;&gt;Tiktok’s enshittification&lt;/a&gt;.&lt;/p&gt;
  1757. &lt;p&gt;What if we had social networks that are actually incentivized to help us form complex friendships and groups that work well together over time?&lt;/p&gt;
  1758. &lt;p&gt;There’s a lot of groups exploring this space right now.&lt;/p&gt;
  1759. &lt;p&gt;New social networks include &lt;a href=&quot;https://www.farcaster.xyz/&quot;&gt;Farcaster&lt;/a&gt;, &lt;a href=&quot;https://blueskyweb.xyz/&quot;&gt;Bluesky&lt;/a&gt;, &lt;a href=&quot;https://nostr.com/&quot;&gt;Nostr&lt;/a&gt;, and &lt;a href=&quot;https://www.lens.xyz/&quot;&gt;Len&lt;/a&gt;s. These are all based on decentralized ideas and rely on Blockchain technologies.&lt;/p&gt;
  1760. &lt;p&gt;Decentralized autonomous organizations (DAOs) are exploring how to safely collaborate with internet strangers without centralized leadership.&lt;/p&gt;
  1761. &lt;p&gt;“&lt;a href=&quot;https://efdn.notion.site/Summer-of-Protocols-3d7983d922184c4eb72749e9cb60d076&quot;&gt;Summer of Protocols&lt;/a&gt;” is spinning up a summer research program to take a broad look at protocols. Their “whitepaper” &lt;a href=&quot;https://venkatesh-rao.gitbook.io/summer-of-protocols/&quot;&gt;The Unreasonable Sufficiency of Protocols&lt;/a&gt; and &lt;a href=&quot;https://efdn.notion.site/0314a1800b774258a8e6197487c479bc?v=15fb6b39a490413cbba3b7f78ad67c2b&quot;&gt;reading list&lt;/a&gt; are an excellent deep dive into protocols (if this is interesting, the &lt;a href=&quot;https://efdn.notion.site/Application-5b71c238d6bd44cf9137946ef7767e53&quot;&gt;application deadline is March 21&lt;/a&gt;)&lt;/p&gt;
  1762. &lt;p&gt;My mind keeps going to what seems like a missing hole in all this — how do we make it easier to design, share, and run complex social protocols? We have low-level social primitives like messaging and group “containers” like Facebook Groups, Reddit, and Discord but nothing it seems that helps these level up to more sophisticated behaviors.&lt;/p&gt;
  1763. &lt;p&gt;The world has changed a great deal in the last few decades and many of our old protocols don’t seem to work as well anymore. We need new easy to learn and run protocols (probably mostly digital) that help reduce friction to hanging out and working together.&lt;/p&gt;
  1764. &lt;p&gt;The SaaS software explosion might provide a lead — it’s been 20 years of taking business processes run in webware (often topped with gray hair) and porting them to web apps. This improves business efficiencies as they encapsulate many of the hard parts to business processes so companies operate more efficiently.&lt;/p&gt;
  1765. &lt;p&gt;Digitally mediated social protocols make a lot of sense to me. And perhaps my brain has been addled by too much time writing open source and frameworks but it seems like there should be a protocol OS and framework for designing and running social protocols which then can be &lt;em&gt;invoked&lt;/em&gt; by groups.&lt;/p&gt;
  1766. &lt;p&gt;Want to run a club? Invoke the club protocol and you get yearly elections of officers, dues collection, etc. Want to run a book group? Pick one of five popular maintained book group protocols off the shelf and get going. Want to do a monthly potluck dinner with a few other families? Grab it and it’ll help you arrange who’s hosting, the date, the time, dish assignments, etc.&lt;/p&gt;
  1767. &lt;p&gt;This Social Protocol OS can be a layer that runs on top of social networks and messaging apps and arbitrary protocol programs can be written to run on top of it.&lt;/p&gt;
  1768. &lt;p&gt;The common theme of social protocols is they help facilitate the coordination that must happen so that it’s easy to get to the fun part of hanging out and working on stuff together.&lt;/p&gt;
  1769. &lt;p&gt;Alfred Whitehead said “Civilization advances by extending the number of important operations we can perform without thinking about them”. What if many social protocols that are currently very difficult to do became almost trivial? E.g. I’ve never run a conference but those that have say it’s shockingly hard. What if it &lt;em&gt;was&lt;/em&gt; approachable by a normal non-operations genius? It seems like the world should have far more 10-100 person conferences than it does right now.&lt;/p&gt;
  1770. &lt;p&gt;There’s an immense depth of social protocols from societies around the world that we could lean on for revitalizing society after the upheavals of the past decades. An internet-mediated fusion society. We regularly eat and cook dishes from all over the world. Why can’t we mix and match from the best social protocols from around the world and across history?&lt;/p&gt;
  1771. &lt;p&gt;If a DAO figures out a more effective way of doing things — why can’t they release that as an open source protocol? Or PR improvements to a library. We could encode the best collaboration/decision-making protocols in open source code and iterate on them together. A composable library of social protocols we can use together to create familiar and novel communities.&lt;/p&gt;
  1772. &lt;p&gt;I use a running and weight training app which reliably takes me from terrible shape to very fast and strong in 6 months. Could we do the same for groups? Scale them from simple low-trust interactions to complex high-trust interactions over a year or two?&lt;/p&gt;
  1773. &lt;p&gt;Or is this too cyperpunk-ish and cold and unworkable?&lt;/p&gt;
  1774. &lt;p&gt;My main question now is if there’s a there there. This is a complex space with a lot of history. If you’re interested or have thoughts — please reach out, I’d love to chat. Also a concrete use case or two would be idle for tinkering with the idea e.g. you’d like a Discord bot to coordinate your group doing something.&lt;/p&gt;
  1775. &lt;p&gt;&lt;em&gt;Thanks to Shannon Soper, Kerry Soper, Sam Bhagwat, and Venkatesh Rao for reading drafts of this post&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Situated Software for Hyper-local, Hyper-yummy Ice Cream]]></title><description><![CDATA[My wife and I are working on a fun side project to create a micro-business to make and sell homemade ice cream to our neighbors. We’ve been…]]></description><link>https://bricolage.io/situated-software-hyper-local-ice-cream-business/</link><guid isPermaLink="false">https://bricolage.io/situated-software-hyper-local-ice-cream-business/</guid><pubDate>Wed, 28 Apr 2021 18:59:39 GMT</pubDate><content:encoded>&lt;p&gt;My wife and I are working on a fun side project to create a micro-business to make and sell homemade ice cream to our neighbors. We’ve been fiddling with designs for a few weeks and I’m going to start building the web app soon. I’ll be live streaming all the coding so &lt;a href=&quot;https://twitter.com/kylemathews&quot;&gt;follow me on Twitter&lt;/a&gt; to see announcements on that.&lt;/p&gt;
  1776. &lt;h2 id=&quot;storyidea&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#storyidea&quot; aria-label=&quot;storyidea permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Story/Idea&lt;/h2&gt;
  1777. &lt;p&gt;We had our first child last August (pandemic baby, baby). As a treat, I fulfilled a childhood dream and bought a fancy ice cream maker. Which ended up being great fun as the fresh ice cream helped distract / soothe our stressed / exhausted new parent brains. For a week or so post-birth I was making a new flavor once or twice a day for ourselves and my in-laws who were staying helping out.&lt;/p&gt;
  1778. &lt;p&gt;&lt;img src=&quot;/d092fb1f0ca05e57a98e0b1a8695f67d/first-ice-cream.jpg&quot; alt=&quot;One of the first ice creams we made&quot;&gt;
  1779. &lt;em&gt;One of the first ice creams we made last August&lt;/em&gt;&lt;/p&gt;
  1780. &lt;p&gt;One of the problems with making ice cream (all desserts really) is that once you make it you… end up eating it. Ice cream, while delicious, is not perhaps the key component of a healthy balanced diet.&lt;/p&gt;
  1781. &lt;p&gt;So I have the dilemma that I want to make all the ice cream flavors but can’t eat them fast enough.&lt;/p&gt;
  1782. &lt;p&gt;My wife and I have also felt isolated during the pandemic (like most people) and want ways to (re)connect with neighbors and make friends.&lt;/p&gt;
  1783. &lt;p&gt;I’ve also been looking for good streaming projects for Gatsby to show off all the work we’re doing on the framework and in &lt;a href=&quot;https://www.gatsbyjs.com/products/cloud/&quot;&gt;Gatsby Cloud&lt;/a&gt; like &lt;a href=&quot;https://github.com/gatsbyjs/gatsby/discussions/30735&quot;&gt;functions&lt;/a&gt; and &lt;a href=&quot;https://www.gatsbyjs.com/products/cloud/hosting/&quot;&gt;hosting&lt;/a&gt;.&lt;/p&gt;
  1784. &lt;p&gt;So sprung forth the idea of creating a new ice cream micro-business. We create a web app where people could browse our flavors (seasonal from our backyard fruit trees and local grocery store) and schedule a time for us to deliver the home-made hyper-fresh, hyper-local, hyper-yummy ice cream.&lt;/p&gt;
  1785. &lt;p&gt;And then once a week or so, we’ll strap the little guy into his stroller, meander over to the nearby grocery store to pick up ingredients, make the ice cream, then deliver the ice cream (leaving a bit left-over at home for tasting).&lt;/p&gt;
  1786. &lt;p&gt;We’ll restrict stroller delivery to within a 1/2 mile (people further out can pick up)&lt;/p&gt;
  1787. &lt;p&gt;&lt;span
  1788.      class=&quot;gatsby-resp-image-wrapper&quot;
  1789.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1790.    &gt;
  1791.      &lt;a
  1792.    class=&quot;gatsby-resp-image-link&quot;
  1793.    href=&quot;/static/0f355484b9bf2e3b6ac56f04422687ec/9568a/little-cutie.jpg&quot;
  1794.    style=&quot;display: block&quot;
  1795.    target=&quot;_blank&quot;
  1796.    rel=&quot;noopener&quot;
  1797.  &gt;
  1798.    &lt;span
  1799.    class=&quot;gatsby-resp-image-background-image&quot;
  1800.    style=&quot;padding-bottom: 133.1081081081081%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAwUC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgME/9oADAMBAAIQAxAAAAGtXRUR3TOJJWV+9UWSok//xAAeEAACAgICAwAAAAAAAAAAAAACAwERABMSMyExMv/aAAgBAQABBQJzTGdx2s+S3VZ+c2RUe8CyGO9vUj5//8QAGBEBAQADAAAAAAAAAAAAAAAAACEBAhH/2gAIAQMBAT8BiNsV1//EABkRAQACAwAAAAAAAAAAAAAAAAABAhIhMv/aAAgBAgEBPwHabK8sX//EAB0QAAICAQUAAAAAAAAAAAAAAAABESECMVFhcYH/2gAIAQEABj8C3EJ5akkcCpl2MqjwY+z/xAAcEAEAAgMBAQEAAAAAAAAAAAABABEhMUFRYbH/2gAIAQEAAT8hyTD8nzL1idrCGm2a16w1EBw/YATjIrdhVBC96OxWKjyCqmrTGnrMZf/aAAwDAQACAAMAAAAQVCA9/8QAGREAAgMBAAAAAAAAAAAAAAAAAAEQITFh/9oACAEDAQE/EOtE4Gh//8QAGBEAAwEBAAAAAAAAAAAAAAAAAAERMSH/2gAIAQIBAT8QmlgyjpCH0//EAB8QAQADAAEEAwAAAAAAAAAAAAEAESExQWGBoVGR8P/aAAgBAQABPxAdhXFuvpKirYUre8TGaM5pS/UQAFluqTj9xEr2yOnwHg8zPcw6Z4hIBgUbeW/cwVXaVAB2EV0YRFSZDrtzVw6d42mpafRP/9k=&apos;); background-size: cover; display: block;&quot;
  1801.  &gt;&lt;/span&gt;
  1802.  &lt;img
  1803.        class=&quot;gatsby-resp-image-image&quot;
  1804.        alt=&quot;little cutie&quot;
  1805.        title=&quot;&quot;
  1806.        src=&quot;/static/0f355484b9bf2e3b6ac56f04422687ec/1c72d/little-cutie.jpg&quot;
  1807.        srcset=&quot;/static/0f355484b9bf2e3b6ac56f04422687ec/a80bd/little-cutie.jpg 148w,
  1808. /static/0f355484b9bf2e3b6ac56f04422687ec/1c91a/little-cutie.jpg 295w,
  1809. /static/0f355484b9bf2e3b6ac56f04422687ec/1c72d/little-cutie.jpg 590w,
  1810. /static/0f355484b9bf2e3b6ac56f04422687ec/a8a14/little-cutie.jpg 885w,
  1811. /static/0f355484b9bf2e3b6ac56f04422687ec/fbd2c/little-cutie.jpg 1180w,
  1812. /static/0f355484b9bf2e3b6ac56f04422687ec/9568a/little-cutie.jpg 3024w&quot;
  1813.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1814.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1815.        loading=&quot;lazy&quot;
  1816.        decoding=&quot;async&quot;
  1817.      /&gt;
  1818.  &lt;/a&gt;
  1819.    &lt;/span&gt;
  1820. &lt;em&gt;and who wouldn’t want delicious fresh-made ice cream delivered by this cutie??&lt;/em&gt;&lt;/p&gt;
  1821. &lt;h2 id=&quot;situated-software&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#situated-software&quot; aria-label=&quot;situated software permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Situated Software&lt;/h2&gt;
  1822. &lt;p&gt;Something I’ve been thinking about for a decade+ is the idea of &lt;em&gt;Situated Software&lt;/em&gt;. &lt;a href=&quot;https://www.gwern.net/docs/technology/2004-03-30-shirky-situatedsoftware.html&quot;&gt;Clay Shirky defines it as&lt;/a&gt;:&lt;/p&gt;
  1823. &lt;blockquote&gt;
  1824. &lt;p&gt;software designed in and for a particular social situation or context. This way of making software is in contrast with what I’ll call the Web School (the paradigm I learned to program in), where scalability, generality, and completeness were the key virtues.)&lt;/p&gt;
  1825. &lt;/blockquote&gt;
  1826. &lt;p&gt;Software is great. I’ve write some of it and interact with lots more of it in all the physical/virtual parts of my life.&lt;/p&gt;
  1827. &lt;p&gt;But I think we should and will have a lot more of it.&lt;/p&gt;
  1828. &lt;p&gt;How will we get more great software? One theory I have is we’re approaching a saturation point for the global or “Web School” scale software. How many Googles do we need? Amazons? There’s 10s of thousands of SaaS services with seemingly no end in sight but the niches they’re chasing seems smaller and smaller. There’s millions of mobile apps out there. But software at the scale of the individual, family, neighborhood, community, etc. are all relatively unexplored spaces. The explosion of #nocode software products is strong evidence of this.&lt;/p&gt;
  1829. &lt;p&gt;As Richard Feynman famously said about nanotechnology, “there’s plenty of room at the bottom”.&lt;/p&gt;
  1830. &lt;p&gt;So this project is also an exploration of this the idea of situated software. How practical is it to build software that only my family and a few neighbors use?&lt;/p&gt;
  1831. &lt;p&gt;If, in fact, writing high quality software is easier now than ever — easier to start projects, build, ship, and maintain software — then we should see a lot more situated software get written.&lt;/p&gt;
  1832. &lt;p&gt;Historically, I haven’t ended up enjoying side projects. They’re fun at first but the friction of ongoing maintenance and having to re-orient myself every time I want to change something end up sucking the fun out of them.&lt;/p&gt;
  1833. &lt;p&gt;I’m really curious if the strong conventions of Gatsby, painless CI/CD and hosting with Gatsby Cloud, and liberal usage of hosted services for the more complicated bits end up making this fun side project stay fun.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Do you actually want your own open source project?]]></title><description><![CDATA[Open source is great! It’s an amazing way to grow as a developer, influence our craft, make friends, build your online resume, and help…]]></description><link>https://bricolage.io/do-you-want-your-own-open-source-project/</link><guid isPermaLink="false">https://bricolage.io/do-you-want-your-own-open-source-project/</guid><pubDate>Fri, 19 Jul 2019 12:29:30 GMT</pubDate><content:encoded>&lt;p&gt;Open source is great! It’s an amazing way to grow as a developer, influence our craft, make friends, build your online resume, and help solve your own and others’ problems.&lt;/p&gt;
  1834. &lt;p&gt;Open source is terrible! Angry issues, ambiguous PRs, pressure to maintain projects you’re not using anymore — all start to feel like the worst sort of homework.&lt;/p&gt;
  1835. &lt;p&gt;Deciding to start and run open source projects is a tough choice — there’s no right choice for any person, life context, and project and many people rightfully avoid it.&lt;/p&gt;
  1836. &lt;p&gt;Here’s a few thoughts:&lt;/p&gt;
  1837. &lt;h2 id=&quot;it-is-a-lot-of-work&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-is-a-lot-of-work&quot; aria-label=&quot;it is a lot of work permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It &lt;em&gt;is&lt;/em&gt; a lot of work&lt;/h2&gt;
  1838. &lt;p&gt;Go in expecting this. Some projects start busy and work gradually declines as the project approaches “done”. Many others continue to demand more and more work as time passes. It might be fun at first to work all day Saturday on your project but that won’t last.&lt;/p&gt;
  1839. &lt;h2 id=&quot;what-is-your-motive&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-your-motive&quot; aria-label=&quot;what is your motive permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is your motive?&lt;/h2&gt;
  1840. &lt;p&gt;These are some motives that are strong and sustainable and will
  1841. keep things fun and rewarding even when the project feels especially demanding:&lt;/p&gt;
  1842. &lt;ul&gt;
  1843. &lt;li&gt;You need the project for your job&lt;/li&gt;
  1844. &lt;li&gt;You like making friends with other OSS developers&lt;/li&gt;
  1845. &lt;li&gt;You want to innovate and influence the direction of our craft&lt;/li&gt;
  1846. &lt;li&gt;You want to solve an annoying problem you keep encountering&lt;/li&gt;
  1847. &lt;li&gt;You love learning. OSS projects bring a constant stream of new challenges your way.&lt;/li&gt;
  1848. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Building a Slack bot to help handle large numbers of PRs]]></title><description><![CDATA[Gatsby gets a lot of PRs. We’ve been averaging ~100 / week for the past few months. And even with the great OSS team we’ve built, this is a…]]></description><link>https://bricolage.io/bulding-a-slack-bot-to-help-handle-large-numbers-of-prs/</link><guid isPermaLink="false">https://bricolage.io/bulding-a-slack-bot-to-help-handle-large-numbers-of-prs/</guid><pubDate>Mon, 22 Apr 2019 06:37:26 GMT</pubDate><content:encoded>&lt;p&gt;Gatsby gets a lot of PRs. We’ve been averaging ~100 / week for the past few months. And even with the great OSS team we’ve built, this is a lot of code changes to keep on top of.&lt;/p&gt;
  1849. &lt;p&gt;For most of Gatsby’s history, we’ve been able to rely on GitHub’s built-in notification and sorting tools to track PRs and make sure we’re giving adequate attention to different proposals that are coming in. But it’s felt the last few months like we’re reaching the limits of these tools. We’ll sometimes miss PRs in the flood of notifications and everyone feels stretched.&lt;/p&gt;
  1850. &lt;p&gt;Scaling projects often introduce novel problems. And novel problems can only mean one thing! Time for some theory!!&lt;/p&gt;
  1851. &lt;p&gt;My all-time favorite product theory book is &lt;a href=&quot;https://www.amazon.com/dp/B007TKU0O0/ref=dp-kindle-redirect?_encoding=UTF8&amp;#x26;btkr=1&quot;&gt;&lt;em&gt;The Principles of Product Development Flow&lt;/em&gt;&lt;/a&gt; which has unparalleled depth of analysis around what really makes product development tick.&lt;/p&gt;
  1852. &lt;p&gt;&lt;span
  1853.      class=&quot;gatsby-resp-image-wrapper&quot;
  1854.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1855.    &gt;
  1856.      &lt;a
  1857.    class=&quot;gatsby-resp-image-link&quot;
  1858.    href=&quot;/static/c728602a25412efa36e955a50290b1e6/daed9/product-development-flow.png&quot;
  1859.    style=&quot;display: block&quot;
  1860.    target=&quot;_blank&quot;
  1861.    rel=&quot;noopener&quot;
  1862.  &gt;
  1863.    &lt;span
  1864.    class=&quot;gatsby-resp-image-background-image&quot;
  1865.    style=&quot;padding-bottom: 150.67567567567568%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAACXBIWXMAABYlAAAWJQFJUiTwAAAHkklEQVR42h2V2VOb5xXG9Sd0ppftTafTTtvMNMlM3Ca2Y2RjwOyIVRK7BFoQi0AIhDYQaBdCu8QiEIvF6rAYTKhxUidNpm6m6VX79/x64OKdM/PN+z3nnOc853kVjf0uGgY8cly06RzUaSep77bRORKgSeehosWEasiLZiJG18QKfbM5dJ4i5tA+49FDLMFdBt1rmEIHjMdPUWhMPjRDDrr1NrQGJxrzEhO2edSmeZqGQ9R2jdHePUptqx5l2yhV2mmetuipVOmp752WpE4pZgaV2U/7yBKKj5Uq/vhZBb/95Am/f9TJJ9VDfFY/yqe1I3zyYog6Q5TGYbksPw4OGqlu6ODBsza+qFbzvGMC7XiEWumooX+WKrUVxa8++gu/+M1H/PJ3n/Knp2q+6HCj7E/wQDXJQ/UMzZOrPNcvobElcHjncbumcPoWsTojzDqc1KvNVDSb6TYuYHenUfz6z4/4VFnDk5YelD1eng9lqOgNCJidxvEcKtsanbMlqocDNFv8rBVi+EMxguEYxrFxqjXTbG8fc3P5hu9ur6XCjx+jsXjIHPzAVOo9tdaveNwb51FvlEpjhvqJNRpHs1Tq/DIYP67FIGZ7iHQ6SW3bEJuFdT7cnvPz91d8c/sOxR+UnSyt35I/+x+O9C0j/hOGXVsYFg7w5F7jzF3TPbMuJ4/RlaJB52LMncI+52PYMMGP1yf85/s3/PzPbwksr6PQuk9Y3PoXi/lrFjIXxLbeEVm/JLP3lsTet5QufsIl373pY/qcazwfWEQzlaKyfRTLpI+j8jH//ek9r89OmRReFX2Lb3HnvsGduqTTVsLgO2JkYYcWcxy9d4+GsU3qRlK8MEZRTWSpG45QZ4zwsNlCx1iKmfAh+ydf445sshSKo+icPcWRuiGwJmf9LYWD9+R3rwkUzgmu39A+vSv8hWkcy1A5GKB6SGQyFOJx65RMfgNL4IzplUvU1hWMMzEUrVMHWPynjPkP6Zpcp2E4RqthSTgrorZvMxZ+hc61gX5+hyFnnt6ZHMpu2aBOB9qZEpbIFcbAV3RYU7Raoigax19Ku29Ilt4TL94SW70gUbwkf/Ate69/Jn/0b0rnH9j46gOF8i226Cs+V83yrCdM91wZY/CSPs++AGZpMgakwsl96g1Zeq1WesbHedJq4qnaxkNtmj57DGvQK+1uop4KUdUvK2mL8Eg1Rueoh27nEcbQG9Qzm6hGV6jT+1DUjhwyFXBx+76ZMVcfxb0WBmcmabO4OLtu4/RrDdldE6sv+3BHddx+147D38lq2UK7/RxD8IIOEb9KBtRkFg4r9fskNsf58UMD7QY9R+eypx0+tk802EJ2avQxrt61sLHfx/6rZq7eqjg+b2DUn6TH/YaBhWOpcIvW8axwXhRA3Q4HF/0sJk20GUb4+z/qaDHZObroIFSwsLymE+5MHJx3cXKp5vXbTl6eqKgx7DAcuELrLN8DNo0k6HW9RNFg2cITt/JEHeDzlhmK+1qCWR0thmmKB/1ktkdELmlcMaNM2YcroqN/aoKmsTL6pSs67Fv3LTeYYuh8JyjqzTtCeIKBmQXazdNCrIdmk5v+GSctI16RT5IhTwztxCzD3gjKrlkets3T7ThkwHdxD6iaKIjgQ5hjNzIU0zajiwEZjB3j3CizkQlMHrvwN40jZmc+58OZ8OKKT+PN3pmog8ddy2jmzulynNI8vn7fbvNYAUdWAKsG8gw6AthDVoZmzOhmbUwFp3AsC1jKwWQ4gj3qxpXwMJcIMp8Yly1ykygniZTCRLc8tI76GXBus7ohfljZmxCJRKRdG/UDE9KylwZ5Q7Q2H/2OGD2zCeoGZ+kWHaonFugQq7MsLmNdLmNeyqJzx9FOJlkvbpBMLKKoGUyi1MZ50OzjQcs8X6rDKHuTPNbEeT64KgPJ8KBpTu7EeNqX4XFnjBeGEl2zF9SPFGXaedKFItlMmPhy8A5QrKhXLneH5ISpkFitS1EliWoNOYkrfKGao0Zi9V1yTUBEvIXWccQLcwHrUpHdUppcdoX9UuIOMC1AUSq0MkGJSgGt7I/fxxp9WuTk568tTgEv8Kh94V5ed4BtU2V5Uoti/0VSyRh7xQQXhxkUL/RZavpXZLGzNBrTMv6k7LZU2C+uM7oq7pOQJzJDp3WLmh6/6DNNx+Quqsk9IuktCvkk6XiY460oP7wTYVcNZhkQLflzlyxmX+MTd7ZHxGTny+LglyykXokL3eBNnOFePiS8+rVoc59h9y4vdzYIh8Pk4j5+vCnx7rqMom44T82AVNQXF0uKSmXLVPbFqJV2a4TLiq4l7gb3QifUaEKigjSNlhIrhTKbaykWF7yclGJ8/7c9TsqFu5ZzVPcleN63cs/bs95lAV4WsIx8Ey41YXHorCTIiK2JYw9kGJVn4vLsgEg4QCkX5Oooy9lBnvPDnFRoWJWqEjzVRuVEBDAmxAe5G9Yd4LPumPBakBgV2/dKogIbO2ecHW0TCS5xsZfk/CDH65M1Xu6tyupJy1VSoVJA7qpRasN82bF0n6RSKq3ulwdKl+WRgH0uOtXZNzk93icaiVJY8fPmMMv12TY38pzm10v8H7G9oYW3kx6dAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  1866.  &gt;&lt;/span&gt;
  1867.  &lt;img
  1868.        class=&quot;gatsby-resp-image-image&quot;
  1869.        alt=&quot;cover of book Product Development Flow&quot;
  1870.        title=&quot;&quot;
  1871.        src=&quot;/static/c728602a25412efa36e955a50290b1e6/fcda8/product-development-flow.png&quot;
  1872.        srcset=&quot;/static/c728602a25412efa36e955a50290b1e6/12f09/product-development-flow.png 148w,
  1873. /static/c728602a25412efa36e955a50290b1e6/e4a3f/product-development-flow.png 295w,
  1874. /static/c728602a25412efa36e955a50290b1e6/fcda8/product-development-flow.png 590w,
  1875. /static/c728602a25412efa36e955a50290b1e6/efc66/product-development-flow.png 885w,
  1876. /static/c728602a25412efa36e955a50290b1e6/c83ae/product-development-flow.png 1180w,
  1877. /static/c728602a25412efa36e955a50290b1e6/daed9/product-development-flow.png 1426w&quot;
  1878.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1879.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1880.        loading=&quot;lazy&quot;
  1881.        decoding=&quot;async&quot;
  1882.      /&gt;
  1883.  &lt;/a&gt;
  1884.    &lt;/span&gt;&lt;/p&gt;
  1885. &lt;p&gt;I highly recommend anyone deeply involved with product to read it. The book is about 10x deeper than the normal handwavey product advice you hear and ever so worth the time investment to wrap your head around its ideas.&lt;/p&gt;
  1886. &lt;p&gt;On a recent plane ride, I skimmed through the book looking for ideas to help us get a better handle on all the PRs we get.&lt;/p&gt;
  1887. &lt;h2 id=&quot;the-economic-basis-of-product-development&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-economic-basis-of-product-development&quot; aria-label=&quot;the economic basis of product development permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Economic Basis of Product Development&lt;/h2&gt;
  1888. &lt;p&gt;Chapter 2 jumps into what the author considers the most important subject of the book — how to determine the economic value of any work you might be doing. If you can’t determine that, than any other measures you might take to guide product development are on shaky foundations.&lt;/p&gt;
  1889. &lt;blockquote&gt;
  1890. &lt;p&gt;As obvious as this may seem, this economic view of product development is surprisingly uncommon. Instead, product developers create a large number of proxy objectives: increase innovation, improve quality, conform to plan, shorten development cycles, eliminate waste, etc. Unfortunately, they rarely understand how these proxy objectives quantitatively influence profits. Without this quantitative mapping, they cannot evaluate decisions that affect multiple interacting objectives.&lt;/p&gt;
  1891. &lt;/blockquote&gt;
  1892. &lt;p&gt;He dislikes proxies :-)&lt;/p&gt;
  1893. &lt;p&gt;We should measure what we actually care about — does some work contribute to the company’s mission and bottom line (directly or &lt;a href=&quot;https://www.amazon.com/dp/B004H4XD40/ref=dp-kindle-redirect?_encoding=UTF8&amp;#x26;btkr=1&quot;&gt;indirectly&lt;/a&gt;).&lt;/p&gt;
  1894. &lt;p&gt;Clearly for Gatsby, we think PRs and the people writing the PRs are valuable — in the sense that our mission is to directly help build people and communities and to create tools that empower people and organizations. We want contributors because participating in Open Source directly helps their career and their contributions directly improves Gatsby which benefits everyone using it and the better Gatsby becomes, the more viable our commerical products &amp;#x26; services become — which viability is what sustains and drives the whole process.&lt;/p&gt;
  1895. &lt;h2 id=&quot;managing-queues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#managing-queues&quot; aria-label=&quot;managing queues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Managing queues&lt;/h2&gt;
  1896. &lt;p&gt;The next chapter is on “Managing Queues”. Really fun stuff.&lt;/p&gt;
  1897. &lt;blockquote&gt;
  1898. &lt;p&gt;In the last chapter, I showed you how to use an economic framework to guide your product development decisions. When we use such a framework, we often discover that cycle time has high economic leverage. If we can find cheap ways to reduce cycle time, our profits go up. But what causes long product development cycle time?&lt;/p&gt;
  1899. &lt;/blockquote&gt;
  1900. &lt;p&gt;He dives into the theory of queues and how to manage queues — particularly when they get too long. Which theory was largely invented by a mathematician named Agner Karup Erlang (where have I heard that name before…🤔) at the Copehhangen Telephone Company who in 1909 was trying to determine how many phone lines were needed for a specific number of people.&lt;/p&gt;
  1901. &lt;p&gt;The main principle from there we’ve taken to heart at Gatsby is principle 4: “&lt;strong&gt;The Principle of High-Queue States: Most of the damage done by a queue is caused by high-queue states.&lt;/strong&gt;”&lt;/p&gt;
  1902. &lt;p&gt;“High-queue states” means in our context — too many PRs. PR count naturally flucuates as PRs come in semi-randomly and core maintainers have time to review and merge them. Sometimes these natural fluctuations mean the PR count soars to unusually high numbers. If not taken care of rapidly, this means the whole process of reviews will get bogged down.&lt;/p&gt;
  1903. &lt;p&gt;The current rule we’ve adopted is that 115 PRs is a warning state when more people should shift over to working on PRs and 130 is red state when everyone should stop what they’re doing to focus on PRs.&lt;/p&gt;
  1904. &lt;p&gt;This has been very successful as in the past, we’d at times get into 140+ PR count range and it’d kinda sit there for a few days until someone would finally heroically drive it down. Now PRs tend toward a 100-115 count and we rarely move past that for long.&lt;/p&gt;
  1905. &lt;h2 id=&quot;multiple-classes-of-queues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#multiple-classes-of-queues&quot; aria-label=&quot;multiple classes of queues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Multiple classes of queues?&lt;/h2&gt;
  1906. &lt;p&gt;But it didn’t still feel like we were measuring things correctly. We’ve been inconsistent at responding to PRs and sometimes valuable PRs have slipped through the cracks and sat untouched for months. E.g. at the recent Drupalcon, an engineer came up to me after my talk and mentioned he’d opened a PR that hadn’t gotten merged. I looked and it was a great PR and luckily &lt;a href=&quot;https://twitter.com/SchauDustin&quot;&gt;Dustin Schau&lt;/a&gt; (also at the conferece) was able to review and merge it immediately. Luckily the developer was still in the middle of his Gatsby/Drupal project and hadn’t had to go into production with this bug unfixed.&lt;/p&gt;
  1907. &lt;p&gt;It’s really bad when fixes like this don’t get reviewed and merged promptly. Not only is the contributor still having to work around the bug but unknown number of other users are also facing the same bug (and perhaps not able to work around it—meaning they might abandon Gatsby altogether). But even worse, if we fail to help the contributor quickly, they might end up feeling a bit snubbed and that we don’t want them contributing. We never know which casual first contribution, treated really well, is going to turn into a repeat contributor who invests deeply in the project and makes it their own.&lt;/p&gt;
  1908. &lt;p&gt;So with this in mind, I was reading chapter 6 on applying WIP constraints and ran across this principle:&lt;/p&gt;
  1909. &lt;blockquote&gt;
  1910. &lt;p&gt;The Principle of the Critical Queue: Constrain WIP in the section of the system where the queue is most expensive.&lt;/p&gt;
  1911. &lt;/blockquote&gt;
  1912. &lt;p&gt;It occurred to me that PRs weren’t actually &lt;em&gt;one&lt;/em&gt; queue but many. And that the different queues had different costs. A PR that has been opened and not reviewed is very different than a PR that was reviewed and is now awaiting contributor feedback.&lt;/p&gt;
  1913. &lt;p&gt;The first PR might be from a new contributor who needs to be made felt welcome and appreciated. The first PR might have a fix for a critical bug that’s affecting a lot of people. &lt;em&gt;Not&lt;/em&gt; reviewing the first PR is very expensive.&lt;/p&gt;
  1914. &lt;p&gt;The second PR, on the other hand, can sit for a bit while the contributor comes across more free time to respond to suggestions.&lt;/p&gt;
  1915. &lt;h2 id=&quot;applying-wip-constraints-to-pr-queues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#applying-wip-constraints-to-pr-queues&quot; aria-label=&quot;applying wip constraints to pr queues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Applying WIP constraints to PR queues&lt;/h2&gt;
  1916. &lt;p&gt;The trick now was how to identify the different queues and apply WIP constraints. When you think of PRs as hemogenous, then the normal GitHub PR view is great — you can view new PRs, the oldest PRs, etc. But when you want to split PRs up into different queues, lumping PRs into a single queue becomes a problem. The mass of PRs awaiting review are getting in the way of finding the few PRs that haven’t been reviewed!&lt;/p&gt;
  1917. &lt;p&gt;So time for some custom code.&lt;/p&gt;
  1918. &lt;p&gt;I didn’t want to create a new “view” of the different PR queues, but I wanted to apply WIP constraints — prevent the high cost queues from growing too large. And the easiest way to do that it seemed was to create a Slack bot that’d tell us when there were unreviewed PRs.&lt;/p&gt;
  1919. &lt;h2 id=&quot;onegraph&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#onegraph&quot; aria-label=&quot;onegraph permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OneGraph&lt;/h2&gt;
  1920. &lt;p&gt;Enter &lt;a href=&quot;https://www.onegraph.com/&quot;&gt;OneGraph&lt;/a&gt; — whose tagline sums things up nicely: “We handle the messy integration work.  You focus on the interesting problems.”&lt;/p&gt;
  1921. &lt;p&gt;Their mission resonates deeply with me as Gatsby is focused on a similar problem (in part) — how to get data out of APIs into websites without “messy integration work”.&lt;/p&gt;
  1922. &lt;p&gt;Anyone who’s worked with APIs know they’re often a riot (the bad sort, not e.g. a riot of color) of poorly documented &amp;#x26; inconsistent APIs locked behind authentication systems that seem just as determined to keep you out of your data as the bad actors. This isn’t a GraphQL vs. REST article but it’s hard not to mention that the excessively freeform nature of REST APIs pretty much guerentees this 😜 (This is not a knock against all the hard-working API teams out there — it’s just API design is a &lt;em&gt;hard&lt;/em&gt; problem and the lack of built-in constraints in most APIs doesn’t help).&lt;/p&gt;
  1923. &lt;p&gt;Anyways, OneGraph does a great job of fixing that by wrapping all the messiness of integrating with APIs into a consistent GraphQL based UI. Just look how beautiful this view from their dashboard is:&lt;/p&gt;
  1924. &lt;p&gt;![onegraph screenshot](onegraph screenshot.png)&lt;/p&gt;
  1925. &lt;p&gt;Just click on a provider, authenticate via oauth, and you’re off. That’s easily 100x faster than normal.&lt;/p&gt;
  1926. &lt;p&gt;So back to the Slack bot. With OneGraph, I quickly found the data that I needed from GitHub. OneGraph has a very nice “Code Exporter” that gives you starter code to run your queries from browser code or in node.js. I used that to pull the data into a node script where I could split PRs into the different queues.&lt;/p&gt;
  1927. &lt;p&gt;For generating the Slack messages, Slack &lt;a href=&quot;https://api.slack.com/tools/block-kit-builder&quot;&gt;has created a nice tool&lt;/a&gt; for designing how messages will look. I went back and forth between tweaking output in Slack’s design tool and applying those tweaks to the script until I had something I liked.&lt;/p&gt;
  1928. &lt;p&gt;![Screenshot 2019-04-22 18.31.26](Screenshot 2019-04-22 18.31.26.png)&lt;/p&gt;
  1929. &lt;h2 id=&quot;running-the-script-once-a-day&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#running-the-script-once-a-day&quot; aria-label=&quot;running the script once a day permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Running the script once a day&lt;/h2&gt;
  1930. &lt;p&gt;Now to a classic programming problem — how to run your code every so often? The classic solution is &lt;a href=&quot;https://en.wikipedia.org/wiki/Cron&quot;&gt;cron&lt;/a&gt;. But I didn’t want to create a VM running linux to run a little node script once a day. I’m a big fan of serverless and was curious which would be easiest to use for this.&lt;/p&gt;
  1931. &lt;p&gt;I &lt;a href=&quot;https://twitter.com/kylemathews/status/1119735659139223552&quot;&gt;tweeted out a question&lt;/a&gt; and soon had more than enough solutions to try.&lt;/p&gt;
  1932. &lt;p&gt;The one response that intrigued me the most was &lt;a href=&quot;https://render.com/&quot;&gt;render.com&lt;/a&gt; as someone literally tweeted a screenshot of a button in their web app that said “New Cron Job”.&lt;/p&gt;
  1933. &lt;p&gt;&lt;span
  1934.      class=&quot;gatsby-resp-image-wrapper&quot;
  1935.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 163px; &quot;
  1936.    &gt;
  1937.      &lt;a
  1938.    class=&quot;gatsby-resp-image-link&quot;
  1939.    href=&quot;/static/1c9b3a4ad59c9850cb278c61e5658927/222b7/D4oaYhAUwAAr9Hu.png&quot;
  1940.    style=&quot;display: block&quot;
  1941.    target=&quot;_blank&quot;
  1942.    rel=&quot;noopener&quot;
  1943.  &gt;
  1944.    &lt;span
  1945.    class=&quot;gatsby-resp-image-background-image&quot;
  1946.    style=&quot;padding-bottom: 45.27027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABSElEQVR42p2SS0vDQBSF+7/ci6iFuhBciPhauVEQVOqj0IUorS10o+BCSnc+t4J/QOsiCopRK2bapBrbSBdNJ0mTHGeSBmK7y8CXe3LnzsnlTmJm1wHHsKIRnA+I8YdlOwDcSDiu+884xs10w8GTRCFUOnioUJ8PisceQuidx6BGeKeoNSx0HdZtYMi/8iYbmNqVsXBQx2xGwTyLc9k6pvcUzOwrWMzxvL/HczwuFb6QSNWQOW16nVIzZPjMuptgm+lSAyuH38ieNXFy3ULh6hdrxyo7pCF/oSF3rmH1SEX+UkPppoXJtIyd4g/46oQNxSrF8LrETAnGksTTiW2C8U2CkQ3Jy3EdZ4wmJcS3CKutYmj5E6mi2jO0wzO02Zx03L60cf/K0VFmuizqvhb7aXvcsRqimv4MrYFbjrYGbjkQfKhR6P8X/wAnF4rZP47ImAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  1947.  &gt;&lt;/span&gt;
  1948.  &lt;img
  1949.        class=&quot;gatsby-resp-image-image&quot;
  1950.        alt=&quot;button that says new cron job&quot;
  1951.        title=&quot;&quot;
  1952.        src=&quot;/static/1c9b3a4ad59c9850cb278c61e5658927/222b7/D4oaYhAUwAAr9Hu.png&quot;
  1953.        srcset=&quot;/static/1c9b3a4ad59c9850cb278c61e5658927/12f09/D4oaYhAUwAAr9Hu.png 148w,
  1954. /static/1c9b3a4ad59c9850cb278c61e5658927/222b7/D4oaYhAUwAAr9Hu.png 163w&quot;
  1955.        sizes=&quot;(max-width: 163px) 100vw, 163px&quot;
  1956.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  1957.        loading=&quot;lazy&quot;
  1958.        decoding=&quot;async&quot;
  1959.      /&gt;
  1960.  &lt;/a&gt;
  1961.    &lt;/span&gt;&lt;/p&gt;
  1962. &lt;p&gt;That seems on point.&lt;/p&gt;
  1963. &lt;p&gt;Also, (perhaps not coincidentally!), their site is built on Gatsby.&lt;/p&gt;
  1964. &lt;p&gt;And sure enough, five minutes later, after connecting the GitHub repo for the project and instructing it how to build and run the code, the Slack bot was set to run daily.&lt;/p&gt;
  1965. &lt;h2 id=&quot;early-results&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#early-results&quot; aria-label=&quot;early results permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Early Results&lt;/h2&gt;
  1966. &lt;p&gt;With this we discovered we had six PRs that hadn’t had any reviews — several that were close to a month old. Those got reviewed quickly (the last one in the screenshot above is waiting a core member’s review who’s on holidays until tomorrow).&lt;/p&gt;
  1967. &lt;p&gt;We’ve eaten into the other queue as well and expect to bring it down quickly as well.&lt;/p&gt;
  1968. &lt;p&gt;As a new tool, we’ll be iterating rapidly on the tool design as we discover what helps.&lt;/p&gt;
  1969. &lt;h2 id=&quot;next-steps&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#next-steps&quot; aria-label=&quot;next steps permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Next steps&lt;/h2&gt;
  1970. &lt;ul&gt;
  1971. &lt;li&gt;&lt;strong&gt;Let maintainers generate the report on demand in addition to sending it once a day&lt;/strong&gt; — sometimes it’s nice to see evidence your hard work is making an impact + if another maintainer has already been working on reviewing PRs, a fresh list is necessary to know where to dive in at.&lt;/li&gt;
  1972. &lt;li&gt;&lt;strong&gt;Create a public dashboard&lt;/strong&gt;. We only use Slack for those of us who work at Gasby Inc. A public dashboard with the same info is necessary to let everyone help out with high value PRs + it provides public accountability for how well we’re doing.&lt;/li&gt;
  1973. &lt;li&gt;&lt;strong&gt;Alert more frequently on really high value queues&lt;/strong&gt; — e.g. PRs that have been reviewed and accepted and whose tests are now passing. Those just need a click of the merge button and publish for the fix or improvement to out in the wild.&lt;/li&gt;
  1974. &lt;li&gt;&lt;strong&gt;Add &lt;a href=&quot;https://kanbantool.com/cumulative-flow-diagram&quot;&gt;Cumulative Flow Diagrams (CFD)&lt;/a&gt;&lt;/strong&gt;. Very useful tool (the book says its the most useful tool for managing queues) to visualize in and out going PRs. It’d be great to add one for the different PR queues. &lt;span
  1975.      class=&quot;gatsby-resp-image-wrapper&quot;
  1976.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  1977.    &gt;
  1978.      &lt;a
  1979.    class=&quot;gatsby-resp-image-link&quot;
  1980.    href=&quot;/static/805b100edc7c937e31bb26bb153715ec/a6d36/kanban-tool-cumulative-flow-diagram-20190422184204049.png&quot;
  1981.    style=&quot;display: block&quot;
  1982.    target=&quot;_blank&quot;
  1983.    rel=&quot;noopener&quot;
  1984.  &gt;
  1985.    &lt;span
  1986.    class=&quot;gatsby-resp-image-background-image&quot;
  1987.    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACU0lEQVR42oVS/U9SYRS+/1q/uKI1c1mbom0G8gvKlGEaiaIyHE4rpWLoUhiCpDZJwy+qlSiWTo2shmhG5Mco4n5wud+X2+FaFmurZ+/OnnN2nvfZe96D5H9BFEWSJDEMy8jAcRxF0XQ6DQTiSeV3sxyRP8Usy1IycrkcwzCQAoFIEATcCxW5Lc8LgsDzRWKAVIyTymkdCC+IgigWuJwiYv4/KFjx4MSLoiCrpI9HRPfQ07exJPIPmQA+An/qzAnS+rtj053Hpdr2y0Zl7EsU+dtH1vw0AQCNJzBX4LWmw1mmb6y7pRx8WD5lP5OKryHQDaOCGcAB7akmS4sbsWN3cMXQP1RjatSar/T2KfwD5wI3FC5NVZfm+k48gRSNKS99y+RW33wY9j9qs900GCvbWs7bzWfdXWUuS+2AuaW1o189NKf0r15yrUST3xE8S+4lPofXt3yzC7YHzmarqcGib+7Rm2+bOx0DxkFPg2Oq9v5Czd3Q1XvPVb1zOoOnSe0wXLTtbO4jrT3OCm17hc5SobMq9f3XTCPqJreq0VNd761WDddUOdSVdk15n/ZCd31JZ31JV53CWlfao1J0v9/6hDx7sjE5uhwKbAb9rxbH16ZHXsz7VuY8SyHv0rw3DCc4+nJxPDI9Fp6dXA1ORGYnIjNj4Rnf8mHyKwIvpVk+doBmKXI7vptCMZRCj9DdDE4cbkdxmk5hWBzFM1mCYKjE/kEaxTmBBxWMGZHk/yRIhuN4nMjSNAtrSNGwjCxFECzLMSyXpZgCYbgcSdEMC/2w3JIk/QAxJYWqAhYlTwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  1988.  &gt;&lt;/span&gt;
  1989.  &lt;img
  1990.        class=&quot;gatsby-resp-image-image&quot;
  1991.        alt=&quot;sample cumulative flow diagram&quot;
  1992.        title=&quot;&quot;
  1993.        src=&quot;/static/805b100edc7c937e31bb26bb153715ec/fcda8/kanban-tool-cumulative-flow-diagram-20190422184204049.png&quot;
  1994.        srcset=&quot;/static/805b100edc7c937e31bb26bb153715ec/12f09/kanban-tool-cumulative-flow-diagram-20190422184204049.png 148w,
  1995. /static/805b100edc7c937e31bb26bb153715ec/e4a3f/kanban-tool-cumulative-flow-diagram-20190422184204049.png 295w,
  1996. /static/805b100edc7c937e31bb26bb153715ec/fcda8/kanban-tool-cumulative-flow-diagram-20190422184204049.png 590w,
  1997. /static/805b100edc7c937e31bb26bb153715ec/a6d36/kanban-tool-cumulative-flow-diagram-20190422184204049.png 650w&quot;
  1998.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  1999.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2000.        loading=&quot;lazy&quot;
  2001.        decoding=&quot;async&quot;
  2002.      /&gt;
  2003.  &lt;/a&gt;
  2004.    &lt;/span&gt;&lt;/li&gt;
  2005. &lt;li&gt;&lt;strong&gt;Do similar work for issues!&lt;/strong&gt; We really care about ensuring issues get responded to promptly as well as PRs. We started this work on PRs but want to apply queueing and WIP constraint theory on them as well.&lt;/li&gt;
  2006. &lt;/ul&gt;
  2007. &lt;h2 id=&quot;conclusions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusions&quot; aria-label=&quot;conclusions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusions&lt;/h2&gt;
  2008. &lt;ul&gt;
  2009. &lt;li&gt;Product development theories are very handy for solving real-world problems.&lt;/li&gt;
  2010. &lt;li&gt;OneGraph &amp;#x26; render.com &amp;#x26; Slack bots are a great combo for quickly creating custom OSS maintenance tools.&lt;/li&gt;
  2011. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[New blog design]]></title><description><![CDATA[I last redesigned my blog around three years ago — before I started on the rewrite of Gatsby that became Gatsby v1. Which is a long time…]]></description><link>https://bricolage.io/new-design-cooper-hewitt/</link><guid isPermaLink="false">https://bricolage.io/new-design-cooper-hewitt/</guid><pubDate>Sun, 31 Mar 2019 04:29:30 GMT</pubDate><content:encoded>&lt;p&gt;I last redesigned my blog around three years ago — before I started on the rewrite of Gatsby that became Gatsby v1. Which is a long time — and a bummer cause I really enjoy fiddling with my blog design. So #protip — if you want to have time to fiddle with your site’s design, don’t start large open source projects and startups.&lt;/p&gt;
  2012. &lt;p&gt;But things are a bit less hectic these days (as much as you can ever say that during a startup) as we’ve been able to hire some fantastic people at Gatsby inc. — such that I feel much of the load for making things happen is shared across some very capable shoulders.&lt;/p&gt;
  2013. &lt;p&gt;So here I am playing with my blog again :-) It was only recently that I got the blog upgraded to Gatsby v2 so definitely it’s been cobbler-children-ized.&lt;/p&gt;
  2014. &lt;h2 id=&quot;typeface&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#typeface&quot; aria-label=&quot;typeface permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Typeface&lt;/h2&gt;
  2015. &lt;p&gt;For the redesign, I used one of my all time favorite typefaces, Cooper Hewitt. &lt;a href=&quot;https://www.cooperhewitt.org/&quot;&gt;Cooper Hewitt&lt;/a&gt; is a design museum in NYC (that I really want to visit some time — design museums tend to be favorites). At some point in the past few years, they did a rebrand and commissioned a custom typeface as part of that. Apparently as a design museum, they feel it appropriate to share as widely as possible all designs they create so they &lt;a href=&quot;https://www.cooperhewitt.org/open-source-at-cooper-hewitt/cooper-hewitt-the-typeface-by-chester-jenkins/&quot;&gt;open sourced the typeface&lt;/a&gt;. Jeremiah Shoaf from &lt;a href=&quot;https://www.typewolf.com/&quot;&gt;Typewolf&lt;/a&gt; says it’s his favorite open source font.&lt;/p&gt;
  2016. &lt;p&gt;I’ve been looking for a chance to use it in a project and this felt like the perfect opportunity.&lt;/p&gt;
  2017. &lt;h2 id=&quot;homepage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#homepage&quot; aria-label=&quot;homepage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Homepage&lt;/h2&gt;
  2018. &lt;p&gt;I find airports oddly inspiring design wise. There’s a number of them that have very striking designs. In February I spoke at the &lt;a href=&quot;https://www.frontenddeveloperlove.com/&quot;&gt;Frontend Developer Love conference&lt;/a&gt; in Amsterdam and while walking through the airport after deplaning, this banner ad caught my eye.&lt;/p&gt;
  2019. &lt;p&gt;&lt;span
  2020.      class=&quot;gatsby-resp-image-wrapper&quot;
  2021.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2022.    &gt;
  2023.      &lt;a
  2024.    class=&quot;gatsby-resp-image-link&quot;
  2025.    href=&quot;/static/da87956364ebc7298ce6b9d099b42866/f5be1/banner.jpg&quot;
  2026.    style=&quot;display: block&quot;
  2027.    target=&quot;_blank&quot;
  2028.    rel=&quot;noopener&quot;
  2029.  &gt;
  2030.    &lt;span
  2031.    class=&quot;gatsby-resp-image-background-image&quot;
  2032.    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDAf/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/aAAwDAQACEAMQAAABkrwyuEyl/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQIAEhEhIv/aAAgBAQABBQKgVqxsqXfqxh2f/8QAFhEAAwAAAAAAAAAAAAAAAAAAEBEi/9oACAEDAQE/AZQ//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGRAAAQUAAAAAAAAAAAAAAAAAEAABESEx/9oACAEBAAY/AqEOsP8A/8QAGBABAQEBAQAAAAAAAAAAAAAAAQARIXH/2gAIAQEAAT8hcEZZ6w0ARujHs0+zf//aAAwDAQACAAMAAAAQgD//xAAWEQEBAQAAAAAAAAAAAAAAAAAhARD/2gAIAQMBAT8QgDn/xAAWEQEBAQAAAAAAAAAAAAAAAAAAIRH/2gAIAQIBAT8Quo//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAxUdEhcf/aAAgBAQABPxB85HDfcpARepzqsUH706y1By8zhBn5noqwN//Z&apos;); background-size: cover; display: block;&quot;
  2033.  &gt;&lt;/span&gt;
  2034.  &lt;img
  2035.        class=&quot;gatsby-resp-image-image&quot;
  2036.        alt=&quot;very striking banner ad&quot;
  2037.        title=&quot;&quot;
  2038.        src=&quot;/static/da87956364ebc7298ce6b9d099b42866/1c72d/banner.jpg&quot;
  2039.        srcset=&quot;/static/da87956364ebc7298ce6b9d099b42866/a80bd/banner.jpg 148w,
  2040. /static/da87956364ebc7298ce6b9d099b42866/1c91a/banner.jpg 295w,
  2041. /static/da87956364ebc7298ce6b9d099b42866/1c72d/banner.jpg 590w,
  2042. /static/da87956364ebc7298ce6b9d099b42866/a8a14/banner.jpg 885w,
  2043. /static/da87956364ebc7298ce6b9d099b42866/fbd2c/banner.jpg 1180w,
  2044. /static/da87956364ebc7298ce6b9d099b42866/f5be1/banner.jpg 2043w&quot;
  2045.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2046.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2047.        loading=&quot;lazy&quot;
  2048.        decoding=&quot;async&quot;
  2049.      /&gt;
  2050.  &lt;/a&gt;
  2051.    &lt;/span&gt;&lt;/p&gt;
  2052. &lt;p&gt;I loved the typeface, the red, and especially the angled cut-off vertical lines that framed and directed the eye.&lt;/p&gt;
  2053. &lt;p&gt;Immediately I wanted this as the inspiration for my new blog design.&lt;/p&gt;
  2054. &lt;p&gt;After returning home I started fiddling. The first challenge was reproducing the vertical lines as CSS doesn’t make that simple. I hit on trying border-radius and after looking at the docs, realized they actually had two potential properties — the second property could make radius elliptical. I played with that until the radius was large enough that the cut-off line was mostly straight.&lt;/p&gt;
  2055. &lt;p&gt;With a bit of absolute positioning and media queries, I got the the rest of the design working. Then it was just fiddling with the front page copy until it had just the right quirky feel.&lt;/p&gt;
  2056. &lt;p&gt;&lt;span
  2057.      class=&quot;gatsby-resp-image-wrapper&quot;
  2058.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2059.    &gt;
  2060.      &lt;a
  2061.    class=&quot;gatsby-resp-image-link&quot;
  2062.    href=&quot;/static/a81e796ccc3c58fcde2f9e5b8c60e445/4c5bd/finished-homepage-design.png&quot;
  2063.    style=&quot;display: block&quot;
  2064.    target=&quot;_blank&quot;
  2065.    rel=&quot;noopener&quot;
  2066.  &gt;
  2067.    &lt;span
  2068.    class=&quot;gatsby-resp-image-background-image&quot;
  2069.    style=&quot;padding-bottom: 55.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABvklEQVR42nVSyU4CURCc3zJqFGVfXeMKoqhxFxEUcItLYmLiwejBSLzopzAbMwMh/lDZ3cPgyqHSnX6v61VXP+Xj9R3Ns2s4R6dwSicS7YNjtJ9qaN3eS949+w/FKpzKBZrnN/iovUHhhvqgD+poGKovCHUkhHr/MOz9Esz5JdQHfFKTs16gXuZgLoVf4aIWH4cWTUGLjUGLJGHMpKGnpiTnms51L3bueTWG6guIYpdwOAAtnIAWjLkIxV3FgaibU1T9kZ/gc39YIj/6h9BcWkUjuw5zYRnGXIbGzVKelbHt3UNYOwew1rYlt3cKsPeKsLbysPMl6MlJqEN+j7AqHjnlczRPr1yDq5ewtvPdZqdQEdN5Ac3yBRq5TZjpHMwMgUSwXSzqSyF5aKZX0FjZcJXmNsjDRRek0JiehzGbgTE1J+rZO1mUjBz6f2TxiS+xNxy9/LtvHS/ZV1mWB1rSl8KjM2qkS4kJ6CRdj0/IJR6J1ciyYuMddLYa/QXq4ceZS2FT632DIp1lqyNB+odD9A+LshTOuSZnvUC9zMFcSvvxhTZIWzuswC6UJVq0wfbDM1o3d5J3z3qBe4iDuT4B1uokrSIOJjMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  2070.  &gt;&lt;/span&gt;
  2071.  &lt;img
  2072.        class=&quot;gatsby-resp-image-image&quot;
  2073.        alt=&quot;Finished homepage design&quot;
  2074.        title=&quot;&quot;
  2075.        src=&quot;/static/a81e796ccc3c58fcde2f9e5b8c60e445/fcda8/finished-homepage-design.png&quot;
  2076.        srcset=&quot;/static/a81e796ccc3c58fcde2f9e5b8c60e445/12f09/finished-homepage-design.png 148w,
  2077. /static/a81e796ccc3c58fcde2f9e5b8c60e445/e4a3f/finished-homepage-design.png 295w,
  2078. /static/a81e796ccc3c58fcde2f9e5b8c60e445/fcda8/finished-homepage-design.png 590w,
  2079. /static/a81e796ccc3c58fcde2f9e5b8c60e445/efc66/finished-homepage-design.png 885w,
  2080. /static/a81e796ccc3c58fcde2f9e5b8c60e445/c83ae/finished-homepage-design.png 1180w,
  2081. /static/a81e796ccc3c58fcde2f9e5b8c60e445/4c5bd/finished-homepage-design.png 1435w&quot;
  2082.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2083.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2084.        loading=&quot;lazy&quot;
  2085.        decoding=&quot;async&quot;
  2086.      /&gt;
  2087.  &lt;/a&gt;
  2088.    &lt;/span&gt;&lt;/p&gt;
  2089. &lt;h2 id=&quot;other-notes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#other-notes&quot; aria-label=&quot;other notes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Other notes&lt;/h2&gt;
  2090. &lt;h3 id=&quot;css-in-js-still-rocks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#css-in-js-still-rocks&quot; aria-label=&quot;css in js still rocks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;css-in-js still rocks&lt;/h3&gt;
  2091. &lt;p&gt;It’s so simple to prototype with and refine styles. My previous design was so old that it pre-dates libraries that add the &lt;code class=&quot;language-text&quot;&gt;css&lt;/code&gt; prop (the full-featured replacement for the classic React &lt;code class=&quot;language-text&quot;&gt;styles&lt;/code&gt; prop). During this redesign I migrated styles to use &lt;a href=&quot;https://emotion.sh/docs/introduction&quot;&gt;Emotion.js&lt;/a&gt;&lt;/p&gt;
  2092. &lt;p&gt;It’s so fast to prototype and refine code when it’s all colocated. Just look at how nice this media query syntax is here:&lt;/p&gt;
  2093. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;
  2094.  &lt;span class=&quot;token attr-name&quot;&gt;css&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2095.    &lt;span class=&quot;token literal-property property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;80%&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2096.    &lt;span class=&quot;token literal-property property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; whitish&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2097.    &lt;span class=&quot;token literal-property property&quot;&gt;fontWeight&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2098.    &lt;span class=&quot;token literal-property property&quot;&gt;fontSize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontSize&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2099.    &lt;span class=&quot;token literal-property property&quot;&gt;lineHeight&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2100.    &lt;span class=&quot;token string-property property&quot;&gt;&quot;@media (min-width: 420px)&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2101.      &lt;span class=&quot;token literal-property property&quot;&gt;fontSize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontSize&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2102.    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2103.    &lt;span class=&quot;token string-property property&quot;&gt;&quot;@media (min-width: 768px)&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2104.      &lt;span class=&quot;token literal-property property&quot;&gt;fontSize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontSize&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2105.    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2106.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
  2107. &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  2108.  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;css&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fontWeight&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;400&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Welcome to the&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt; Personal
  2109.  Internet Domicile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  2110.  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;css&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fontWeight&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;400&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;of Kyle Mathews&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  2111. &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2112. &lt;h3 id=&quot;typographyjs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#typographyjs&quot; aria-label=&quot;typographyjs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Typography.js&lt;/h3&gt;
  2113. &lt;p&gt;&lt;a href=&quot;https://github.com/KyleAMathews/typography.js/&quot;&gt;Typography.js&lt;/a&gt; is my attempt at making a lib to generate typography CSS from a few base options.&lt;/p&gt;
  2114. &lt;p&gt;E.g. the options for this site look like this:&lt;/p&gt;
  2115. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; theme &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2116.  &lt;span class=&quot;token literal-property property&quot;&gt;baseFontSize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;18px&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2117.  &lt;span class=&quot;token literal-property property&quot;&gt;headerFontFamily&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Cooper Hewitt&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;sans-serif&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2118.  &lt;span class=&quot;token literal-property property&quot;&gt;bodyFontFamily&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Cooper Hewitt&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;sans-serif&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2119.  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CodePlugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2120.  &lt;span class=&quot;token literal-property property&quot;&gt;baseLineHeight&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.45&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2121.  &lt;span class=&quot;token literal-property property&quot;&gt;blockMarginBottom&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.85&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2122. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2123. &lt;p&gt;I really love how elegant it is — 100s of lines of CSS are generated from
  2124. less than 10 lines of code. CSS is a really low-level primative for many tasks.&lt;/p&gt;
  2125. &lt;h3 id=&quot;gatsby&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#gatsby&quot; aria-label=&quot;gatsby permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gatsby&lt;/h3&gt;
  2126. &lt;p&gt;It almost goes without saying that the site is built with &lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby&lt;/a&gt; :-D But just in case, I’ll mention it. Gatsby is sweet and you should use it too.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hope and the Atonement]]></title><description><![CDATA[I gave the following at the local LDS church church I attend. Our church doesn’t have paid ministry meaning everyone who attends…]]></description><link>https://bricolage.io/hope-and-the-atonement/</link><guid isPermaLink="false">https://bricolage.io/hope-and-the-atonement/</guid><pubDate>Thu, 25 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;I gave the following at the local &lt;a href=&quot;https://www.mormon.org/&quot;&gt;LDS church&lt;/a&gt; church I attend. Our church doesn’t have paid ministry meaning everyone who attends occasionally takes their turn preaching and exhorting.&lt;/em&gt;&lt;/p&gt;
  2127. &lt;p&gt;Bishop asked me to speak on what I’m doing in my daily life to become more Christ-like. This has been an interesting talk to prepare for. It’s been really interesting to reflect on the important lessons I’ve learned over the past 5-6 years.&lt;/p&gt;
  2128. &lt;p&gt;When I was growing up, I could never ever quite understand the role of Christ and his atonement. I sometimes got the impression that saved-by-grace-like that when you turn to Christ and your issues start magically to disappear and I was always like, “nope, still got lots of personal issues.”&lt;/p&gt;
  2129. &lt;p&gt;Which caused me to question my faith some in my mid-late 20s — why aren’t I getting help to make my issues easier? I’m really struggling here! Maybe God doesn’t exist?&lt;/p&gt;
  2130. &lt;p&gt;So in my talk today, I wanted to discuss how I now understand how Christ and the atonement and the Spirit help us walk the straight and narrow path of safety and joy through this life.&lt;/p&gt;
  2131. &lt;p&gt;First is a phrase found in one of Paul’s epistles, and in Alma, and Moroni’s writings. I’ll quote Moroni’s version:&lt;/p&gt;
  2132. &lt;blockquote&gt;
  2133. &lt;p&gt;Doubt not, but be believing, and begin as in times of old, and come unto the Lord with all your heart, and work out your own salvation with fear and trembling before him.&lt;/p&gt;
  2134. &lt;/blockquote&gt;
  2135. &lt;p&gt;I find the latter part of that phrase incredibly evocative: “work out your own salvation”. Two things I’ll highlight.&lt;/p&gt;
  2136. &lt;p&gt;First — salvation &lt;em&gt;is&lt;/em&gt; work. It’s not something that’s just going to be given to us — which is what really tripped me up in the past. I was afraid of my insecurities and inadequacies and shrank back from working on them instead of plunging in.&lt;/p&gt;
  2137. &lt;p&gt;Second — salvation is personal. “Work out &lt;em&gt;your own&lt;/em&gt; salvation. By which I mean, everyone is incredibly unique. The problems and opportunities you face are unlike anyone else’s. I don’t believe there are general solutions to most personal problems. That there’s much advice that’s applicable to all people. When you come to church, when you talk to family and friends — they’re not going to know how to save you. They can help — give you emotional support. But working out your own salvation — figuring out how to grow past your problems — is something in the end we all have to do ourselves.&lt;/p&gt;
  2138. &lt;p&gt;After several years of somewhat stalled progress in my 20s, once I faced what I needed to do and swallowed my fears, I started making real progress again.&lt;/p&gt;
  2139. &lt;p&gt;Another question — what is salvation? In Alma we read that we can’t be saved &lt;em&gt;in&lt;/em&gt; our sins but we are to be saved &lt;em&gt;from&lt;/em&gt; our sins. Which suggests salvation is a state where we’ve left our sins behind us. D&amp;#x26;C 131:6 says “It is impossible for a man to be saved in ignorance.” and 130:18-19 says “Whatever principle of intelligence we attain unto in this life, it will rise with us in the resurrection. And if a person gains more knowledge and intelligence in this life through his diligence and obedience than another, he will have so much the advantage in the world to come.”&lt;/p&gt;
  2140. &lt;p&gt;So salvation is a state where we’re knowledgeable, intelligent, wise, and not naive.&lt;/p&gt;
  2141. &lt;p&gt;In Mosiah we read:&lt;/p&gt;
  2142. &lt;blockquote&gt;
  2143. &lt;p&gt;All mankind, yea, men and women, all nations, kindreds, tongues and people, must be born again; yea, born of God, changed from their carnal and fallen state, to a state of righteousness, being redeemed of God, becoming his sons and daughters; And thus they become new creatures; and unless they do this, they can in nowise inherit the kingdom of God.&lt;/p&gt;
  2144. &lt;/blockquote&gt;
  2145. &lt;p&gt;So we must be changed from a “carnal and fallen state” to become “new creatures” in a “state of righteousness”.&lt;/p&gt;
  2146. &lt;p&gt;But how does this actually happen? Are we mysteriously one day going to wake up changed? Go to church enough times, take the sacrament enough times, do our home teaching enough times and then bam?&lt;/p&gt;
  2147. &lt;p&gt;I’m pretty sure now that’s not what’s going to happen :-)&lt;/p&gt;
  2148. &lt;p&gt;Switching gears slightly, I want to read one of my all-time favorite bits on the process of becoming a creative professional. It’s from an interview with Ira Glass which some of will you know as a producer and host on This American Life.&lt;/p&gt;
  2149. &lt;blockquote&gt;
  2150. &lt;p&gt;Nobody tells this to people who are beginners, I wish someone told me. All of us who do creative work, we get into it because we have good taste. But there is this gap. For the first couple years you make stuff, it’s just not that good. It’s trying to be good, it has potential, but it’s not. But your taste, the thing that got you into the game, is still killer. And your taste is why your work disappoints you. A lot of people never get past this phase, they quit. Most people I know who do interesting, creative work went through years of this. We know our work doesn’t have this special thing that we want it to have. We all go through this. And if you are just starting out or you are still in this phase, you gotta know its normal and the most important thing you can do is do a lot of work. Put yourself on a deadline so that every week you will finish one story. It is only by going through a volume of work that you will close that gap, and your work will be as good as your ambitions. And I took longer to figure out how to do this than anyone I’ve ever met. It’s gonna take awhile. It’s normal to take awhile. You’ve just gotta fight your way through.&lt;/p&gt;
  2151. &lt;/blockquote&gt;
  2152. &lt;p&gt;So this is I think how the atonement works. It’s pretty simple actually. The atonement gives us good taste for what sort of person you can become. And that’s it. &lt;em&gt;The atonement &amp;#x26; the gospel’s whole point is to give us this sometimes dizzying perspective on what we can become.&lt;/em&gt;&lt;/p&gt;
  2153. &lt;p&gt;I remember a zone conference when I’d been on my mission for around 6 months. I was super depressed. I was really struggling to get to good fluency with my mission language Tagalog. I felt really awkward trying to talk to people in general (I read way more growing up than went to parties). So I was sitting there feeling really depressed and inadequate when what came over me was perhaps the strongest spiritual experience I’ve ever had. I just felt incredibly light and hopeful. All my fears and disappointments and inadequacies just melted away and I was filled with hope and joy. And this experience lasted for several hours during most of the remainder of the zone conference. I have no idea what was taught that day but I can still remember fairly vividly the experience.&lt;/p&gt;
  2154. &lt;p&gt;But… here’s the kicker, I walked out of that zone conference the exact same person that walked in. I still was terrible at Tagalog, I was still awkward and shy. But now, I felt hope that I could be something much more. I still had to work super hard to learn how the language, how to teach the gospel, how to socialize in all sorts of situations. But I could do it because of hope.&lt;/p&gt;
  2155. &lt;p&gt;And this is what’s frustrating about living the gospel — we’re given this vision of what sort of people we can be — but there’s this gap. We see ourselves as these remarkable people but we know also we’re not there.&lt;/p&gt;
  2156. &lt;p&gt;To return to the Ira Glass quote:&lt;/p&gt;
  2157. &lt;blockquote&gt;
  2158. &lt;p&gt;All of us who do creative work, we get into it because we have good taste. But there is this gap. For the first couple years you make stuff, it’s just not that good. It’s trying to be good, it has potential, but it’s not. And your taste is why your work disappoints you. A lot of people never get past this phase, they quit.&lt;/p&gt;
  2159. &lt;/blockquote&gt;
  2160. &lt;p&gt;It is so easy to quit. We feel this strong spiritual experience and we have this intense feeling of hope and joy in what we can become and then… weeks and months and years pass and your disappointment in yourself grows and grows until perhaps, finally, you just quit trying.&lt;/p&gt;
  2161. &lt;p&gt;My testimony to you today is that those feelings of hope and visions of what you can become are real and that they’re a gift given to us. But also that achieving that vision is going to take a lot of hard work. There’s no getting around that. But all of us are capable of so much and we shouldn’t ever let that vision and hope slip away from us.&lt;/p&gt;
  2162. &lt;p&gt;I’ll close with two of my favorite scriptures&lt;/p&gt;
  2163. &lt;p&gt;First Moroni 8:26:&lt;/p&gt;
  2164. &lt;blockquote&gt;
  2165. &lt;p&gt;And the remission of sins bringeth meekness, and lowliness of heart; and because of meekness and lowliness of heart cometh the visitation of the Holy Ghost, which Comforter filleth with hope and perfect love, which love endureth by diligence unto prayer, until the end shall come, when all the saints shall dwell with God.&lt;/p&gt;
  2166. &lt;/blockquote&gt;
  2167. &lt;p&gt;Then Ether 12:4:&lt;/p&gt;
  2168. &lt;blockquote&gt;
  2169. &lt;p&gt;Wherefore, whoso believeth in God might with surety hope for a better world, yea, even a place at the right hand of God, which hope cometh of faith, maketh an anchor to the souls of men, which would make them sure and steadfast, always abounding in good works, being led to glorify God.&lt;/p&gt;
  2170. &lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Typefaces: The easiest way to self-host open-source fonts]]></title><description><![CDATA[Once upon a time, I thought self-hosting web fonts was intimidating. It
  2171. seemed nice but the complexities were too much. I needed to create a…]]></description><link>https://bricolage.io/typefaces-easiest-way-to-self-host-fonts/</link><guid isPermaLink="false">https://bricolage.io/typefaces-easiest-way-to-self-host-fonts/</guid><pubDate>Tue, 31 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Once upon a time, I thought self-hosting web fonts was intimidating. It
  2172. seemed nice but the complexities were too much. I needed to create a
  2173. bunch of weird files (eot?), write weird css syntax (bullet proof
  2174. what?), etc. Much easier to drop a little Google Fonts &lt;code class=&quot;language-text&quot;&gt;&amp;lt;link&gt;&lt;/code&gt; in my
  2175. html’s &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&gt;&lt;/code&gt; and call it a day.&lt;/p&gt;
  2176. &lt;p&gt;But as time went on, I found some really nice advantages to hosting your
  2177. fonts.&lt;/p&gt;
  2178. &lt;ul&gt;
  2179. &lt;li&gt;Self-hosting is &lt;em&gt;significantly faster&lt;/em&gt;. Loading a typeface from Google&lt;/li&gt;
  2180. &lt;/ul&gt;
  2181. &lt;p&gt;Fonts or other hosted font service adds &lt;em&gt;an extra (blocking) network
  2182. request&lt;/em&gt;. &lt;a href=&quot;https://github.com/reactiflux/reactiflux.com/pull/21&quot;&gt;In my
  2183. testing&lt;/a&gt;, I’ve
  2184. found replacing Google Fonts with a self-hosted font can improve a
  2185. site’s speedindex by ~300 miliseconds on desktop and 1+ seconds on 3g.
  2186. This is a big deal. YMMV on exact numbers but directionally, self-hosting
  2187. is faster &lt;em&gt;and&lt;/em&gt; importantly opens the door for further optimizations.&lt;/p&gt;
  2188. &lt;ul&gt;
  2189. &lt;li&gt;Your &lt;em&gt;fonts load offline&lt;/em&gt;. It’s annoying to start working on a web&lt;/li&gt;
  2190. &lt;/ul&gt;
  2191. &lt;p&gt;project on the train or airplane and see your interface screwed up
  2192. because you can’t access Google fonts. I remember once being in this
  2193. situation and doing everything possible to avoid reloading a project as
  2194. I knew I’d lose the fonts and be forced to stop working.&lt;/p&gt;
  2195. &lt;ul&gt;
  2196. &lt;li&gt;&lt;em&gt;Go beyond Google Fonts&lt;/em&gt;. Some of my favorite typefaces aren’t on&lt;/li&gt;
  2197. &lt;/ul&gt;
  2198. &lt;p&gt;Google Fonts like &lt;a href=&quot;https://01.org/clear-SANS&quot;&gt;Clear Sans&lt;/a&gt;, &lt;a href=&quot;https://www.cooperhewitt.org/open-source-at-cooper-hewitt/cooper-hewitt-the-typeface-by-chester-jenkins/&quot;&gt;Cooper
  2199. Hewitt&lt;/a&gt;,
  2200. and
  2201. &lt;a href=&quot;https://www.behance.net/gallery/8018673/ALEO-Free-Font-Family&quot;&gt;Aleo&lt;/a&gt;.&lt;/p&gt;
  2202. &lt;p&gt;&lt;em&gt;Cool typefaces not on Google Fonts&lt;/em&gt;&lt;/p&gt;
  2203. &lt;p&gt;&lt;span
  2204.      class=&quot;gatsby-resp-image-wrapper&quot;
  2205.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2206.    &gt;
  2207.      &lt;a
  2208.    class=&quot;gatsby-resp-image-link&quot;
  2209.    href=&quot;/static/ff6bfe19c67b781911c4705737921927/07a9c/clear-sans.png&quot;
  2210.    style=&quot;display: block&quot;
  2211.    target=&quot;_blank&quot;
  2212.    rel=&quot;noopener&quot;
  2213.  &gt;
  2214.    &lt;span
  2215.    class=&quot;gatsby-resp-image-background-image&quot;
  2216.    style=&quot;padding-bottom: 5.405405405405405%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAQElEQVR42mMwNja2gWJlAwMDKyBtZmpqqmZoaGgHxB4gGihmBMSOQOwAUquvrw+iHUxMTOxB2MzMzALIdwOyTQGSixB7iAF4NAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  2217.  &gt;&lt;/span&gt;
  2218.  &lt;img
  2219.        class=&quot;gatsby-resp-image-image&quot;
  2220.        alt=&quot;Clear Sans typeface&quot;
  2221.        title=&quot;&quot;
  2222.        src=&quot;/static/ff6bfe19c67b781911c4705737921927/fcda8/clear-sans.png&quot;
  2223.        srcset=&quot;/static/ff6bfe19c67b781911c4705737921927/12f09/clear-sans.png 148w,
  2224. /static/ff6bfe19c67b781911c4705737921927/e4a3f/clear-sans.png 295w,
  2225. /static/ff6bfe19c67b781911c4705737921927/fcda8/clear-sans.png 590w,
  2226. /static/ff6bfe19c67b781911c4705737921927/efc66/clear-sans.png 885w,
  2227. /static/ff6bfe19c67b781911c4705737921927/c83ae/clear-sans.png 1180w,
  2228. /static/ff6bfe19c67b781911c4705737921927/07a9c/clear-sans.png 1440w&quot;
  2229.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2230.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2231.        loading=&quot;lazy&quot;
  2232.        decoding=&quot;async&quot;
  2233.      /&gt;
  2234.  &lt;/a&gt;
  2235.    &lt;/span&gt;&lt;/p&gt;
  2236. &lt;p&gt;&lt;span
  2237.      class=&quot;gatsby-resp-image-wrapper&quot;
  2238.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2239.    &gt;
  2240.      &lt;a
  2241.    class=&quot;gatsby-resp-image-link&quot;
  2242.    href=&quot;/static/ecec0dc326a532d20cc5ee801212c90b/07a9c/cooper-hewitt.png&quot;
  2243.    style=&quot;display: block&quot;
  2244.    target=&quot;_blank&quot;
  2245.    rel=&quot;noopener&quot;
  2246.  &gt;
  2247.    &lt;span
  2248.    class=&quot;gatsby-resp-image-background-image&quot;
  2249.    style=&quot;padding-bottom: 5.405405405405405%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAPUlEQVR42mMwNjY20tPTMzQxMTEEAhUQDRIDsjWNjIyMoeKaQNoUyHcCyQGxLlDM0tTU1BLEB6kDAmsQBgB3mQ/Ler+BkQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  2250.  &gt;&lt;/span&gt;
  2251.  &lt;img
  2252.        class=&quot;gatsby-resp-image-image&quot;
  2253.        alt=&quot;Cooper Hewitt typeface&quot;
  2254.        title=&quot;&quot;
  2255.        src=&quot;/static/ecec0dc326a532d20cc5ee801212c90b/fcda8/cooper-hewitt.png&quot;
  2256.        srcset=&quot;/static/ecec0dc326a532d20cc5ee801212c90b/12f09/cooper-hewitt.png 148w,
  2257. /static/ecec0dc326a532d20cc5ee801212c90b/e4a3f/cooper-hewitt.png 295w,
  2258. /static/ecec0dc326a532d20cc5ee801212c90b/fcda8/cooper-hewitt.png 590w,
  2259. /static/ecec0dc326a532d20cc5ee801212c90b/efc66/cooper-hewitt.png 885w,
  2260. /static/ecec0dc326a532d20cc5ee801212c90b/c83ae/cooper-hewitt.png 1180w,
  2261. /static/ecec0dc326a532d20cc5ee801212c90b/07a9c/cooper-hewitt.png 1440w&quot;
  2262.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2263.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2264.        loading=&quot;lazy&quot;
  2265.        decoding=&quot;async&quot;
  2266.      /&gt;
  2267.  &lt;/a&gt;
  2268.    &lt;/span&gt;&lt;/p&gt;
  2269. &lt;p&gt;&lt;span
  2270.      class=&quot;gatsby-resp-image-wrapper&quot;
  2271.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2272.    &gt;
  2273.      &lt;a
  2274.    class=&quot;gatsby-resp-image-link&quot;
  2275.    href=&quot;/static/e494b39ca8dfd833b35e88d3904438d8/07a9c/aleo.png&quot;
  2276.    style=&quot;display: block&quot;
  2277.    target=&quot;_blank&quot;
  2278.    rel=&quot;noopener&quot;
  2279.  &gt;
  2280.    &lt;span
  2281.    class=&quot;gatsby-resp-image-background-image&quot;
  2282.    style=&quot;padding-bottom: 5.405405405405405%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAARUlEQVR42mMwMTGxNzY2tjEzM9MC0UZGRmFAbAsUtwLyvYDYGyRuaGjoARTzMzAwcAGy7UDipqamPkDaAajXCaQHyHYFALHGESrBBi/AAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  2283.  &gt;&lt;/span&gt;
  2284.  &lt;img
  2285.        class=&quot;gatsby-resp-image-image&quot;
  2286.        alt=&quot;Aleo typeface&quot;
  2287.        title=&quot;&quot;
  2288.        src=&quot;/static/e494b39ca8dfd833b35e88d3904438d8/fcda8/aleo.png&quot;
  2289.        srcset=&quot;/static/e494b39ca8dfd833b35e88d3904438d8/12f09/aleo.png 148w,
  2290. /static/e494b39ca8dfd833b35e88d3904438d8/e4a3f/aleo.png 295w,
  2291. /static/e494b39ca8dfd833b35e88d3904438d8/fcda8/aleo.png 590w,
  2292. /static/e494b39ca8dfd833b35e88d3904438d8/efc66/aleo.png 885w,
  2293. /static/e494b39ca8dfd833b35e88d3904438d8/c83ae/aleo.png 1180w,
  2294. /static/e494b39ca8dfd833b35e88d3904438d8/07a9c/aleo.png 1440w&quot;
  2295.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2296.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2297.        loading=&quot;lazy&quot;
  2298.        decoding=&quot;async&quot;
  2299.      /&gt;
  2300.  &lt;/a&gt;
  2301.    &lt;/span&gt;&lt;/p&gt;
  2302. &lt;h2 id=&quot;the-awakening&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-awakening&quot; aria-label=&quot;the awakening permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The awakening&lt;/h2&gt;
  2303. &lt;p&gt;Last fall, a client asked me to use some commercial typefaces for a
  2304. &lt;a href=&quot;https://github.com/gatsbyjs/gatsby&quot;&gt;Gatsby&lt;/a&gt; site I was building. After
  2305. reading up on the process, I realized that
  2306. &lt;a href=&quot;https://webpack.js.org&quot;&gt;webpack&lt;/a&gt; actually did most of the work.  You
  2307. simply present it a css file pointing at the various font files and the
  2308. css and files will all get included in your final site build. No
  2309. problemo.&lt;/p&gt;
  2310. &lt;p&gt;It then occurred to me how nice it’d be if you could install typefaces
  2311. through NPM. The last 4-5 years of my life have seen the steady
  2312. accumulation of more and more package.json files with longer and longer
  2313. lists of NPM package dependencies for my various node and web projects.
  2314. Which I absolutely love. Compared to the bad ol’ days of checking in
  2315. dependencies of dubious origin (or worse, having to follow a generally
  2316. out-of-date INSTALL.md), managing everything with NPM is beautiful.&lt;/p&gt;
  2317. &lt;p&gt;With typefaces as NPM packages, you could do something like &lt;code class=&quot;language-text&quot;&gt;npm install
  2318. --save typeface-open-sans&lt;/code&gt; which would install a package containing both
  2319. the font-face css and font files and then in your project’s entry file
  2320. add &lt;code class=&quot;language-text&quot;&gt;require(&apos;typeface-open-sans)&lt;/code&gt; and… you’re done.&lt;/p&gt;
  2321. &lt;p&gt;Perhaps if self-hosting fonts wasn’t so annoying I’d do it more…&lt;/p&gt;
  2322. &lt;p&gt;So I wrote a quick and dirty script to create packages for the typefaces
  2323. used on this blog
  2324. (&lt;a href=&quot;http://www.huertatipografica.com/en/fonts/alegreya-ht-pro&quot;&gt;Alegreya&lt;/a&gt;
  2325. and &lt;a href=&quot;http://www.huertatipografica.com/en/fonts/alegreya-sans-ht&quot;&gt;Alegreya
  2326. Sans&lt;/a&gt;)
  2327. and… it worked! I added a few more typefaces for some other projects
  2328. and things were looking really good.&lt;/p&gt;
  2329. &lt;p&gt;Then I put the project aside for several months as I was focusing on
  2330. making some major feature additions to Gatsby (blog post coming soon)
  2331. but last week, jumped back to this for several days and upgraded my
  2332. Google Fonts package creator script and added a Font Squirrel package
  2333. creator script as well and this morning published ~825 new typeface
  2334. packages to NPM.&lt;/p&gt;
  2335. &lt;p&gt;I’m super excited about this. I really enjoy finding &lt;a href=&quot;/gatsby-open-source-work/&quot;&gt;high-leverage
  2336. ways&lt;/a&gt; to dramatically improve our various
  2337. web-dev workflows. When something becomes 10x faster or easier, this
  2338. frees us to build new and better things.&lt;/p&gt;
  2339. &lt;p&gt;Building for the web involves navigating dozens of interconnected
  2340. workflows. The last few years have seen workflow after workflow get
  2341. automated. And the exciting thing is that each new automation enables
  2342. workflows up and down-stream from it to be automated as well.  So just
  2343. as Typefaces builds on previous automations such as Webpack and NPM, now
  2344. that we have automated this part of our workflow (self-hosting), it
  2345. opens the door for &lt;a href=&quot;https://www.zachleat.com/web/comprehensive-webfonts/&quot;&gt;automating futher font-loading
  2346. optimizations&lt;/a&gt;.&lt;/p&gt;
  2347. &lt;p&gt;Let me know what you think and please &lt;a href=&quot;/gatsby-open-source-work/&quot;&gt;come over to
  2348. Github&lt;/a&gt; to check out the project (and help
  2349. out if you’d like).&lt;/p&gt;
  2350. &lt;p&gt;And if you’re using Google Fonts &amp;#x26; webpack, save your users some time
  2351. (or stop driving them away) by swapping in Typefaces.&lt;/p&gt;
  2352. &lt;p&gt;&lt;a href=&quot;https://github.com/KyleAMathews/typefaces&quot;&gt;https://github.com/KyleAMathews/typefaces&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Working full-time on Gatsby]]></title><description><![CDATA[After several years of working on a startup, I’ve recently quit. The
  2353. reasons are quite boring—poor product traction and we ran out of money…]]></description><link>https://bricolage.io/gatsby-open-source-work/</link><guid isPermaLink="false">https://bricolage.io/gatsby-open-source-work/</guid><pubDate>Fri, 12 Aug 2016 17:52:44 GMT</pubDate><content:encoded>&lt;p&gt;After several years of working on a startup, I’ve recently quit. The
  2354. reasons are quite boring—poor product traction and we ran out of money—
  2355. so I won’t go into that here. But the exciting part is that I’m now free
  2356. to work more on some of my open source projects! Two in particular,
  2357. &lt;a href=&quot;https://github.com/gatsbyjs/gatsby&quot;&gt;Gatsby.js&lt;/a&gt; and
  2358. &lt;a href=&quot;https://github.com/kyleamathews/typography.js&quot;&gt;Typography.js&lt;/a&gt;.&lt;/p&gt;
  2359. &lt;p&gt;&lt;em&gt;Gatsby.js&lt;/em&gt; is a React.js static site generator that marries ease of
  2360. use with modern web technologies. &lt;em&gt;Typography.js&lt;/em&gt; is a toolkit for
  2361. building websites with beautiful typography. This site uses both
  2362. Gatsby.js &amp;#x26; Typography.js!&lt;/p&gt;
  2363. &lt;p&gt;I’m looking for both direct sponsorship and consulting/contracting
  2364. opportunities for these projects. &lt;a href=&quot;mailto:mathews.kyle@gmail.com&quot;&gt;Please contact
  2365. me&lt;/a&gt; if you’re thinking about using
  2366. Gatsby/Typography.js in a major way or have interesting and/or
  2367. high-value projects you’d like help on. Web agencies and larger
  2368. companies looking for new web toolchains would be great fits.&lt;/p&gt;
  2369. &lt;p&gt;Both these projects are very exciting and meaningful to me. I’ve been
  2370. building websites and web apps for a long time now and they both are a
  2371. compilation of a decade+ of thought about and experimentation into what
  2372. is the perfect toolset for building for the web.&lt;/p&gt;
  2373. &lt;p&gt;Both projects were also, interestingly, by-products of working on my startup
  2374. RelateRocket. Gatsby started when I needed to create a website for
  2375. RelateRocket and wanted to avoid using anything other than React.js.
  2376. Typography.js started when we were thinking about building a product
  2377. that’d automatically create personalized landing pages for sales reps to
  2378. send and I started thinking about how to easily/quickly emulate the
  2379. typography and other design choices from our customers’ websites. It is satisfying that although the startup didn’t succeed,
  2380. something of value has risen, phoenix-like, from the ashes.&lt;/p&gt;
  2381. &lt;p&gt;Now that my full attention is on Gatsby, I have a number of ideas
  2382. I’m working on that I’m really excited about.&lt;/p&gt;
  2383. &lt;ul&gt;
  2384. &lt;li&gt;&lt;strong&gt;Service workers &amp;#x26; offline support&lt;/strong&gt;. Service workers are perhaps the
  2385. most exciting technology that’s come to the web in the past several&lt;/li&gt;
  2386. &lt;/ul&gt;
  2387. &lt;p&gt;years. It makes possible (finally) sophisticated client caching plus
  2388. true offline support. I’m adding excellent on-by-default support to
  2389. Gatsby for Service Workers and a great offline experience.&lt;/p&gt;
  2390. &lt;ul&gt;
  2391. &lt;li&gt;&lt;strong&gt;Code splitting&lt;/strong&gt;. A great website loads really fast. Code splitting
  2392. is a technique for ensuring that every page loads with &lt;em&gt;only&lt;/em&gt; the code&lt;/li&gt;
  2393. &lt;/ul&gt;
  2394. &lt;p&gt;that’s necessary for that page.&lt;/p&gt;
  2395. &lt;ul&gt;
  2396. &lt;li&gt;&lt;strong&gt;Themes &amp;#x26; Plugins&lt;/strong&gt;. Wordpress &amp;#x26; Jekyll are both great examples of
  2397. open source communities with robust theme &amp;#x26; plugins ecosystems. I’d&lt;/li&gt;
  2398. &lt;/ul&gt;
  2399. &lt;p&gt;love something like that to develop around Gatsby.&lt;/p&gt;
  2400. &lt;ul&gt;
  2401. &lt;li&gt;&lt;strong&gt;Website &amp;#x26; Documentation/Tutorials&lt;/strong&gt;. Somewhat ironically for a
  2402. website building tool, Gatsby doesn’t yet have a website. This will be&lt;/li&gt;
  2403. &lt;/ul&gt;
  2404. &lt;p&gt;fixed, plus I’ll be writing high-quality documentation and tutorials.&lt;/p&gt;
  2405. &lt;ul&gt;
  2406. &lt;li&gt;&lt;strong&gt;Pull instead of Push&lt;/strong&gt;. This last idea is a bit abstract but super
  2407. powerful. Currently, data in Gatsby (like pretty much every static site&lt;/li&gt;
  2408. &lt;/ul&gt;
  2409. &lt;p&gt;generator) is &lt;em&gt;pushed&lt;/em&gt; into templates to be rendered into HTML. This is
  2410. a simple pattern and works great for many use cases. But when you start
  2411. working on more complex sites, you really start to miss the flexibility
  2412. of building a database-driven site. With a database, all your data is
  2413. available to query against in any fashion that you’d like. Whatever bits
  2414. of data you need to assemble a page, you can &lt;em&gt;pull&lt;/em&gt; in. You want to
  2415. create author pages showing their bio &amp;#x26; last 5 posts? It’s just a query
  2416. away. I want this same flexibility for Gatsby. I want to be able to
  2417. query my markdown files and treat them as a database of sorts. I’ve hit
  2418. on what I think is an excellent way to do this and am prototyping the
  2419. code. Expect to hear more on this soon. Ping me if you’d like an early
  2420. demo. It’s using &lt;a href=&quot;http://graphql.org&quot;&gt;GraphQL&lt;/a&gt; under the hood and the
  2421. collocated queries pattern developed by
  2422. &lt;a href=&quot;https://facebook.github.io/relay/&quot;&gt;Relay&lt;/a&gt;. I couldn’t be more excited
  2423. about this feature. It’ll open up so many useful and powerful options.&lt;/p&gt;
  2424. &lt;p&gt;The web is an incredible place. I’m so happy I get to help build it. If
  2425. Gatsby or Typography.js excite you, I’d love you to join in helping
  2426. design &amp;#x26; document &amp;#x26; build them.&lt;/p&gt;
  2427. &lt;p&gt;Also a quick endnote. I noticed while writing this that my &lt;a href=&quot;https://bricolage.io/first-post/&quot;&gt;first blog
  2428. post&lt;/a&gt; was a bit over 10 years ago!
  2429. Happy anniversary blog! :-)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Tools to help administer your Facebook Groups]]></title><description><![CDATA[I’m an administrator for an active Facebook group. There’s about a 100 or so of us
  2430. that regularly post and discuss various issues. As most…]]></description><link>https://bricolage.io/tools-administer-facebook-groups/</link><guid isPermaLink="false">https://bricolage.io/tools-administer-facebook-groups/</guid><pubDate>Tue, 20 May 2014 23:46:37 GMT</pubDate><content:encoded>&lt;p&gt;I’m an administrator for an active Facebook group. There’s about a 100 or so of us
  2431. that regularly post and discuss various issues. As most members live in or have some
  2432. connection to Silicon Valley, discussions tend to center around startup/technology issues.&lt;/p&gt;
  2433. &lt;p&gt;Despite regular calls to try other group discussion solutions, we’ve never moved on.
  2434. Facebook Groups, while underpowered in many ways, has the key advantage that they’re on, well, Facebook.
  2435. Facebook is the common dominator of online social networks. Almost everyone has an
  2436. account and visits it at least once in a while. Which is great for helping keep
  2437. a group active. Asking a new member of the group to add yet another social network
  2438. to their online browsing routine seems like too big of hurdle.&lt;/p&gt;
  2439. &lt;p&gt;So while the group has been a great success, the almost complete lack of adminstrative and analytics
  2440. tools can be frustrating. So recently I’ve started a project to work around this.
  2441. I’ve written two paired tools. The first, &lt;code class=&quot;language-text&quot;&gt;facebook-export&lt;/code&gt; handles connecting to Facebook’s API
  2442. and downloading member and posts information. The second, &lt;code class=&quot;language-text&quot;&gt;facebook-analyze&lt;/code&gt;, provides
  2443. several simple tools to help you understand and administer your groups.&lt;/p&gt;
  2444. &lt;p&gt;Hopefully this is helpful to some of you. For installation and usage instructions, see
  2445. the &lt;a href=&quot;https://github.com/KyleAMathews/facebook-export&quot;&gt;Github repo&lt;/a&gt;. Feedback and
  2446. pull requests welcome.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hosting static sites with Docker and Nginx]]></title><description><![CDATA[For most of its life, this blog has run on Drupal. But as I no longer do Drupal
  2447. development, maintaining (and even using) Drupal feels like…]]></description><link>https://bricolage.io/hosting-static-sites-with-docker-and-nginx/</link><guid isPermaLink="false">https://bricolage.io/hosting-static-sites-with-docker-and-nginx/</guid><pubDate>Thu, 24 Apr 2014 22:12:03 GMT</pubDate><content:encoded>&lt;p&gt;For most of its life, this blog has run on Drupal. But as I no longer do Drupal
  2448. development, maintaining (and even using) Drupal feels like more and more of a burden.
  2449. So like the other &lt;a href=&quot;https://twitter.com/paulg/status/402205795552489472&quot;&gt;cool kids on the internet&lt;/a&gt;
  2450. I decided to convert my site to a static website. Easy to host, zero security updates, and completely customizable.&lt;/p&gt;
  2451. &lt;p&gt;I evaluated quite a few of the &lt;a href=&quot;http://staticgen.com/&quot;&gt;popular static site frameworks&lt;/a&gt; out there e.g.
  2452. &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; and &lt;a href=&quot;http://docpad.org/&quot;&gt;Docpad&lt;/a&gt; but none of them
  2453. really attracted me. It seemed the problem of generating an HTML site was small enough
  2454. that with &lt;a href=&quot;http://gulpjs.com&quot;&gt;GulpJS&lt;/a&gt;, a number of &lt;a href=&quot;https://github.com/KyleAMathews/blog/blob/master/package.json&quot;&gt;NPM modules&lt;/a&gt;,
  2455. and some glue code I could easily build my own static site generator.&lt;/p&gt;
  2456. &lt;p&gt;And as hoped, building a custom static site generator turned out to be straightforward.
  2457. Props to GulpJS and the vast treasure-trove of Node.js modules in the &lt;a href=&quot;https://www.npmjs.org/&quot;&gt;NPM repository&lt;/a&gt;.
  2458. You can see the meat of the logic for generating this site &lt;a href=&quot;https://github.com/KyleAMathews/blog/blob/master/gulpfile.coffee#L23-L78&quot;&gt;at the blog’s repo&lt;/a&gt;.&lt;/p&gt;
  2459. &lt;p&gt;The next task was how to host the site. I briefly considered using Amazon S3, which is
  2460. a very attractive option as it’s very fast and essentially infinitely scalable, but decided against
  2461. it as I wanted a chance to play around with two other software tools, &lt;a href=&quot;http://docker.io&quot;&gt;Docker&lt;/a&gt; and &lt;a href=&quot;http://nginx.org/&quot;&gt;Nginx&lt;/a&gt;.&lt;/p&gt;
  2462. &lt;h2 id=&quot;building-applications-with-docker&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#building-applications-with-docker&quot; aria-label=&quot;building applications with docker permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Building applications with Docker&lt;/h2&gt;
  2463. &lt;p&gt;Docker has really captured my and many other developers’ imaginations. Its primary
  2464. attraction to me is the utter simplicity it enables in packaging and deploying server applications.
  2465. Coming from years of writing complicated &lt;a href=&quot;http://www.getchef.com/&quot;&gt;Chef&lt;/a&gt; or &lt;a href=&quot;http://www.ansible.com/home&quot;&gt;Ansible&lt;/a&gt;
  2466. scripts, being able to bundle each applications’ dependencies together is a breath of
  2467. fresh air. &lt;a href=&quot;http://c2.com/cgi/wiki?GlobalVariablesAreBad&quot;&gt;Global variables (and packages) are bad&lt;/a&gt;.
  2468. Docker lets you completely ignore the &lt;em&gt;global state&lt;/em&gt; of the server that’s running
  2469. your application. It’s truly a “Write once, run anywhere” system. If it works on
  2470. your laptop, it’ll work in production no matter where or what it’s installed with.&lt;/p&gt;
  2471. &lt;p&gt;This changes how you think about the boundaries of your application.
  2472. Consider my case of hosting this static website. Typically you’d think of this blog
  2473. as the collection of HTML, CSS, and images that make up the site.&lt;/p&gt;
  2474. &lt;p&gt;What you think your application is affects how you deploy it. If your application is a bundle of files then
  2475. “deploying” means placing these files inside a software system that understands HTTP and can serve files, e.g. Apache or Nginx.&lt;/p&gt;
  2476. &lt;p&gt;Compare this to how I’m using Docker for this blog. Instead of using a global Nginx instance
  2477. to serve my blog, I create a Docker image with Nginx &lt;em&gt;and&lt;/em&gt; my blog’s files. Which makes the resulting “blog application”
  2478. an atomic unit that I can build, test, and run anywhere as many times as I want.&lt;/p&gt;
  2479. &lt;p&gt;This is a much more preferable outcome. Instead of a messy collection of files as my outcome,
  2480. with Docker, I have a neat tidy Docker image. Now to to run a very high-performance blog, all I
  2481. need to do is type &lt;code class=&quot;language-text&quot;&gt;docker run blog&lt;/code&gt; and off it goes.&lt;/p&gt;
  2482. &lt;p&gt;This makes some fun and useful things quite easy. E.g. while writing this post, I was curious how well
  2483. my blog would hold up under load testing. I didn’t want to use the container running the live
  2484. version of this blog for the testing as that would fill my access logs with useless entries.
  2485. So instead, I ran an additional instance of my Docker blog image on the
  2486. same server but listening on a different port. I used this twin
  2487. version of my blog to do the load testing and threw it away once the testing was finished. Setting up
  2488. a parallel version of this blog would be much more difficult with a global installation of Nginx.&lt;/p&gt;
  2489. &lt;h2 id=&quot;docker-layers&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#docker-layers&quot; aria-label=&quot;docker layers permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Docker layers&lt;/h2&gt;
  2490. &lt;p&gt;Docker has an additional innovation which I love. Docker lets you create base images
  2491. which your application can build on. Since all static sites need about the same Nginx configuration,
  2492. I created a &lt;a href=&quot;https://github.com/KyleAMathews/docker-nginx&quot;&gt;Nginx Docker image&lt;/a&gt;
  2493. I can use (and anyone else) as a base whenever building a new static website.&lt;/p&gt;
  2494. &lt;p&gt;By encapsulating the Nginx configuration in an image, the Dockerfile (Docker’s DSL
  2495. for defining image builds) &lt;a href=&quot;https://github.com/KyleAMathews/blog/blob/master/Dockerfile&quot;&gt;for this blog&lt;/a&gt; is incredibly simple. Three lines in fact.&lt;/p&gt;
  2496. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;FROM kyma/docker-nginx
  2497. ADD public/ /var/www
  2498. CMD &lt;span class=&quot;token string&quot;&gt;&apos;nginx&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2499. &lt;p&gt;The first line tells Docker to use my Nginx image as the base, the second says to add
  2500. the site’s files within the image at /var/www, and the third says to run Nginx when
  2501. a new container is started.&lt;/p&gt;
  2502. &lt;p&gt;There’s tons of similar base images available on the public Docker image index for building &lt;a href=&quot;https://index.docker.io/search?q=ruby&quot;&gt;Ruby&lt;/a&gt;,
  2503. &lt;a href=&quot;https://index.docker.io/search?q=python&quot;&gt;Python&lt;/a&gt;, &lt;a href=&quot;https://index.docker.io/search?q=go&quot;&gt;Go&lt;/a&gt;, etc. applications.
  2504. But it’s also trivial to create base images for your specific needs. For example, this is
  2505. a &lt;a href=&quot;https://github.com/KyleAMathews/docker-nodejs-base/blob/master/Dockerfile&quot;&gt;base image I wrote with the tools I commonly use to build web frontends&lt;/a&gt;.
  2506. I’ve used it now for several side projects of mine.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[New Beginnings]]></title><description><![CDATA[Quick announcement post. First I’m leaving Pantheon, the startup I’ve been working at the past two years.
  2507. It’s been a fantastic run and I’ve…]]></description><link>https://bricolage.io/new-beginnings/</link><guid isPermaLink="false">https://bricolage.io/new-beginnings/</guid><pubDate>Wed, 16 Apr 2014 22:40:32 GMT</pubDate><content:encoded>&lt;p&gt;Quick announcement post.&lt;/p&gt;
  2508. &lt;p&gt;First I’m leaving &lt;a href=&quot;http://getpantheon.com&quot;&gt;Pantheon&lt;/a&gt;, the startup I’ve been working at the past two years.
  2509. It’s been a fantastic run and I’ve loved working there. They have a great
  2510. team and product and it’s been a pleasure helping build the best Drupal (and now Wordpress)
  2511. professional website platform.&lt;/p&gt;
  2512. &lt;p&gt;Highlights include helping with:&lt;/p&gt;
  2513. &lt;ul&gt;
  2514. &lt;li&gt;Rebuilding the Pantheon dashboard from the ground up as a real-time single-page-app.&lt;/li&gt;
  2515. &lt;li&gt;&lt;a href=&quot;http://techcrunch.com/2013/07/10/pantheon-multidev/&quot;&gt;Multidev&lt;/a&gt;—cloud development environments for teams.&lt;/li&gt;
  2516. &lt;/ul&gt;
  2517. &lt;p&gt;Basically Git for the entire stack (files, DB, and code) not just code. It’s been a huge hit for customers with larger teams of developers.&lt;/p&gt;
  2518. &lt;ul&gt;
  2519. &lt;li&gt;&lt;a href=&quot;https://www.getpantheon.com/pantheon-one&quot;&gt;Pantheon One&lt;/a&gt;—a suite of tools for customers administering 100s to 1000s of websites.&lt;/li&gt;
  2520. &lt;/ul&gt;
  2521. &lt;p&gt;Now that I’ve left Pantheon, for the indefinite future I’ll be freelancing and working my way through a long list
  2522. of side-projects and books that have been accumulating. &lt;a href=&quot;mailto:mathews.kyle@gmail.com&quot;&gt;Contact me&lt;/a&gt; if you have interesting
  2523. problems you’d like help with.&lt;/p&gt;
  2524. &lt;p&gt;I’m also back in the blogging game. I rebuilt this blog recently as a static site with a custom theme and new domain name. There’s a number of topics, technical and otherwise, I’ll be exploring here in future months.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Humility and judgement]]></title><description><![CDATA[Ran across a lovely quote tonight. It expresses well a basic tenet of mine, that
  2525. people and groups do everything they do for a reason that…]]></description><link>https://bricolage.io/humility-and-judgement/</link><guid isPermaLink="false">https://bricolage.io/humility-and-judgement/</guid><pubDate>Fri, 30 Dec 2011 03:48:00 GMT</pubDate><content:encoded>&lt;p&gt;Ran across a lovely quote tonight. It expresses well a basic tenet of mine, that
  2526. people and groups do everything they do for a reason that grows out of their
  2527. beliefs, values, and understanding of the situation.&lt;/p&gt;
  2528. &lt;p&gt;Nothing has changed me as much as trying to understand others.&lt;/p&gt;
  2529. &lt;blockquote&gt;
  2530. &lt;p&gt;In the matter of reforming things, as distinct from deforming them, there is&lt;/p&gt;
  2531. &lt;/blockquote&gt;
  2532. &lt;p&gt;one plain and simple principle; a principle which will probably be called a
  2533. paradox. There exists in such a case a certain institution or law; let us say,
  2534. for the sake of simplicity, a fence or gate erected across a road. The more
  2535. modern type of reformer goes gaily up to it and says, “I don’t see the use of
  2536. this; let us clear it away.” To which the more intelligent type of reformer will
  2537. do well to answer: “If you don’t see the use of it, I certainly won’t let you
  2538. clear it away. Go away and think. Then, when you can come back and tell me that
  2539. you do see the use of it, I may allow you to destroy it.”&lt;/p&gt;
  2540. &lt;blockquote&gt;
  2541. &lt;p&gt;This paradox rests on the most elementary common sense. The gate or fence did&lt;/p&gt;
  2542. &lt;/blockquote&gt;
  2543. &lt;p&gt;not grow there. It was not set up by somnambulists who built it in their sleep.
  2544. It is highly improbable that it was put there by escaped lunatics who were for
  2545. some reason loose in the street. Some person had some reason for thinking it
  2546. would be a good thing for somebody. And until we know what the reason was, we
  2547. really cannot judge whether the reason was reasonable. It is extremely probable
  2548. that we have overlooked some whole aspect of the question, if something set up
  2549. by human beings like ourselves seems to be entirely meaningless and mysterious.
  2550. There are reformers who get over this difficulty by assuming that all their
  2551. fathers were fools; but if that be so, we can only say that folly appears to be
  2552. a hereditary disease. But the truth is that nobody has any business to destroy a
  2553. social institution until he has really seen it as an historical institution. If
  2554. he knows how it arose, and what purposes it was supposed to serve, he may really
  2555. be able to say that they were bad purposes, that they have since become bad
  2556. purposes, or that they are purposes which are no longer served. But if he simply
  2557. stares at the thing as a senseless monstrosity that has somehow sprung up in his
  2558. path, it is he and not the traditionalist who is suffering from an illusion.&lt;/p&gt;
  2559. &lt;p&gt;The article the quote came from is well worth reading as well.
  2560. &lt;a href=&quot;http://www.janegalt.net/blog/archives/005244.html&quot;&gt;http://www.janegalt.net/blog/archives/005244.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building your own tools]]></title><description><![CDATA[I was explaining to someone in IRC earlier this week about why I was building my own project management software and said it was basically…]]></description><link>https://bricolage.io/building-your-own-tools/</link><guid isPermaLink="false">https://bricolage.io/building-your-own-tools/</guid><pubDate>Fri, 28 Oct 2011 08:00:37 GMT</pubDate><content:encoded>&lt;p&gt;I was explaining to someone in IRC earlier this week about why I was &lt;a href=&quot;/simplegtd&quot;&gt;building my own project management software&lt;/a&gt; and said it was basically because managing my projects and tasks (or more abstractly, what I pay attention to) is so critical to everything else I do that I want to control the software behind it.&lt;/p&gt;
  2561. &lt;p&gt;Afterwards, that struck me as a rather important point. After some further thinking, my point is fairly close to the common business question of whether a particular service should be outsourced or kept in-house. There’s a lot that goes into making that decision but one pretty hard-and-fast rule is you never outsource a core competency.&lt;/p&gt;
  2562. &lt;p&gt;I realized that in persisting in using poor-fitting tools for managing my attention, I had to some extent been outsourcing my core competency as a knowledge worker, i.e. defining what my work is and helping focus my attention. My ability to effectively do these two tasks has been hindered by using poor quality and poor fitting tools. &lt;a href=&quot;http://en.wikiquote.org/wiki/Marshall_McLuhan&quot;&gt;As Marshall Mcluhan said&lt;/a&gt;, “we shape our tools and thereafter our tools shape us.” Tools can be powerful inhibitors or powerful enablers in all sorts of subtle and unexpected ways.&lt;/p&gt;
  2563. &lt;p&gt;The last few weeks I’ve started paying much closer attention to the quality and fit of my intellectual tools and if I should bring any of their creation “in-house” and recreate them to meet my particular needs. Which is a tricky thing to decide. You don’t want, in a fit of vainglory, to go off and try to recreate &lt;a href=&quot;http://en.wikipedia.org/wiki/Vim_(text_editor)&quot;&gt;Vim&lt;/a&gt; badly. I think in addition to my project management tool, I’ll be building a few writing tools. Beyond that I’ll wait to see how these first few experiments go.&lt;/p&gt;
  2564. &lt;p&gt;What tools, intellectual or otherwise, have you built and how well did they work?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Chatroom Feature for Drupal 6.x built with Node.js and Backbone.js]]></title><description><![CDATA[Recently, for fun and learning, I built a group chatroom feature for Drupal 6.x. I’ve been learning and using Node.js and Backbone.js the…]]></description><link>https://bricolage.io/chatroom-feature-drupal-6x-built-nodejs-and-backbonejs/</link><guid isPermaLink="false">https://bricolage.io/chatroom-feature-drupal-6x-built-nodejs-and-backbonejs/</guid><pubDate>Wed, 12 Oct 2011 19:47:34 GMT</pubDate><content:encoded>&lt;p&gt;Recently, for fun and learning, I built a group chatroom feature for Drupal 6.x. I’ve been learning and using &lt;a href=&quot;http://nodejs.org&quot;&gt;Node.js&lt;/a&gt; and &lt;a href=&quot;http://backbonejs.org/&quot;&gt;Backbone.js&lt;/a&gt; the past few months and building a chatroom seemed like a great project to stretch my skills.&lt;/p&gt;
  2565. &lt;p&gt;I’ve recently pronounced it “finished” and the &lt;a href=&quot;https://github.com/KyleAMathews/Eduglu-Chatroom&quot;&gt;code is available on Github&lt;/a&gt;. There are a few obscure bugs left but by and large, it’s plenty stable for those wanting a chatroom on Drupal 6.x.&lt;/p&gt;
  2566. &lt;p&gt;The feature should work with any site using Spaces and Organic Groups. The demo site I setup, for example, is using a default installation of &lt;a href=&quot;http://openatrium.com/&quot;&gt;Open Atrium.&lt;/a&gt;&lt;/p&gt;
  2567. &lt;h2 id=&quot;technology-stack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#technology-stack&quot; aria-label=&quot;technology stack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Technology stack&lt;/h2&gt;
  2568. &lt;p&gt;The chatroom is built using a now fairly standard set of technologies. For the backend, I used Node.js, &lt;a href=&quot;http://redis.io&quot;&gt;Redis&lt;/a&gt;, and MySQL. I used &lt;a href=&quot;http://socket.io&quot;&gt;Socket.io&lt;/a&gt; for sending the chat messages between clients and the server. I used &lt;a href=&quot;http://brunchwithcoffee.com&quot;&gt;Brunch&lt;/a&gt; to build the frontend. Brunch bundles together a number of really nice tools for building single-page Javascript apps including &lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;Coffeescript&lt;/a&gt;, &lt;a href=&quot;http://backbonejs.org/&quot;&gt;Backbone.js&lt;/a&gt;, &lt;a href=&quot;http://documentcloud.github.com/underscore/&quot;&gt;Underscore.js&lt;/a&gt;, &lt;a href=&quot;https://github.com/sstephenson/stitch&quot;&gt;Stitch&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sstephenson/eco&quot;&gt;Eco&lt;/a&gt;.&lt;/p&gt;
  2569. &lt;h2 id=&quot;a-few-conclusions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-few-conclusions&quot; aria-label=&quot;a few conclusions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A few conclusions&lt;/h2&gt;
  2570. &lt;p&gt;Backbone.js rocks. It makes creating highly interactive, responsive interfaces almost trivial while keeping your code neatly organized. It’s a very neat round-up of the best patterns for creating Javascript applications.&lt;/p&gt;
  2571. &lt;p&gt;Hand-rolling a way to securely connect Drupal and Node.js was a pain—probably the hardest part of building the feature. Use the &lt;a href=&quot;http://drupal.org/project/nodejs&quot;&gt;Node.js Integration module&lt;/a&gt; if you’re on Drupal 7.&lt;/p&gt;
  2572. &lt;p&gt;Redis is really impressive. It has one of the shallowest learning curve of any technology I’ve used. I was up and running with it in perhaps 15 minutes. Add that it’s incredibly fast and you have a very handy tool to add to your toolset.&lt;/p&gt;
  2573. &lt;p&gt;Note: the demo site that was linked from here is now off-line.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SimpleGTD]]></title><description><![CDATA[I’m starting work soon on building a new open source Getting Things Done web app that I’m tentatively calling SimpleGTD. I’ve tried a good…]]></description><link>https://bricolage.io/simplegtd/</link><guid isPermaLink="false">https://bricolage.io/simplegtd/</guid><pubDate>Fri, 07 Oct 2011 18:59:39 GMT</pubDate><content:encoded>&lt;p&gt;I’m starting work soon on building a new open source &lt;a href=&quot;http://en.wikipedia.org/wiki/Getting_Things_Done&quot;&gt;Getting Things Done&lt;/a&gt; web app that I’m tentatively calling &lt;a href=&quot;https://github.com/KyleAMathews/makersgtd&quot;&gt;SimpleGTD&lt;/a&gt;. I’ve tried a good chunk of the GTD apps out there and have been dissatisfied with each of them for one reason or another.&lt;/p&gt;
  2574. &lt;h2 id=&quot;motivations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivations&quot; aria-label=&quot;motivations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivations&lt;/h2&gt;
  2575. &lt;p&gt;I have a few reasons for starting this project.&lt;/p&gt;
  2576. &lt;p&gt;First is I really like the GTD system. When it’s running well, I really do feel more organized and able to focus on my priorities. But I’ve never been able to find a system that was maintainable long-term. I’ve tried many that worked for a time but each gradually required more and more effort to maintain until eventually I had to quit using them. I’ve thought a fair bit about why they’ve failed and I believe I can create an app that will actually work long-term.&lt;/p&gt;
  2577. &lt;p&gt;My second motivation is there’s a number of really cool technologies I’d like to learn or practice with including Node.js, Coffeescript, Backbone.js, ElasticSearch, Responsive Design, AppCache, and LocalStorage—each of which I’ll be using to build SimpleGTD. It’s really hard to learn new skills outside of the context of working toward a concrete goal so a nice compact project like this is gold.&lt;/p&gt;
  2578. &lt;p&gt;My third motivation is to keep my startup “muscles” strong. For a variety of reasons, I’m not interested in doing another startup right now. But I will in the future. I plan to offer hosting and support for SimpleGTD app (for those not wanting to host it themselves). Doing the marketing, handling payments, support issues, etc. will allow me to practice all the parts of running a “real” company without the stress of caring whether my micro-business actually succeeds.&lt;/p&gt;
  2579. &lt;p&gt;I have a number of similar side projects planned or in progress that I’ll also be treating as micro-businesses. I’m building these projects primarily for myself but it’ll be fun to also put them out in the wild and see what happens.&lt;/p&gt;
  2580. &lt;h2 id=&quot;key-design-principles&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#key-design-principles&quot; aria-label=&quot;key design principles permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Key design principles&lt;/h2&gt;
  2581. &lt;h3 id=&quot;fast&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fast&quot; aria-label=&quot;fast permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fast&lt;/h3&gt;
  2582. &lt;p&gt;&lt;a href=&quot;http://thinkvitamin.com/web-apps/fred-wilsons-10-golden-principles-of-successful-web-apps/&quot;&gt;To quote Fred Wilson&lt;/a&gt;, “Speed is more than a feature. Speed is the most important feature. If your application is slow, people won’t use it.”&lt;/p&gt;
  2583. &lt;p&gt;More than any other flaw, lack of speed is the reason I eventually have quit the software GTD apps I’ve tried. Paper is really fast. Compared to a piece of paper or sticky note sitting on your desk, it’s cumbersome to have to load a desktop or web app just to view your tasks.&lt;/p&gt;
  2584. &lt;p&gt;To compete with paper, any software-based GTD system must load instantly and quickly show you exactly what you want.&lt;/p&gt;
  2585. &lt;p&gt;Other actions, such as navigating, adding, and editing projects and actions must also be fast. My plan is that all movement within the application can be done via the keyboard, ala GMail.&lt;/p&gt;
  2586. &lt;p&gt;To meet my speed standards, I’m going to use a variety of techniques. First all code and data will be stored locally using AppCache and LocalStorage. The app will load first from LocalStorage and only then sync with the server. This should solve much of the slow-start problem.&lt;/p&gt;
  2587. &lt;p&gt;Second, I’ll build the app as a single-page app. All communication with the server will happen asynchronously. This means viewing a project page or adding a new task won’t require reloading the page so navigation within the app will be fast.&lt;/p&gt;
  2588. &lt;h3 id=&quot;simple&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#simple&quot; aria-label=&quot;simple permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Simple&lt;/h3&gt;
  2589. &lt;p&gt;A big problem I’ve had with other systems I’ve tried is they’re too complex for my tastes. They try too hard. I don’t want to implement &lt;a href=&quot;http://www.dragosroua.com/staying-gtd-over-the-hype/&quot;&gt;every idea David Allen has ever come up with&lt;/a&gt;. All I want my GTD app to do is add projects, add action items to these projects, and easily choose and sort the actions that I’ll be working on the next day or two.&lt;/p&gt;
  2590. &lt;p&gt;Paper-like simplicity is my goal here, not Microsoft Project.&lt;/p&gt;
  2591. &lt;h3 id=&quot;built-for-the-21st-century&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#built-for-the-21st-century&quot; aria-label=&quot;built for the 21st century permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Built for the 21st century&lt;/h3&gt;
  2592. &lt;p&gt;This is the 21st century. Almost everyone now is carrying around a smartphone in their pocket 24/7. No one prints off todos anymore. You should be able to select your action items for the day on your computer, walk out the door, open the app on your phone and instantly see what needs to be done.&lt;/p&gt;
  2593. &lt;h2 id=&quot;built-to-forgive-and-protect&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#built-to-forgive-and-protect&quot; aria-label=&quot;built to forgive and protect permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Built to forgive and protect&lt;/h2&gt;
  2594. &lt;p&gt;The above ideas are fairly standard. My last idea is a bit more unique.&lt;/p&gt;
  2595. &lt;p&gt;Keeping task lists is a hard discipline and &lt;a href=&quot;https://plus.google.com/114723964985237592593/posts/hsVEEpov6Ti&quot;&gt;almost everyone fails at times&lt;/a&gt;. Our tasks lists seem to quickly disintegrate into a disorganized, unwieldy mess without the occasional superhuman effort to clean things up. I’d like SimpleGTD to help us avoid that superhuman effort.&lt;/p&gt;
  2596. &lt;p&gt;I think this is one reason I like paper. When a list of tasks on paper gets too overwhelming, you can just throw it away or bury it under other paper. Most GTD/Task software is less forgiving in this respect. If you add a project or task it’s there forever until you explicitly delete it.&lt;/p&gt;
  2597. &lt;p&gt;The problem is our brains has a selective membrane of sorts for commitments. It requires little force to insert a commitment but quite a bit of force to remove it. We’re addicted to being “productive” and the rewards that come from completing tasks. With each added task, we imagine the praise we’ll get once we accomplish it. Each new task is a shot of dopamine. Deleting a task or project kills the hope for that future reward.&lt;/p&gt;
  2598. &lt;p&gt;In my past forays with GTD software, I would cheerful add tasks and projects much faster than I could finish them. They would accumulate and accumulate until I dreaded even looking at the software with its long list of uncompleted tasks.&lt;/p&gt;
  2599. &lt;p&gt;What we have is a garbage collection problem. We accumulate projects and tasks don’t throw out the ones we’ve abandoned. The garbage piles up higher and higher until eventually we have to abandon the house altogether and start a new one.&lt;/p&gt;
  2600. &lt;p&gt;Like people portrayed on the TV show &lt;a href=&quot;http://www.aetv.com/hoarders/about/&quot;&gt;Hoarders&lt;/a&gt;, we find it difficult to throw away commitments.&lt;/p&gt;
  2601. &lt;p&gt;I think the weekly review is what’s supposed to corral this problem but I’ve never been able to do one consistently — most likely because I dread having to decide what projects/tasks to abandon.&lt;/p&gt;
  2602. &lt;p&gt;So what we need is to have the software help us to delete projects/tasks that we can’t accomplish. As I’ve proven many-a-time, I can’t manually keep my tasks lists in check. What we need I think is a Roomba-like garbage collector that detects dying projects and cleans them up for us.&lt;/p&gt;
  2603. &lt;p&gt;But how to detect those projects/tasks that have gone stale—those projects/tasks that we’ve effectively abandoned but haven’t yet told our consciousness? How can the software pick up on our unconscious cues that a task or project should be removed?&lt;/p&gt;
  2604. &lt;p&gt;The best way I’ve thought of so far is to track how often we look at something. If we’re actually working on a project or task, we’ll be viewing or editing it fairly often. When we start to abandon a project or task, we stop looking at it. The software will track each time a project or task is viewed. If enough time passes since the last time you viewed the project, it’ll be garbage collected and removed from active view. For tasks, they’ll be removed from the active task list. For projects, they’ll be moved to the someday/maybe list. And for projects already in the someday/maybe list, eventually they’ll be moved into an archived list.&lt;/p&gt;
  2605. &lt;p&gt;On timing, my thinking is tasks get garbage collected after 24 hours, projects after two months, and someday/maybe projects after six months.&lt;/p&gt;
  2606. &lt;p&gt;So if you want a task or project to disappear, just ignore it and it’ll eventually go away. Which follows our natural pattern. If we don’t want to do something, we stop thinking about and eventually forget it. Most software has the annoying property of never forgetting.&lt;/p&gt;
  2607. &lt;p&gt;At the start of the week, your active todos list should be white and empty, waiting for you to select the weeks tasks. If you load up a number of tasks at the beginning of the week but an emergency comes up, those tasks will silently disappear letting you focus on the emergency. If you’re heavily focused for a few months on a couple projects at work, all our other projects will kindly hide themselves in someday/maybe. If we abandon the GTD-ship in despair, when we come back, all our projects will be waiting in storage and easily reactivated.&lt;/p&gt;
  2608. &lt;h2 id=&quot;moving-forward&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#moving-forward&quot; aria-label=&quot;moving forward permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Moving forward&lt;/h2&gt;
  2609. &lt;p&gt;I’m really excited about my plans. It should be a fun project technically and is software I could really use right now.&lt;/p&gt;
  2610. &lt;h3 id=&quot;how-you-can-get-involved&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-you-can-get-involved&quot; aria-label=&quot;how you can get involved permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How you can get involved&lt;/h3&gt;
  2611. &lt;p&gt;I’d appreciate feedback on my ideas. If you’ve tried and failed with GTD in the past, why did you fail? How did the system you used (software or otherwise) help/hinder you? Did my analysis, that failure comes from an overload of low-priority projects/tasks, resonate with you? Am I missing anything obvious here?&lt;/p&gt;
  2612. &lt;p&gt;Once I get a usable prototype built, I’d love beta testers. Please contact me if you’re interested in getting early access.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[It is the learners who inherit the future]]></title><description><![CDATA[The central task of education is to implant a will and a facility for learning; it should produce not learned but learning people. The truly…]]></description><link>https://bricolage.io/it-learners-who-inherit-future/</link><guid isPermaLink="false">https://bricolage.io/it-learners-who-inherit-future/</guid><pubDate>Mon, 25 Jul 2011 04:59:38 GMT</pubDate><content:encoded>&lt;blockquote&gt;
  2613. &lt;p&gt;The central task of education is to implant a will and a facility for&lt;/p&gt;
  2614. &lt;/blockquote&gt;
  2615. &lt;p&gt;learning; it should produce not learned but learning people. The truly human
  2616. society is a learning society, where grandparents, parents, and children are
  2617. students together.&lt;/p&gt;
  2618. &lt;blockquote&gt;
  2619. &lt;p&gt;In a time of drastic change it is the learners who&lt;/p&gt;
  2620. &lt;/blockquote&gt;
  2621. &lt;p&gt;inherit the future. The learned usually find themselves equipped to live in a
  2622. world that no longer exists.&lt;/p&gt;
  2623. &lt;p&gt;—Eric Hoffer&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Developing faith in God]]></title><description><![CDATA[The following is a talk I recently gave at the local LDS church I attend. Our church doesn’t have paid ministry meaning everyone who attends…]]></description><link>https://bricolage.io/developing-faith-god/</link><guid isPermaLink="false">https://bricolage.io/developing-faith-god/</guid><pubDate>Sun, 26 Jun 2011 23:30:50 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;The following is a talk I recently gave at the local &lt;a href=&quot;http://lds.org&quot;&gt;LDS church&lt;/a&gt; I attend. Our church doesn’t have paid ministry meaning everyone who attends occasionally takes their turn preaching and exhorting.&lt;/em&gt;&lt;/p&gt;
  2624. &lt;p&gt;I’d like to share today some things that I’ve learned about developing faith.&lt;/p&gt;
  2625. &lt;p&gt;When I arrived on my mission, I thought I understood faith much better than I did. I was soon humbled to learn, as I tried to teach people, that no, I really didn’t know much about faith. Now properly contrite, I began my study of faith.&lt;/p&gt;
  2626. &lt;p&gt;I think my favorite definition of faith in God is to have confidence that the Lord will do what He says He’ll do. But while this sounds simple, in practice it’s quite difficult. To fully have faith in the Lord, it’s not enough to believe in the Lord, we must actually understand what He will do in different situations.&lt;/p&gt;
  2627. &lt;p&gt;This is why, I think, there’s such a strong connection between studying the gospel, personal revelation, and faith. Because the more we learn about the gospel, the better we understand what God will do and the more we can rely up on Him. The less we understand about the Lord and His gospel the harder it is to have confidence in the Lord because we won’t know what He says He will do and when He does do something, we are completely befuddled as to why He did what He did.&lt;/p&gt;
  2628. &lt;p&gt;So to me, confidence or faith in the Lord comes from knowing Him and understanding what He does and why He does what He does.&lt;/p&gt;
  2629. &lt;p&gt;It’s like having a really good friend who you’ve known forever. You know each other so well that you know how they’ll act when they’re happy, sad, disappointed, hurt, etc. Whatever the situation, you can pretty well predict how they’ll act. And you’ve also learned you can rely on them to comfort you when sad, to listen to a story when something good happens happen, to give good council when you have a problem.&lt;/p&gt;
  2630. &lt;p&gt;Developing faith in the Lord is much the same. As we get to know the Lord, understand His character, like that friend, we will soon be able to predict how the Lord will act given a certain situation. And the better we know the Lord, the better we will be able to predict what He will do and the more we can rely on Him. So in other words, understanding the Lord and having faith in the Lord is one and the same.&lt;/p&gt;
  2631. &lt;p&gt;But for this to happen, we need to have personal experiences with the Lord. If a friend wants to introduce you to another friend and raves about how cool they are and how much you’ll like them, you’ll trust their opinion but only so much. You need to meet this new person yourself before you’ll fully believe that they are as cool as your friend says.&lt;/p&gt;
  2632. &lt;p&gt;This is why I think that’s why scripture study and personal revelation are so important. Because without those things, we cannot understand God or why He does what He does. And without that understanding we cannot place full confidence in Him.&lt;/p&gt;
  2633. &lt;p&gt;And not having that understanding can cause a lot of problems. I think a lot of the difficulties we face in life, particularly ones that challenge our faith, are the result of ignorance or misunderstandings about God.&lt;/p&gt;
  2634. &lt;p&gt;For example, a trap I often fall into is I ask for blessings that the Lord doesn’t want to give me. I will pray with great sincerity for long periods of time and when the Lord finally convinces me the answer is no, I’m bitterly disappointed. If I’d understood better what the Lord wants to give me before I tried asking then I wouldn’t of been disappointed, or even surprised for that matter, when the Lord said no. I used to wander at how the &lt;a href=&quot;http://lds.org/scriptures/bofm/hel/10?lang=eng#7&quot;&gt;Lord could promise certain prophets in the scriptures that whatever they asked for would be given them&lt;/a&gt;. I don’t wander anymore because now it’s clear. The Lord could give them this power because He knew that these prophets understood Him and His plan so well that they would only ask for things He already intended to give them.&lt;/p&gt;
  2635. &lt;p&gt;So all of us struggle at times with our faith in the Lord. How do we develop stronger faith in the Lord? I think the most straightforward answer to that question is simply, learn more about Him. Learn of His character. Learn of His promises. And learn about how and when He delivers on those promises.&lt;/p&gt;
  2636. &lt;p&gt;Of course, doing this is easier said then done. I think this is the principle challenge of our life, learning about God and molding our lives after His.&lt;/p&gt;
  2637. &lt;p&gt;I testify that the Lord cares very much that we understand Him correctly and He has given us many aids to learn of Him and He places experiences in our lives which, if we let them, will help us understand who He is and why He does what He does.&lt;/p&gt;
  2638. &lt;p&gt;Now I want to share a few experiences where by learning more about the Lord, my faith was strengthened.&lt;/p&gt;
  2639. &lt;p&gt;After spending the first part of my mission in the big city in Manila, I was transferred to a very rural farming area in Alfonso, Cavite, the province just south of Manila. After one transfer with my first companion there, I got a new companion and for the first time became a senior companion. And to be honest, I was kinda terrified. I didn’t have a lot of confidence yet in my Tagalog or in my abilities as a missionary but I really wanted to do a good job. And I was putting a lot of pressure on myself to measure up. Shortly after becoming a senior companion, I read a scripture which changed my mission and my life. It’s in &lt;a href=&quot;http://lds.org/scriptures/dc-testament/dc/6?lang=eng#33&quot;&gt;Doctrine and Covenants section 6 verse 34 and 36&lt;/a&gt;. They read:&lt;/p&gt;
  2640. &lt;blockquote&gt;
  2641. &lt;p&gt;34 Therefore, fear not, little flock; do good; let earth and hell combine against you, for if ye are built upon my rock, they cannot prevail.&lt;/p&gt;
  2642. &lt;p&gt;36 Look unto me in every thought; doubt not, fear not.&lt;/p&gt;
  2643. &lt;/blockquote&gt;
  2644. &lt;p&gt;The effect of those scriptures on me was enormous. I realized much more clearly that I was on the Lord’s errand doing His will. And as long as I looked to the Lord in every thought and doubted not and feared not, He would guide, protect, and strengthen me enough to fulfill my duties as a missionary. After I read this, as we went around to our various appointments and some fear would come over me, I would repeat in my head over and over as a mantra of sorts, ”look unto me in every thought; doubt not, fear not”, and my fears would melt away.&lt;/p&gt;
  2645. &lt;p&gt;My next experience was more recent. There was something I very much desired and wanted to pray to the Lord for His help in getting it. But for various reasons at the time I felt unworthy to ask, my imperfections and weaknesses seemed to be looming over me stronger than normal. About that time I read this from &lt;a href=&quot;http://lds.org/scriptures/bofm/ether/3?lang=eng&quot;&gt;Ether chapter 3 in the Book of Mormon&lt;/a&gt;.&lt;/p&gt;
  2646. &lt;blockquote&gt;
  2647. &lt;p&gt;2 Now behold, O Lord, and do not be angry with thy servant because of his weakness before thee; for we know that thou art holy and dwellest in the heavens, and that we are unworthy before thee; because of the fall our natures have become evil continually; nevertheless, O Lord, thou has given us a commandment that we must call upon thee, that from thee we many receive according to our desires.&lt;/p&gt;
  2648. &lt;/blockquote&gt;
  2649. &lt;p&gt;As the brother of Jared, I felt unworthy and somewhat evil at the time. But this scripture helped me realize that however unworthy I felt, I was compounding the problem by not praying for my desire. I realized that we don’t have to be perfect to be blessed by the Lord. I realized that no matter how unworthy or evil we think we are, the Lord still wants us to call on him. Because I understood this, my faith grew stronger that the Lord would bless me with the things I asked.&lt;/p&gt;
  2650. &lt;p&gt;My last experience happened when I was suffering through a very difficult period of my life. There’s a story in the Book of Mormon I’ve always loved about the people led by Alma the Senior that broke away from King Noah and his people and established a new community. Soon however disaster struck and they were conquered and enslaved by a Lamenite army. I’ve always marveled at how well they stood up under this rather extreme trial. In &lt;a href=&quot;http://lds.org/scriptures/bofm/mosiah/24?lang=eng#14&quot;&gt;Mosiah 24:15&lt;/a&gt; we read:&lt;/p&gt;
  2651. &lt;blockquote&gt;
  2652. &lt;p&gt;15 And now it came to pass that the burdens which were laid upon Alma and his brethren were made light; yea, the Lord did strengthen them that they could bear up their burdens with ease, and &lt;em&gt;they did submit cheerfully and with patience to all the will of the Lord.&lt;/em&gt;&lt;/p&gt;
  2653. &lt;/blockquote&gt;
  2654. &lt;p&gt;I wandered how they were able to do that, ”submit cheerfully and with patience to all the will of the Lord” as I most certainly was not feeling the least bit cheerful and patient at the time. Were they some sort of super-spiritual humans that could perform great feats of self-control that I could never hope to?&lt;/p&gt;
  2655. &lt;p&gt;But then the Spirit gently told me I was misreading the story. He directed my attention again to the &lt;a href=&quot;http://lds.org/scriptures/bofm/mosiah/24?lang=eng#13&quot;&gt;previous verse&lt;/a&gt;.&lt;/p&gt;
  2656. &lt;blockquote&gt;
  2657. &lt;p&gt;14 And I will also ease the burdens which are put upon your shoulders, that even you cannot feel them upon your backs, even while you are in bondage.&lt;/p&gt;
  2658. &lt;/blockquote&gt;
  2659. &lt;p&gt;It wasn’t that these people were so special (though they were) that they were able to bear this trial with cheerfulness and patience, it was because the Lord blessed them that their burdens became light. The Spirit also directed me to &lt;a href=&quot;http://lds.org/scriptures/dc-testament/dc/30?lang=eng&quot;&gt;Doctrine and Covenants 30:1&lt;/a&gt;.&lt;/p&gt;
  2660. &lt;blockquote&gt;
  2661. &lt;p&gt;1 Behold, I say unto you, David, that you have feared man and &lt;em&gt;have not relied on me for strength as you ought.&lt;/em&gt;&lt;/p&gt;
  2662. &lt;/blockquote&gt;
  2663. &lt;p&gt;I felt this chastisement also applied to me. I thought I had to endure the trouble I was facing by myself and was not relying on the Lord for strength as I ought. Humbled, I prayed that the Lord would strengthen me. From then on through the end of the experience, when the trouble threatened to overwhelm me, I would stop and pray, ”Lord, I can’t do this by myself, please help me”, and soon, I found that my burdens too became much easier to bear.&lt;/p&gt;
  2664. &lt;p&gt;I testify that the Lord does exist. That He does love us. That He is merciful and kind and just. And that He can and will fulfill every promise He has made. And that as we learn of Him, learn of His will for us, and align our lives with His will, our confidence in Him will wax strong and we will be richly blessed all of our days.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to create a résumé using Latex]]></title><description><![CDATA[Since recent changes in my life have forced me to look for new employment, I’ve had to relearn the long-forgotten art of writing a résumé…]]></description><link>https://bricolage.io/how-create-resume-using-latex/</link><guid isPermaLink="false">https://bricolage.io/how-create-resume-using-latex/</guid><pubDate>Sat, 21 May 2011 02:22:02 GMT</pubDate><content:encoded>&lt;p&gt;Since &lt;a href=&quot;/eduglu-enters-deadpool/&quot;&gt;recent changes in my life&lt;/a&gt; have forced me to look for new employment, I’ve had to relearn the long-forgotten art of writing a résumé. Since the actual process of writing a résumé is fairly straightforward, and boring, I decided to spice things up by figuring out how to do it in &lt;a href=&quot;http://en.wikipedia.org/wiki/LaTeX&quot;&gt;Latex&lt;/a&gt;, a recent hobby of mine.&lt;/p&gt;
  2665. &lt;p&gt;Googling found quite a few different Latex résumé templates to start from and my favorite by far was &lt;a href=&quot;http://kjhealy.github.com/kjh-vita/&quot;&gt;this one&lt;/a&gt;, conveniently already on Github. So I quickly forked the example résumé and modified it to fit my needs. I was very happy how it turned out and think it looks miles better than any previous Microsoft Word template résumé I’ve produced.&lt;/p&gt;
  2666. &lt;p&gt;&lt;a href=&quot;/0fc59d142e3ad24c768180efc0c9d585/kyle-mathews-resume_0.pdf&quot;&gt;Download a copy of the finished résumé&lt;/a&gt;. You can also see the source for the résumé at &lt;a href=&quot;https://github.com/KyleAMathews/kjh-vita/blob/master/kyle-resume.tex&quot;&gt;https://github.com/KyleAMathews/kjh-vita/blob/master/kyle-resume.tex&lt;/a&gt;. Feel free to fork my version and modify to meet your needs. Most distributions of Latex should have all the dependencies you need. The three fonts I’ve used, Minion Pro, Myriad Pro, and Inconsolata are all freely available. The first two are distributed with Adobe Reader. The latter can be &lt;a href=&quot;http://www.levien.com/type/myfonts/inconsolata.html&quot;&gt;downloaded here.&lt;/a&gt;&lt;/p&gt;
  2667. &lt;h3 id=&quot;update--just-use-httpsharelatexcom&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#update--just-use-httpsharelatexcom&quot; aria-label=&quot;update  just use httpsharelatexcom permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Update — just use &lt;a href=&quot;http://sharelatex.com&quot;&gt;http://sharelatex.com&lt;/a&gt;&lt;/h3&gt;
  2668. &lt;p&gt;Since I wrote this post several years ago a new online Latex service &lt;a href=&quot;http://sharelatex.com&quot;&gt;Sharelatex&lt;/a&gt; has been created. They have a fantastic selection of &lt;a href=&quot;https://www.sharelatex.com/templates/cv-or-resume&quot;&gt;Resume/CV Latex templates&lt;/a&gt; and couldn’t be easier to use. Just &lt;a href=&quot;https://www.sharelatex.com/templates/cv-or-resume&quot;&gt;pick one of the templates&lt;/a&gt; and start adding your information through their online editor.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Becoming unhinged from reality—and fixing that]]></title><description><![CDATA[This is from a most excellent biography of a most interesting person, John Boyd. The danger is that if our mental processes become focused…]]></description><link>https://bricolage.io/becoming-unhinged-reality-and-fixing/</link><guid isPermaLink="false">https://bricolage.io/becoming-unhinged-reality-and-fixing/</guid><pubDate>Tue, 10 May 2011 20:01:57 GMT</pubDate><content:encoded>&lt;p&gt;This is from &lt;a href=&quot;http://www.amazon.com/Boyd-Fighter-Pilot-Who-Changed/dp/0316796883/ref=sr_1_3?s=books&amp;#x26;ie=UTF8&amp;#x26;qid=1305057501&amp;#x26;sr=1-3&quot;&gt;a most excellent biography of a most interesting person, John Boyd&lt;/a&gt;.&lt;/p&gt;
  2669. &lt;blockquote&gt;
  2670. &lt;p&gt;The danger is that if our mental processes become focused on our internal dogmas and isolated from the unfolding, constantly dynamic outside world, we experience mismatches between our mental images and reality. Then confusion and disorder and uncertainty not only result but continue to increase. Ultimately, as disorder increases, chaos can result. Boyd showed why this is a natural process and why the only alternative is to do a destructive deduction and rebuild one’s mental image to correspond to the new reality.&lt;/p&gt;
  2671. &lt;/blockquote&gt;
  2672. &lt;p&gt;Also related is the idea of “creative destruction”. You can find a good &lt;a href=&quot;http://www.ribbonfarm.com/2008/02/06/creative-destruction-portrait-of-an-idea/&quot;&gt;discussion/history of the idea over at Ribbonfarm.com&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The True Executive]]></title><description><![CDATA[From the most excellent book, ”The Organization Man“: Of all organization men, the true executive is the one who remains most suspicious of…]]></description><link>https://bricolage.io/true-executive/</link><guid isPermaLink="false">https://bricolage.io/true-executive/</guid><pubDate>Sat, 07 May 2011 03:43:15 GMT</pubDate><content:encoded>&lt;p&gt;From the most excellent book, ”&lt;a href=&quot;http://www.amazon.com/Organization-Man-William-H-Whyte/dp/0812218191&quot;&gt;The Organization Man&lt;/a&gt;“:&lt;/p&gt;
  2673. &lt;blockquote&gt;
  2674. &lt;p&gt;Of all organization men, the true executive is the one who remains most suspicious of The Organization. If there is one thing that characterizes him, it is a fierce desire to control his own destiny and, deep down, he resents yielding that control to The Organization, no matter how velvety its grip… he wants to dominate, not be dominated…Many people from the great reaches of middle management can become true believers in The Organization…But the most able are not vouchsafed this solace.&lt;/p&gt;
  2675. &lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[New Drupal-Mixpanel integration module released to track event-based analytics]]></title><description><![CDATA[As part of my work with my (now defunct) startup Eduglu, I wrote a Drupal module that integrates with the popular analytics service Mixpanel…]]></description><link>https://bricolage.io/new-drupal-mixpanel-integration-module-released-track-event-based-analytics/</link><guid isPermaLink="false">https://bricolage.io/new-drupal-mixpanel-integration-module-released-track-event-based-analytics/</guid><pubDate>Sat, 23 Apr 2011 00:23:01 GMT</pubDate><content:encoded>&lt;p&gt;As part of my work with my (&lt;a href=&quot;/eduglu-enters-deadpool&quot;&gt;now defunct&lt;/a&gt;) startup Eduglu, I wrote a Drupal module that integrates with the popular analytics service Mixpanel.&lt;/p&gt;
  2676. &lt;p&gt;Web analytics help you understand what visitors do on your website and what is working and what is not. Mixpanel makes it easy to record what is happening on your site and provides powerful tools to make sense of all the data you collect. Mixpanel, combined with custom event tracking, helps answer questions like, which students are most active on the site? What material pages are most visited? And how engaged are students? In non-learning settings, Mixpanel can be used to answer questions like does anyone use this feature? Which features are most popular to new users? Which features are most popular with power users? And many more. Using Mixpanel gives you a wealth of new information about what’s happening on your site.&lt;/p&gt;
  2677. &lt;p&gt;Screenshot of their data analysis tool:&lt;/p&gt;
  2678. &lt;p&gt;&lt;span
  2679.      class=&quot;gatsby-resp-image-wrapper&quot;
  2680.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2681.    &gt;
  2682.      &lt;a
  2683.    class=&quot;gatsby-resp-image-link&quot;
  2684.    href=&quot;/static/c7c4af91bd7fb0660dce850ac3b58a0a/bf433/mixpanel-screenshot.png&quot;
  2685.    style=&quot;display: block&quot;
  2686.    target=&quot;_blank&quot;
  2687.    rel=&quot;noopener&quot;
  2688.  &gt;
  2689.    &lt;span
  2690.    class=&quot;gatsby-resp-image-background-image&quot;
  2691.    style=&quot;padding-bottom: 54.72972972972974%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABc0lEQVR42o2SbU+DMBDH+f5fzWRzuq0FCjpFZKPlobC2R8vwSqPGFxp/IW2Pe2h6/4vOtSjKc9d1bds2TYOH8R/4UCGiy6V+eyvfq6os3/Hv9AvWTlrruuZcCFyG4XpVOgIIPs/tT2bEeTBynr0ZofHD/QuTdWJQvTLz7bZ8xn8n+7pr3FcpN7tQD1djLZfXZlB6slIDOLcsIRn3xQNuHsDiYV7NEdx1Cp5FWWdgVsrxQbfS9MriJREYzfJsT5OLEBcukjRLs/z0ckry08NuS7Z3acoq3iQsZ8fNuXg+xPlTQsvXkzYQGa0T8kh3O0oJYzF52NDDJiP3GTsSeqBkl+w3JKZxfEzxY/uMHfLk/vWZ2AmiyblGSpRX9hIfOspeiEYOo8MXW6jruuuls74v6xy0KFFokG9YL8eqOvddh0oGGZCwYw4Yr2QQCCaUFXCW8CatlDYmMgYQ67vn4ZwXRRFGDelXMFwIoZTCAKwF62xYaz8AvARys4LB7JsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  2692.  &gt;&lt;/span&gt;
  2693.  &lt;img
  2694.        class=&quot;gatsby-resp-image-image&quot;
  2695.        alt=&quot;mixpanel screenshot&quot;
  2696.        title=&quot;&quot;
  2697.        src=&quot;/static/c7c4af91bd7fb0660dce850ac3b58a0a/fcda8/mixpanel-screenshot.png&quot;
  2698.        srcset=&quot;/static/c7c4af91bd7fb0660dce850ac3b58a0a/12f09/mixpanel-screenshot.png 148w,
  2699. /static/c7c4af91bd7fb0660dce850ac3b58a0a/e4a3f/mixpanel-screenshot.png 295w,
  2700. /static/c7c4af91bd7fb0660dce850ac3b58a0a/fcda8/mixpanel-screenshot.png 590w,
  2701. /static/c7c4af91bd7fb0660dce850ac3b58a0a/efc66/mixpanel-screenshot.png 885w,
  2702. /static/c7c4af91bd7fb0660dce850ac3b58a0a/bf433/mixpanel-screenshot.png 971w&quot;
  2703.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2704.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2705.        loading=&quot;lazy&quot;
  2706.        decoding=&quot;async&quot;
  2707.      /&gt;
  2708.  &lt;/a&gt;
  2709.    &lt;/span&gt;&lt;/p&gt;
  2710. &lt;p&gt;The Mixpanel module works well and has been used in production environments now for several months but there’s still a lot I’d like to add. Right now, the module records events from many of the core subsystems and popular contrib modules. Events such as when a user account is created, a node created, a comment created, someone joins a group, etc. It defines a simple API for other modules to set default information about a user, such as their role, if they’re a paying customer or not, their campaign source, etc. This information can be used for segmenting data during analysis.&lt;/p&gt;
  2711. &lt;p&gt;In the future I’d like to add Views 3 integration with their API so you’d be able to easily pull data from their API to create custom analytics dashboards on your site, &lt;a href=&quot;http://mixpanel.com/platform/&quot;&gt;Mixpanel Platform&lt;/a&gt; integration, integrate with their &lt;a href=&quot;http://blog.mixpanel.com/introduction-to-analytics-funnel-analysis&quot;&gt;Funnel analysis tool&lt;/a&gt;, automatic integration with the coming &lt;a href=&quot;http://groups.drupal.org/node/99289&quot;&gt;Onboarding module&lt;/a&gt;, and provide out-of-the-box integration with more core and contrib modules.&lt;/p&gt;
  2712. &lt;p&gt;So please come over and help. Mixpanel is the easiest-to-use event-based analytics solution out there and quite affordable to boot. Add to that the Mixpanel platform and coming integration with Views and you have a powerful analytics package to offer to your clients or to build custom analytics for users of your Drupal-based web application.&lt;/p&gt;
  2713. &lt;p&gt;Download or clone at &lt;a href=&quot;http://drupal.org/project/mixpanel&quot;&gt;http://drupal.org/project/mixpanel&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Eduglu enters the deadpool]]></title><description><![CDATA[I just posted this on the Eduglu community site. Reposted here without further comment: It is with mixed emotions that I announce that I’m…]]></description><link>https://bricolage.io/eduglu-enters-deadpool/</link><guid isPermaLink="false">https://bricolage.io/eduglu-enters-deadpool/</guid><pubDate>Fri, 22 Apr 2011 23:03:50 GMT</pubDate><content:encoded>&lt;p&gt;I just posted this on the &lt;a href=&quot;http://community.eduglu.org/development/node/185&quot;&gt;Eduglu community site&lt;/a&gt;. Reposted here without further comment:&lt;/p&gt;
  2714. &lt;blockquote&gt;
  2715. &lt;p&gt;It is with mixed emotions that I announce that I’m quitting work on Eduglu effective immediately. I’ve greatly enjoyed the time I’ve spent working on Eduglu and the friendships I’ve formed in person and online. I had high hopes, shared with many, in the promise of open source social learning tools but I was never able to find a business model that would make my and your work sustainable.&lt;/p&gt;
  2716. &lt;p&gt;A few other notes. This community site and eduglu.com I’ll keep up and maintain for the forseeable future. All of Eduglu’s source code is, of course, open source and hosted on Github and Drupal.org so if you’d like to continue using/maintaining it, feel free.&lt;/p&gt;
  2717. &lt;p&gt;Now that I’m not working on Eduglu I’m looking for work. If you have paid part-time gigs available, send me an email. I’m interested in Drupal work of course but I’d be open to about anything you think I’m qualified for.&lt;/p&gt;
  2718. &lt;p&gt;Hopefully this isn’t a good bye and that our paths pass again in the future.&lt;/p&gt;
  2719. &lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[A loose assortment of thoughts]]></title><description><![CDATA[I was recently introduced to a new phrase which I rather like, “existential musing”. It nicely describes what I’ve been doing a lot of…]]></description><link>https://bricolage.io/loose-assortment-thoughts/</link><guid isPermaLink="false">https://bricolage.io/loose-assortment-thoughts/</guid><pubDate>Fri, 22 Apr 2011 22:39:10 GMT</pubDate><content:encoded>&lt;p&gt;I was recently introduced to a new phrase which I rather like, “existential musing”. It nicely describes what I’ve been doing a lot of lately.&lt;/p&gt;
  2720. &lt;p&gt;The phrase comes from the newly released book by one of my favorite bloggers &lt;a href=&quot;http://ribbonfarm.com&quot;&gt;Venkatesh Rao&lt;/a&gt; — &lt;a href=&quot;http://www.tempobook.com/&quot;&gt;Tempo: timing, tactics and strategy in narrative-driven decision-making&lt;/a&gt; — which I’ve been cheerfully digesting over the past few weeks. The book is amazingly dense. It synthesizes a shelf full or two of books but I’m finding its ideas a fertile source for new ways to think about decision making and the world in general.&lt;/p&gt;
  2721. &lt;p&gt;The opening page of the book re-introduced me to a quote from Fredrick Neitzsche:&lt;/p&gt;
  2722. &lt;blockquote&gt;
  2723. &lt;p&gt;Lonely one, you are going the way to yourself. And your way leads past yourself and your seven devils. You will be a heretic to yourself and a witch and soothsayer and fool and doubter and unholy one and a villain. You must wish to consume yourself in your own flame: how could you wish to become new unless you had first become ashes!&lt;/p&gt;
  2724. &lt;p&gt;Lonely one, you are going the way of the creator: you would create a god for yourself out of your seven devils.&lt;/p&gt;
  2725. &lt;/blockquote&gt;
  2726. &lt;p&gt;One last thought, also drawn from Tempo, on the tension between contemplation and action. Quoting now, “a tension that causes us to swing between a greedy, grasping engagement of life, and a tentative, doubting withdrawal from it. A mode of life that doubts the possibility of meaning sufficiently to choose action, and believes in the possibility sufficiently to be tempted into reflection.”&lt;/p&gt;
  2727. &lt;p&gt;As I’ve grown older, and hopefully a bit more mature, it seems more and more of my thinking has started to center around the many paradoxical pairs of ideas such as this one and others such as reason vs. emotion, freedom vs. order, individual integrity vs. com­munity responsibility, men vs. women, justice vs. mercy, liberty vs. equity, etc.&lt;/p&gt;
  2728. &lt;p&gt;It seems one or more of these paradoxical pairs of ideas is at the heart of every significant problem I face.&lt;/p&gt;
  2729. &lt;p&gt;The contemplation/action pair is especially meaningful right now as I’m in the midst of a doubting withdrawal from life as I close up shop on my first startup and reflect on what to do next.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Richard Hamming on Luck]]></title><description><![CDATA[From Richard Hamming’s classic and must-read talk, ”You and Your Research“. There is indeed an element of luck, and no, there isn’t. The…]]></description><link>https://bricolage.io/richard-hamming-luck/</link><guid isPermaLink="false">https://bricolage.io/richard-hamming-luck/</guid><pubDate>Sat, 09 Apr 2011 18:26:54 GMT</pubDate><content:encoded>&lt;p&gt;From Richard Hamming’s classic and must-read talk, ”&lt;a href=&quot;http://www.cs.virginia.edu/~robins/YouAndYourResearch.html&quot;&gt;You and Your Research&lt;/a&gt;“.&lt;/p&gt;
  2730. &lt;blockquote&gt;
  2731. &lt;p&gt;There is indeed an element of luck, and no, there isn’t. The prepared mind sooner or later finds something important and does it. So yes, it is luck. &lt;em&gt;The particular thing you do is luck, but that you do something is not.&lt;/em&gt;&lt;/p&gt;
  2732. &lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Stockdale paradox]]></title><description><![CDATA[You must never confuse faith that you will prevail in the end—which you can never afford to lose—with the discipline to confront the most…]]></description><link>https://bricolage.io/stockdale-paradox/</link><guid isPermaLink="false">https://bricolage.io/stockdale-paradox/</guid><pubDate>Wed, 02 Mar 2011 17:31:52 GMT</pubDate><content:encoded>&lt;blockquote&gt;
  2733. &lt;p&gt;You must never confuse faith that you will prevail in the end—which you can never afford to lose—with the discipline to confront the most brutal facts of your current reality, whatever they might be.&lt;/p&gt;
  2734. &lt;/blockquote&gt;
  2735. &lt;p&gt;—Admiral James Stockdale&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Creating a CCK Field module with an "invisible" widget]]></title><description><![CDATA[Most CCK Field modules have a widget where the user adds information upon creating a node which is then saved with the node. For the recent…]]></description><link>https://bricolage.io/creating-cck-field-module-invisible-widget/</link><guid isPermaLink="false">https://bricolage.io/creating-cck-field-module-invisible-widget/</guid><pubDate>Fri, 19 Nov 2010 00:14:48 GMT</pubDate><content:encoded>&lt;p&gt;Most CCK Field modules have a widget where the user adds information upon creating a node which is then saved with the node. For the recent &lt;a href=&quot;http://drupal.org/project/etherpad&quot;&gt;Etherpad module&lt;/a&gt; I wrote, I needed an “invisible” widget which saved with each new node some information from the field definition as well as autogenerated information. As I didn’t any documentation on how to do this, I thought I’d document it here quickly.&lt;/p&gt;
  2736. &lt;p&gt;The first thing you do is define your database columns for your field in hook_field_settings.&lt;/p&gt;
  2737. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
  2738. &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;etherpad_field_settings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$op&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2739.  &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$op&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2740.    &lt;span class=&quot;token comment&quot;&gt;// Code removed.&lt;/span&gt;
  2741.    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;database columns&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  2742.      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  2743.        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_url&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;varchar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;length&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;not null&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2744.        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_text&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;text&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;not null&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;TRUE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;size&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;big&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2745.        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;attributes&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;text&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;size&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;medium&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;not null&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2746.      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2747.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  2748. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  2749. &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2750. &lt;p&gt;Next, you define your widget form inside hook_widget. Some tutorials I saw suggest you define your widget form in hook_elements/hook_process. I did that at first but decided against it as a) I never got it to work and b) it just adds needless complexity. Generally you’ll just want to define your widget in hook_widgets.&lt;/p&gt;
  2751. &lt;p&gt;Two really important things here to get your “invisible” widget to work correctly. First, you &lt;strong&gt;must&lt;/strong&gt; name your form keys the same as you named your database column names in hook_field_settings. This tripped me up for a long time. CCK saves data by magic (you never explicitly save anything from a widget) and this is the key to getting the incantation to take. Second, using the ”&lt;a href=&quot;http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#val&quot;&gt;value” field type&lt;/a&gt; was the key to creating an “invisible” field and getting my data saved correctly.&lt;/p&gt;
  2752. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
  2753. &lt;span class=&quot;token comment&quot;&gt;/**
  2754. * Implementation of hook_widget().
  2755. */&lt;/span&gt;
  2756. &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;etherpad_widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form_state&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2757.  &lt;span class=&quot;token variable&quot;&gt;$element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_url&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  2758.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2759.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_url&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;nid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_url&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_url&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;etherpad_generate_padid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_url&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2760.  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2761.  &lt;span class=&quot;token variable&quot;&gt;$element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_text&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  2762.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2763.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_text&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;nid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;etherpad_text&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;default value for now until we have a function to generate one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2764.  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2765.  &lt;span class=&quot;token variable&quot;&gt;$element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;attributes&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  2766.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2767.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;attributes&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;nid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$delta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;attributes&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;serialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;attributes&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2768.  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2769.  &lt;span class=&quot;token comment&quot;&gt;// Used so that hook_field(&apos;validate&apos;) knows where to&lt;/span&gt;
  2770.  &lt;span class=&quot;token comment&quot;&gt;// flag an error in deeply nested forms.&lt;/span&gt;
  2771.  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#parents&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  2772.    &lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#parents&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2773.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  2774.  &lt;span class=&quot;token variable&quot;&gt;$element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;_error_element&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  2775.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2776.    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#value&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;implode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;][&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;#parents&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;value&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  2777.  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2778.  
  2779.  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  2780. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  2781. &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2782. &lt;p&gt;And that’s it! Read this and you’ll save yourself hours of frustration :)&lt;/p&gt;
  2783. &lt;p&gt;One other note, the Devel module’s “reinstall module” function is very useful as you’ll be reinstalling the module often to reset the database w/ your changes. Enable the Devel block to access it.&lt;/p&gt;
  2784. &lt;p&gt;This documentation doesn’t cover most of what you’ll need to know to write a CCK module. I relied heavily on the following tutorials.&lt;/p&gt;
  2785. &lt;ul&gt;
  2786. &lt;li&gt;&lt;a href=&quot;http://maxeydevbox.org/blogs/geoffmaxey/building-custom-compound-fieldswidgets-cck-drupal-6x&quot;&gt;http://maxeydevbox.org/blogs/geoffmaxey/building-custom-compound-fieldswidgets-cck-drupal-6x&lt;/a&gt;&lt;/li&gt;
  2787. &lt;li&gt;&lt;a href=&quot;http://www.lullabot.com/articles/creating-custom-cck-fields&quot;&gt;http://www.lullabot.com/articles/creating-custom-cck-fields&lt;/a&gt;&lt;/li&gt;
  2788. &lt;li&gt;&lt;a href=&quot;http://www.poplarware.com/articles/cck_field_module&quot;&gt;http://www.poplarware.com/articles/cck_field_module&lt;/a&gt;&lt;/li&gt;
  2789. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Eduglu, Roadmaps, platforms, and killer apps]]></title><description><![CDATA[Killer platforms need killer apps. A great platform by itself isn’t that interesting or useful. It takes killer apps to attract customers…]]></description><link>https://bricolage.io/roadmaps-platforms-and-killer-apps/</link><guid isPermaLink="false">https://bricolage.io/roadmaps-platforms-and-killer-apps/</guid><pubDate>Thu, 04 Nov 2010 23:10:52 GMT</pubDate><content:encoded>&lt;p&gt;Killer platforms need killer apps. A great platform by itself isn’t that interesting or useful. It takes killer apps to attract customers and define the platform.&lt;/p&gt;
  2790. &lt;p&gt;Since the computer industry hit its stride we’ve seen a number of examples of killer platforms and killer app duos. 1000s of financial workers bought the Apple II platform on the the strength of VisiCalc and Lotus 1-2-3. Once Facebook opened up their platform, 1000s of applications and services were written, most worthless, but social gaming company Zyanga has made 100s of millions of dollars from games like Farmville and Mafia Wars. Apple’s App Store has introduced millions to the “app lifestyle” through its various iOS devices.&lt;/p&gt;
  2791. &lt;p&gt;In the world of the Drupal platform, many people think Drupal distros are becoming the “killer apps” of Drupal. They (and I) believe that these distros / applications will help Drupal attract new customers in new markets. Popular distros, such as &lt;a href=&quot;http://openatrium.com&quot;&gt;Open Atrium&lt;/a&gt; and &lt;a href=&quot;http://openpublishapp.com/&quot;&gt;OpenPublish&lt;/a&gt;, are starting to show that this model can work as they and other distros are receiving attention far outside the normal channels and communities which discuss Drupal.&lt;/p&gt;
  2792. &lt;p&gt;For the past year or so, I’ve been working on building a Drupal distro called &lt;a href=&quot;http://eduglu.com&quot;&gt;Eduglu&lt;/a&gt;, which is a social learning product designed to support groups of learners. Similar to Drupal, my company’s product Eduglu is a platform. As part of developing the platform I’ve built a number of apps for it such as a forum/mailinglist, polls, etc.&lt;/p&gt;
  2793. &lt;p&gt;But while these are nice apps and I’m really pleased about how the platform is coming together, I feel that Eduglu is still missing its set of killer apps.&lt;/p&gt;
  2794. &lt;p&gt;Many people look at Eduglu now and think “meh”, “what does it do”, they ask, “that existing education / community platforms don’t already do?”&lt;/p&gt;
  2795. &lt;p&gt;And… I can’t really answer that question. Not yet anyways. Eduglu is still missing its killer app that for 1000s of organizations will become &lt;em&gt;the&lt;/em&gt; reason that they &lt;em&gt;must&lt;/em&gt; adapt Eduglu as their learning platform. Something like email that for millions of companies and households was the “reason” they signed up for Internet.&lt;/p&gt;
  2796. &lt;p&gt;So recently, I’ve made a prediction to myself, that Eduglu will become a success only if a large number of apps are built on top of the platform.&lt;/p&gt;
  2797. &lt;p&gt;But luckily, I don’t have to rely entirely on people building apps specifically for Eduglu. In &lt;a href=&quot;http://buytaert.net/&quot;&gt;Dries Buytaert’s&lt;/a&gt; (founder of Drupal) &lt;a href=&quot;http://buytaert.net/drupal-distributions&quot;&gt;first post on Drupal distributions&lt;/a&gt; four years ago, he said that for Drupal distributions to succeed, they must collaborate not compete. That Drupal distros can’t fork Drupal core or otherwise introduce incompatibilities between themselves.&lt;/p&gt;
  2798. &lt;p&gt;And happily, that is what has happened. Through the efforts of many in the Drupal community, particularly &lt;a href=&quot;http://developmentseed.org/&quot;&gt;Development Seed&lt;/a&gt;, it is possible to take an application written for one Drupal distro and reuse it across multiple other distros. And one very interesting effort, &lt;a href=&quot;http://drupal.org/project/debut&quot;&gt;Debut&lt;/a&gt;, is working to build a common set of applications specifically designed to serve as base applications for a variety of Drupal distrubutions.&lt;/p&gt;
  2799. &lt;p&gt;So this has left me, Eduglu, and other Drupal distros in a nice spot. Many people are working together to build reusable apps and Drupal, particularly with the upcoming Drupal 7 release, has developed into a very nice framework for building web applications.&lt;/p&gt;
  2800. &lt;p&gt;So I have two items now on my roadmap for Eduglu.&lt;/p&gt;
  2801. &lt;ol&gt;
  2802. &lt;li&gt;Refine and evangelize the platform and&lt;/li&gt;
  2803. &lt;li&gt;Develop killer apps.&lt;/li&gt;
  2804. &lt;/ol&gt;
  2805. &lt;p&gt;And while predicting in advance what is or isn’t a “killer app” is difficult, I have a few ideas up my sleeve. First on the list is a realtime notetaking app built with Drupal and &lt;a href=&quot;http://etherpad.org&quot;&gt;Etherpad&lt;/a&gt;. Students will be able to take notes together, attach audio recordings of the lecture and other media files, and save all of this to the class website where it’ll it can be referred to in the future.&lt;/p&gt;
  2806. &lt;p&gt;And if you already know what you’re killer app for learning is and just need someone to build it then by all means, &lt;a href=&quot;http://eduglu.com/contact&quot;&gt;please contact us!&lt;/a&gt; We’d be happy to help :)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Eduglu Alpha 6 released]]></title><description><![CDATA[Time for another Eduglu release! Download Alpha 6 at eduglu.com There’s been lots of progress made since Alpha 5. Along with the usual…]]></description><link>https://bricolage.io/eduglu-alpha-6-released/</link><guid isPermaLink="false">https://bricolage.io/eduglu-alpha-6-released/</guid><pubDate>Fri, 24 Sep 2010 18:56:43 GMT</pubDate><content:encoded>&lt;p&gt;Time for another Eduglu release! &lt;a href=&quot;http://eduglu.com/content/eduglu-alpha-6&quot;&gt;Download Alpha 6 at eduglu.com&lt;/a&gt;&lt;/p&gt;
  2807. &lt;p&gt;There’s been lots of progress made since Alpha 5. Along with the usual assortment of bug fixes and tweaks, major new features include:&lt;/p&gt;
  2808. &lt;ul&gt;
  2809. &lt;li&gt;A new Quiz feature based on the &lt;a href=&quot;http://drupal.org/project/quiz&quot;&gt;Drupal quiz module&lt;/a&gt;. The Drupal quiz module has an extensive feature list and is widely used in the Drupal community. This is just the start of Eduglu’s quiz integration but it’s already provided a powerful boost to Eduglu’s capabilities.&lt;/li&gt;
  2810. &lt;/ul&gt;
  2811. &lt;p&gt;The quiz feature isn’t enabled by default so to make it available to groups on your Eduglu install, enable this feature at admin/build/features.&lt;/p&gt;
  2812. &lt;ul&gt;
  2813. &lt;li&gt;A searchable group membership directory. Group members can now easily browse/search the faces/names of their fellow group members&lt;/li&gt;
  2814. &lt;/ul&gt;
  2815. &lt;p&gt;&lt;span
  2816.      class=&quot;gatsby-resp-image-wrapper&quot;
  2817.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2818.    &gt;
  2819.      &lt;a
  2820.    class=&quot;gatsby-resp-image-link&quot;
  2821.    href=&quot;/static/ada1f2af76eaacdf955699b74911b65a/8802b/membership_directory.png&quot;
  2822.    style=&quot;display: block&quot;
  2823.    target=&quot;_blank&quot;
  2824.    rel=&quot;noopener&quot;
  2825.  &gt;
  2826.    &lt;span
  2827.    class=&quot;gatsby-resp-image-background-image&quot;
  2828.    style=&quot;padding-bottom: 64.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAChUlEQVR42nVUSW/TQBTO72S5cANOvYA4VEgILnAqEptE2VqgEuJA4QBFSK2gFU2qJoGqcZImsceO9zWOnTjbx5txG7WVGOmTx/PefO97i13QFA1Lr9Zx4cYSFh++x7W7L7FwfwVvPm3hydoGbi+9xeVbjwUu3nyE6/eeY+HBa1xZfCZw9c4yLpHt6buvYLKKgtLR8G1jE8svVrGy+gE7v8uoVCQUS39R3DtAvd4+A6l2hBpBkmgvtcRZp81w1JQFCp0Ww8+dfaxv/ML3zV18/PIDO8UKtotVbG7vQddNdLvGKZgCmqbDNCxIjQ7WPm+hXD1Eu6Wg0KQD1/WhyG1oKoNh6GBMgd7VkA2HEGs2xZk1m+WgNR5PEMUpFEVFg9QKQstyYJomEXtIBwPE/Ri2bSMbjeYc0+kMk8lUPE84x6feu6Q4J6x34LgB/KgP3w8F4ZiIoqiHqBdjRPshKXXJ5hGCIJqf+bRP0wGRTqAyLSdsUQ07zSYOqlUYloswjISzF4RQqWZJkpLiPhjVTSU4lMWAZxHHUFQdAfln2ZBSZjkh7wwvvEIRTNslVb3j6CFMKgW/3E8SaNQAHsD1fGHvUxDdtI+zyM7V0PagE5lBDmEUiWbwyAYRpmmKhGA4Pvm5pKx/TJj8n5Ar4SlpBE40JFWeH6CrW6KmYRDgT7kiMuCEJynzEggBp1POu+zBsH0xPkmaCAUhNcWm9yzL4LkuSrsloZifc3tCZbAcD734vMImowFVafbqUHWbuhjmXaVaMc0Qavg4lfar0EixL+wDQSTPm0KEMkOdvpxChRyPGhJNeSNPOYjEBYfUMbrAG8JhULoqBbAcd07Ypv8AD8AJZVlB7bCJf+4etBDEddR9AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  2829.  &gt;&lt;/span&gt;
  2830.  &lt;img
  2831.        class=&quot;gatsby-resp-image-image&quot;
  2832.        alt=&quot;Screenshot of Eduglu membership directory&quot;
  2833.        title=&quot;&quot;
  2834.        src=&quot;/static/ada1f2af76eaacdf955699b74911b65a/fcda8/membership_directory.png&quot;
  2835.        srcset=&quot;/static/ada1f2af76eaacdf955699b74911b65a/12f09/membership_directory.png 148w,
  2836. /static/ada1f2af76eaacdf955699b74911b65a/e4a3f/membership_directory.png 295w,
  2837. /static/ada1f2af76eaacdf955699b74911b65a/fcda8/membership_directory.png 590w,
  2838. /static/ada1f2af76eaacdf955699b74911b65a/efc66/membership_directory.png 885w,
  2839. /static/ada1f2af76eaacdf955699b74911b65a/8802b/membership_directory.png 1135w&quot;
  2840.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2841.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2842.        loading=&quot;lazy&quot;
  2843.        decoding=&quot;async&quot;
  2844.      /&gt;
  2845.  &lt;/a&gt;
  2846.    &lt;/span&gt;&lt;/p&gt;
  2847. &lt;ul&gt;
  2848. &lt;li&gt;Group admin tools for managing members. It’s now easy to add and remove members from your groups as well as to promote and demote members to be group admin status.&lt;/li&gt;
  2849. &lt;/ul&gt;
  2850. &lt;p&gt;&lt;span
  2851.      class=&quot;gatsby-resp-image-wrapper&quot;
  2852.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  2853.    &gt;
  2854.      &lt;a
  2855.    class=&quot;gatsby-resp-image-link&quot;
  2856.    href=&quot;/static/dbf934bc36a9b1d4dfd8cc95f241cd8b/0d1a4/group-members-admin-tool.png&quot;
  2857.    style=&quot;display: block&quot;
  2858.    target=&quot;_blank&quot;
  2859.    rel=&quot;noopener&quot;
  2860.  &gt;
  2861.    &lt;span
  2862.    class=&quot;gatsby-resp-image-background-image&quot;
  2863.    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAACsklEQVR42pWTyWsUQRTG5x80qHgQ9OxN4wKSHD0JItkQQYIQI2gEMcSo0XiIejAhixknmaX3fXqbnl5nMlvy+bo7E4keog0/Xvf3qr5+9aqqsLS6jkt3pnDt3izGpxcwcmMC4zOvMPtmDQ/nlnHr/lNcvD1N+iTOj07i3PUJXB2bweiDOVy4OYXLdx/hythjjFDuycInFLa3dvFs/iXmny9g+d1nlPZYlCs8isUqSiUGHCeDY1MksMcwNQEcI1IufRch8DJkSQPPK2S4s4/FD1/w9uM3LL5fw4vXK9jYLGJp5StW19ahqQYEUYEkq5BlDSp9D1EUHYZhYvNHBUur37G3z6CQCpZtQZJkBEGAXq+LTqdDsYdWq50RxUkW2+12lh/SJQaDHhzPh6BZYBgehbph018MWgoL07QQxzHCMESSJPjX5+joKIuKoqUVWnBdF4EfoNlswvM8eBTTavv9PlXSx+HhYTZpGP8k1dNHprYU6nU7M/J9/9SAlHTZqel/VZga2pYFTdfR7faoL79Jq8veu72/cica0el20R8MaB9ol03TgefaUEUemiyi6VrwG6Q5FnRVQhR4OGhFaLeor7F/QjsJSYuyGEd+lhcFMe2hDavZAa9HkM0WVPsgQ3M6kMwEjNIEpwVgVR+qQ7rbyci1IJunka57PTB0Zgu6TkeGjLZrLnaImtrKYPQ29gSfNAclIcBP3kdVSY7zCbbKdWyUdBTZRj5eO0C5Jue77PkhJNVElW6EIBtwvQBOI6fRjIgwY6ilKGodgqRCrzv5OC+kmyMeHxsvRk2oY3dfRIXXYbpRjhPmuMMYnVBhZJTKHESVWtaIYZEHS1cxN6QqeNlClcwUo5EbnIGomGCFdLybfZ8yTJfFSQaqnArD8mC5wZkIso4aGaiGA7sRwqYls5yIX4/lR4WWyhMIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  2864.  &gt;&lt;/span&gt;
  2865.  &lt;img
  2866.        class=&quot;gatsby-resp-image-image&quot;
  2867.        alt=&quot;Screenshot of Eduglu group memberes admin tool&quot;
  2868.        title=&quot;&quot;
  2869.        src=&quot;/static/dbf934bc36a9b1d4dfd8cc95f241cd8b/fcda8/group-members-admin-tool.png&quot;
  2870.        srcset=&quot;/static/dbf934bc36a9b1d4dfd8cc95f241cd8b/12f09/group-members-admin-tool.png 148w,
  2871. /static/dbf934bc36a9b1d4dfd8cc95f241cd8b/e4a3f/group-members-admin-tool.png 295w,
  2872. /static/dbf934bc36a9b1d4dfd8cc95f241cd8b/fcda8/group-members-admin-tool.png 590w,
  2873. /static/dbf934bc36a9b1d4dfd8cc95f241cd8b/efc66/group-members-admin-tool.png 885w,
  2874. /static/dbf934bc36a9b1d4dfd8cc95f241cd8b/0d1a4/group-members-admin-tool.png 1036w&quot;
  2875.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  2876.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2877.        loading=&quot;lazy&quot;
  2878.        decoding=&quot;async&quot;
  2879.      /&gt;
  2880.  &lt;/a&gt;
  2881.    &lt;/span&gt;&lt;/p&gt;
  2882. &lt;p&gt;If you have feedback or find bugs, join us in the Drupal.org issue queue at drupal.org/project/eduglu and at the community.eduglu.org site.&lt;/p&gt;
  2883. &lt;p&gt;If you’re upgrading from an earlier version of Eduglu:&lt;/p&gt;
  2884. &lt;ul&gt;
  2885. &lt;li&gt;Run updates at update.php&lt;/li&gt;
  2886. &lt;li&gt;Revert all features at admin/build/features&lt;/li&gt;
  2887. &lt;li&gt;Clear all caches at admin/settings/performance&lt;/li&gt;
  2888. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Veracity is the heart of morality]]></title><description><![CDATA[In an ideal University, as I conceive it, a man should be able to obtain instruction in all forms of knowledge, and discipline in the use of…]]></description><link>https://bricolage.io/veracity-heart-morality/</link><guid isPermaLink="false">https://bricolage.io/veracity-heart-morality/</guid><pubDate>Thu, 23 Sep 2010 04:43:53 GMT</pubDate><content:encoded>&lt;blockquote&gt;
  2889. &lt;p&gt;In an ideal University, as I conceive it, a man should be able to obtain instruction in all forms of knowledge, and discipline in the use of all the methods by which knowledge is obtained. In such a University, the force of living example should fire the student with a noble ambition to emulate the learning of learned men, and to follow in the footsteps of the explorers of new fields of knowledge. And the very air he breathes should be charged with that enthusiasm for truth, that fanaticism of veracity, which is a greater possession than much learning; a nobler gift than the power of increasing knowledge; by so much greater and nobler than these, as the moral nature of man is greater than the intellectual; for veracity is the heart of morality.&lt;/p&gt;
  2890. &lt;p&gt;—Thomas Henry Huxley&lt;/p&gt;
  2891. &lt;/blockquote&gt;
  2892. &lt;p&gt;Taken from the &lt;a href=&quot;https://lists.wikimedia.org/mailman/listinfo/daily-article-l&quot;&gt;Wikipedia Daily Article mailing list&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[First beta release for Drupal-native mailinglist module]]></title><description><![CDATA[Today I rolled out the first beta for my Drupal module, OG Mailinglist, which provides native mailinglist functionality to Drupal similar to…]]></description><link>https://bricolage.io/first-beta-release-drupal-native-mailinglist-module/</link><guid isPermaLink="false">https://bricolage.io/first-beta-release-drupal-native-mailinglist-module/</guid><pubDate>Wed, 15 Sep 2010 22:49:54 GMT</pubDate><content:encoded>&lt;p&gt;Today I rolled out the first beta for my &lt;a href=&quot;http://drupal.org/project/og_mailinglist&quot;&gt;Drupal module, OG Mailinglist&lt;/a&gt;, which provides native mailinglist functionality to Drupal similar to &lt;a href=&quot;http://www.gnu.org/software/mailman/index.html&quot;&gt;Mailman&lt;/a&gt; or &lt;a href=&quot;http://groups.google.com&quot;&gt;Google Groups&lt;/a&gt;.&lt;/p&gt;
  2893. &lt;p&gt;OG Mailinglist provides complete email integration for Organic Group-based Drupal sites. Many people find it easier to participate in online conversations through email rather than having to visit a website continually. OG Mailinglist provides this email integration for your site. &lt;a href=&quot;http://eduglu.com&quot;&gt;My company&lt;/a&gt; is supporting the development of this module as part of our development of &lt;a href=&quot;http://eduglu.com&quot;&gt;Eduglu, a Drupal-based social learning platform&lt;/a&gt;.&lt;/p&gt;
  2894. &lt;p&gt;OG Mailinglist was started as a student project at BYU for the site I built there, &lt;a href=&quot;http://island.byu.edu&quot;&gt;http://island.byu.edu&lt;/a&gt;. Since its creation, OG Mailinglist has successfully supported 1000s of discussions.&lt;/p&gt;
  2895. &lt;h3 id=&quot;features&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#features&quot; aria-label=&quot;features permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Features&lt;/h3&gt;
  2896. &lt;p&gt;OG Mailinglist has a rich array of features. Current features include:&lt;/p&gt;
  2897. &lt;ul&gt;
  2898. &lt;li&gt;Full integration with Organic Groups.&lt;/li&gt;
  2899. &lt;li&gt;Each group has its own email address.&lt;/li&gt;
  2900. &lt;li&gt;You can create and reply to posts via email as well as through the web site.&lt;/li&gt;
  2901. &lt;li&gt;Full HTML Digests. They are loosely modeled after Google Group’s digest emails and are very readable.&lt;/li&gt;
  2902. &lt;li&gt;Emails include the list-id header to make filtering easy in your email client.&lt;/li&gt;
  2903. &lt;li&gt;Low latency. Emails arriving at your site are resent immediately instead of waiting for the next cron run. Other group members will typically receive your email within one minute of you sending it. This can greatly speed up group conversations on time sensitive issues.&lt;/li&gt;
  2904. &lt;/ul&gt;
  2905. &lt;h3 id=&quot;requirements&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#requirements&quot; aria-label=&quot;requirements permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Requirements&lt;/h3&gt;
  2906. &lt;p&gt;Installing and configuring this module requires root access and fairly advanced sysadmin skills. Right now, there is instructions for integrating with Exim4 and Qmail. There’s already efforts at way to support Postfix, so &lt;a href=&quot;http://drupal.org/node/771704&quot;&gt;please join in on this issue if you have Postfix expertise&lt;/a&gt;.&lt;/p&gt;
  2907. &lt;p&gt;OG Mailinglist has come a long long way since the project started 1.5 years ago but there’s still &lt;a href=&quot;http://drupal.org/project/issues/og_mailinglist&quot;&gt;plenty of bugs to share&lt;/a&gt;. So please pitch in and help make this module even more awesome.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Three worldwide education trends behind Eduglu]]></title><description><![CDATA[Later this week, I’ll be presenting on my company Eduglu and product Eduglu at Launchup, a local entrepreneurship event. In preparing for my…]]></description><link>https://bricolage.io/three-worldwide-trends-behind-eduglu/</link><guid isPermaLink="false">https://bricolage.io/three-worldwide-trends-behind-eduglu/</guid><pubDate>Tue, 31 Aug 2010 22:01:23 GMT</pubDate><content:encoded>&lt;p&gt;Later this week, I’ll be presenting on my company &lt;a href=&quot;http://eduglu.com&quot;&gt;Eduglu&lt;/a&gt; and product &lt;a href=&quot;http://eduglu.com/download-eduglu&quot;&gt;Eduglu&lt;/a&gt; at &lt;a href=&quot;http://www.launchup.org/2010/08/31/eduglu-qa/&quot;&gt;Launchup&lt;/a&gt;, a local entrepreneurship event. In preparing for my presentation, I’ve stepped back again and revisited my reasons for why I started Eduglu and why I think it’s needed.&lt;/p&gt;
  2908. &lt;p&gt;I see three trends which are starting to dramatically change how we learn and how that learning happens.&lt;/p&gt;
  2909. &lt;h3 id=&quot;the-changing-nature-of-learning&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-changing-nature-of-learning&quot; aria-label=&quot;the changing nature of learning permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The changing nature of learning&lt;/h3&gt;
  2910. &lt;p&gt;Today’s educational system was designed when the expectation was that for most people, what they learned in school was sufficient to make them good employees for the remainder of their working career. If you started as an accountant in 1860 and retired 40 years later, at the end of your career you could expect that most of the knowledge you learned in school was still useful.&lt;/p&gt;
  2911. &lt;p&gt;Today, that is very much not the case. Knowledge is growing exponentially and the ”&lt;a href=&quot;http://en.wikipedia.org/wiki/Half-life_of_knowledge&quot;&gt;half-life&lt;/a&gt; &lt;a href=&quot;http://www.elearnspace.org/Articles/connectivism.htm&quot;&gt;of knowledge&lt;/a&gt;” has shrunken dramatically. Whereas 100 years ago, one large investment of schooling at the beginning of our lives was enough to last an entire career, now we need to getting smaller chunks of schooling throughout our lives. We’ll continually transition between investing in learning and harvesting the rewards of those learnings.&lt;/p&gt;
  2912. &lt;p&gt;[Graph from ”&lt;a href=&quot;http://blog.trailmeme.com/2010/06/the-emerging-principles-of-lifelong-learning/&quot;&gt;The Emerging Principles of Lifelong Learning&lt;/a&gt;” by &lt;a href=&quot;http://twitter.com/vgr&quot;&gt;@vgr&lt;/a&gt;]&lt;/p&gt;
  2913. &lt;p&gt;&lt;span
  2914.      class=&quot;gatsby-resp-image-wrapper&quot;
  2915.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 427px; &quot;
  2916.    &gt;
  2917.      &lt;a
  2918.    class=&quot;gatsby-resp-image-link&quot;
  2919.    href=&quot;/static/896a211cd5a327d6de7186905b00615e/a7c74/lifelongLearning.png&quot;
  2920.    style=&quot;display: block&quot;
  2921.    target=&quot;_blank&quot;
  2922.    rel=&quot;noopener&quot;
  2923.  &gt;
  2924.    &lt;span
  2925.    class=&quot;gatsby-resp-image-background-image&quot;
  2926.    style=&quot;padding-bottom: 128.3783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAIAAAA44esqAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADOElEQVR42o1TC3ObOBDm//+TXjOd63Wuc9fpJW5ylwSMX4CxjcGvFowxEiDxEpKgwk7TNiWZ29nBltiP/Xb3W6luWsNVbUbUQXSR0ILyphZeN5y3Lv6c/ReTGsaqLHUzduNXHz0yDCveEdZtUg3g9v7OwZUWMcrrsmlqhLjrcgB5CLh/4ADw4FhneVdmz1v2bq4C0g/pClVg7dbTKfl0Xd0rlaLS3k1xr9D1tknTNvxn8lIRY22klaQShywnC3XWcFZT1lDaVFTUTPLc2WyGw9F6vXkCl7yyuTRWnBTiUBbEMtaniO8hjLGhqn66vFJkZaCqrus9Bkh+0fQMh5PyDF7+Aq6qytD18Wg8GY813aCCzmNmv2yutGUBQ1aU+AiNwTxnHOUkLYVXGaEwQUVRdHdbZNSni/7FhfrHO/X3t7+9ef9WMd78q15c91/35Fc95S95dHv73yEI2hI4+7nbTVOUZYISlKZpnh/DwNQ1f++hJIEgDAI/yzIAAGO8a86nH8e2Z+Z0aVm241xe9e5lOYoTcc95LfxsXXM+mWUtRqOhpummac4Xi6lhePt927kT9FmFNXXz5PUL0d2ZRQJRFePCBZbz9nyiy9oHpw8F1+KOfy9BKpNybZ9n2wxCeuOTFWbiANdRYAbhAsTb6KAfgA2AA4P5MbTC5AsSnxB5JOQic2ySutmlTIN0CivxrCoOV/DQgkMRjX0MlgA6MN5E0SYW343WEfKwFO0SSzMPJb/2CapaPrxd5Dr3MNpEoQMF8sS4q2aRUL6bbILCLmrnS5qHudBBscefM+6X35r5TAelOa5vFUObAcHcmASKCfdhAeehvMv0XRpZIXthVEvE/tEtZytIJuouG9lIN6AJiH3nTgcHe5sqs5jkrBvs5vWfsu7swdFypx50PLi0ff0QB0tv4UfyFkyGW2N1KPKse84rx5lMxpqhTYbqoK/MZtPJcDCcCMmJ/VXXq2Vf7ccntT7RTwsmhAj1pxgjjOM49n0fRJFYE4xQnCRin9M0e0lhZ+m3wuJMsEgQfrx86Pdzi8Fo1ev1Xr2++PDh79FAlfsDSumP4OfU/pBZkAzDEGNcFgVO0/+5G18Bjp/BY8hQCzsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  2927.  &gt;&lt;/span&gt;
  2928.  &lt;img
  2929.        class=&quot;gatsby-resp-image-image&quot;
  2930.        alt=&quot;lifelongLearning&quot;
  2931.        title=&quot;&quot;
  2932.        src=&quot;/static/896a211cd5a327d6de7186905b00615e/a7c74/lifelongLearning.png&quot;
  2933.        srcset=&quot;/static/896a211cd5a327d6de7186905b00615e/12f09/lifelongLearning.png 148w,
  2934. /static/896a211cd5a327d6de7186905b00615e/e4a3f/lifelongLearning.png 295w,
  2935. /static/896a211cd5a327d6de7186905b00615e/a7c74/lifelongLearning.png 427w&quot;
  2936.        sizes=&quot;(max-width: 427px) 100vw, 427px&quot;
  2937.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2938.        loading=&quot;lazy&quot;
  2939.        decoding=&quot;async&quot;
  2940.      /&gt;
  2941.  &lt;/a&gt;
  2942.    &lt;/span&gt;&lt;/p&gt;
  2943. &lt;p&gt;An example of this I recently came across. I was talking to a client of mine about the industry they work in, &lt;a href=&quot;http://en.wikipedia.org/wiki/Medical_classification&quot;&gt;medical insurance coding.&lt;/a&gt; Coding is the process of transforming a doctor’s description of a medical visit into universal medical code numbers. My client who provide a number of training courses on doing coding, were telling me about the coming change in United States from the international coding standard ICD9 to ICD-10. An enormous number of people involved with coding will need to receive new training to learn the new standards.&lt;/p&gt;
  2944. &lt;p&gt;This is a great example of what is happening because of the shortened half-life of knowledge. Our knowledge is increasing rapidly about the human body and how to treat its problems. Because of this growth in knowledge, standards about how to describe diagnosis and procedures became outdated and were revised. Because of this coming shift to new coding standards, many people will need new training.&lt;/p&gt;
  2945. &lt;p&gt;This same pattern is repeating across dozens of industries. Supporting this sorts of short semi-continuous online classes is a major focus for Eduglu.&lt;/p&gt;
  2946. &lt;h3 id=&quot;higher-ed-bubble&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#higher-ed-bubble&quot; aria-label=&quot;higher ed bubble permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Higher Ed Bubble&lt;/h3&gt;
  2947. &lt;p&gt;The current educational system is unsustainable and needs a pruning. It’s a bubble fueled by cheap federal student loans and is perilously similar to the housing bubble we recently lived through.&lt;/p&gt;
  2948. &lt;p&gt;I ran across &lt;a href=&quot;http://mjperry.blogspot.com/2010/06/higher-education-bubble-its-about-to.html#&quot;&gt;these two graphs&lt;/a&gt; today which illustrate the problem well:&lt;/p&gt;
  2949. &lt;p&gt;&lt;strong&gt;Housing bubble&lt;/strong&gt;&lt;/p&gt;
  2950. &lt;p&gt;&lt;span
  2951.      class=&quot;gatsby-resp-image-wrapper&quot;
  2952.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; &quot;
  2953.    &gt;
  2954.      &lt;a
  2955.    class=&quot;gatsby-resp-image-link&quot;
  2956.    href=&quot;/static/3f698494f79e7eb793f26ac4676ca832/066f9/housing-bubble.jpg&quot;
  2957.    style=&quot;display: block&quot;
  2958.    target=&quot;_blank&quot;
  2959.    rel=&quot;noopener&quot;
  2960.  &gt;
  2961.    &lt;span
  2962.    class=&quot;gatsby-resp-image-background-image&quot;
  2963.    style=&quot;padding-bottom: 85.13513513513513%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAARABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHt1DRAsCQf/8QAGRAAAwADAAAAAAAAAAAAAAAAAAERIDFB/9oACAEBAAEFAtkYjtFh/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAGBAAAgMAAAAAAAAAAAAAAAAAADEBECD/2gAIAQEABj8CHUjz/8QAHBAAAgMBAAMAAAAAAAAAAAAAAREAITFBEIGh/9oACAEBAAE/ISC6K9xdl4dSsA3pljk/J0snfP8A/9oADAMBAAIAAwAAABBEzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEAAgMAAQUAAAAAAAAAAAABABEhMUFRYXGxweH/2gAIAQEAAT8QzWY0I+ekFiB0tzKGU4eq/MUhumyj9mWvhGRKOltz2I7R1D7n/9k=&apos;); background-size: cover; display: block;&quot;
  2964.  &gt;&lt;/span&gt;
  2965.  &lt;img
  2966.        class=&quot;gatsby-resp-image-image&quot;
  2967.        alt=&quot;housing bubble&quot;
  2968.        title=&quot;&quot;
  2969.        src=&quot;/static/3f698494f79e7eb793f26ac4676ca832/066f9/housing-bubble.jpg&quot;
  2970.        srcset=&quot;/static/3f698494f79e7eb793f26ac4676ca832/a80bd/housing-bubble.jpg 148w,
  2971. /static/3f698494f79e7eb793f26ac4676ca832/1c91a/housing-bubble.jpg 295w,
  2972. /static/3f698494f79e7eb793f26ac4676ca832/066f9/housing-bubble.jpg 400w&quot;
  2973.        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
  2974.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  2975.        loading=&quot;lazy&quot;
  2976.        decoding=&quot;async&quot;
  2977.      /&gt;
  2978.  &lt;/a&gt;
  2979.    &lt;/span&gt;&lt;/p&gt;
  2980. &lt;p&gt;&lt;strong&gt;Higher Ed Bubble&lt;/strong&gt;&lt;/p&gt;
  2981. &lt;p&gt;&lt;span
  2982.      class=&quot;gatsby-resp-image-wrapper&quot;
  2983.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; &quot;
  2984.    &gt;
  2985.      &lt;a
  2986.    class=&quot;gatsby-resp-image-link&quot;
  2987.    href=&quot;/static/9ccbed0ef9c2730c2a10eeee96d51995/066f9/highered-bubble.jpg&quot;
  2988.    style=&quot;display: block&quot;
  2989.    target=&quot;_blank&quot;
  2990.    rel=&quot;noopener&quot;
  2991.  &gt;
  2992.    &lt;span
  2993.    class=&quot;gatsby-resp-image-background-image&quot;
  2994.    style=&quot;padding-bottom: 90.54054054054053%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAASABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAezNDYLA0D//xAAaEAACAwEBAAAAAAAAAAAAAAAAAQIQETFB/9oACAEBAAEFApGSFz0VYq//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAYEAADAQEAAAAAAAAAAAAAAAAQMUEAEf/aAAgBAQAGPwJ8N1KH/8QAHBABAAICAwEAAAAAAAAAAAAAAQARMWEhQZHh/9oACAEBAAE/IXbw0bhbyvs3XFBW21M/U7RBcE1PIFYn/9oADAMBAAIAAwAAABCnAAD/xAAVEQEBAAAAAAAAAAAAAAAAAAARIP/aAAgBAwEBPxAj/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHxABAAICAgIDAAAAAAAAAAAAAQARITFBUWFxkbHB/9oACAEBAAE/EEY4gAW/MrMF3WvqPRSGreYc5DV+jqCrFjp+2YryKzofBLYo+SYfxQBQAvgn/9k=&apos;); background-size: cover; display: block;&quot;
  2995.  &gt;&lt;/span&gt;
  2996.  &lt;img
  2997.        class=&quot;gatsby-resp-image-image&quot;
  2998.        alt=&quot;highered bubble&quot;
  2999.        title=&quot;&quot;
  3000.        src=&quot;/static/9ccbed0ef9c2730c2a10eeee96d51995/066f9/highered-bubble.jpg&quot;
  3001.        srcset=&quot;/static/9ccbed0ef9c2730c2a10eeee96d51995/a80bd/highered-bubble.jpg 148w,
  3002. /static/9ccbed0ef9c2730c2a10eeee96d51995/1c91a/highered-bubble.jpg 295w,
  3003. /static/9ccbed0ef9c2730c2a10eeee96d51995/066f9/highered-bubble.jpg 400w&quot;
  3004.        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
  3005.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3006.        loading=&quot;lazy&quot;
  3007.        decoding=&quot;async&quot;
  3008.      /&gt;
  3009.  &lt;/a&gt;
  3010.    &lt;/span&gt;&lt;/p&gt;
  3011. &lt;p&gt;If &lt;a href=&quot;http://www.washingtonexaminer.com/opinion/columns/Sunday_Reflections/Higher-education_s-bubble-is-about-to-burst-95639354.html&quot;&gt;the bubble does pop&lt;/a&gt; and students start to shy away from high priced colleges and look for cheaper alternatives, more and more will look towards the pioneering online schools who provide most of the value of traditional universities with far more flexibility and far less cost.&lt;/p&gt;
  3012. &lt;h3 id=&quot;demand-for-higher-education-outgrowing-ability-to-build-new-schools&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#demand-for-higher-education-outgrowing-ability-to-build-new-schools&quot; aria-label=&quot;demand for higher education outgrowing ability to build new schools permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Demand for higher education outgrowing ability to build new schools&lt;/h3&gt;
  3013. &lt;p&gt;As the world becomes wealthier, 100s of millions of youth are beginning to demand access to higher education. In India alone, it was estimated that provide higher education to the same percentage the population as in United States, they would need to build nearly 2400 new universities in the next 25 years or roughly 2 per week.&lt;/p&gt;
  3014. &lt;p&gt;Building that many schools is clearly impossible. Traditional face-to-face educational models can’t scale affordably to meet that sort of demand. New models need to be developed that can operate at the low costs and large scale required&lt;/p&gt;
  3015. &lt;p&gt;&lt;a href=&quot;http://www.col.org/resources/speeches/2007presentations/Pages/2007-massTertiaryEd.aspx&quot;&gt;http://www.col.org/resources/speeches/2007presentations/Pages/2007-massTertiaryEd.aspx&lt;/a&gt;&lt;/p&gt;
  3016. &lt;p&gt;how to educate far more people for far less resources? 10x numbers of students for the same amount of resources?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The problem of too general tools]]></title><description><![CDATA[There was a nugget of a comment today on the Lean Startup Circle from William Pietri: However, having made the mistake of building too…]]></description><link>https://bricolage.io/problem-too-general-tools/</link><guid isPermaLink="false">https://bricolage.io/problem-too-general-tools/</guid><pubDate>Wed, 02 Jun 2010 19:49:23 GMT</pubDate><content:encoded>&lt;p&gt;There was a nugget of a comment today on the Lean Startup Circle from William Pietri:&lt;/p&gt;
  3017. &lt;blockquote&gt;
  3018. &lt;p&gt;However, having made the mistake of building too-general tools before, let me offer a bit of advice. Tools may be general, but people only have specific problems. So if you want an individual to choose to use your software, you have to solve their specific problem well. Generality is a consequence of extracting the similar bits of specific problems, not a goal on its own (however much that appeals to gadget nerds and toolbuilders like us). Real users mainly appreciate that generality later, if they ever do, when they have a second specific problem that is now easier to solve because they’re familiar with your tool.&lt;/p&gt;
  3019. &lt;/blockquote&gt;
  3020. &lt;p&gt;It struck me because I’m slowly starting to see this is part of the problem I’m facing with my educational tool, &lt;a href=&quot;http://eduglu.com&quot;&gt;Eduglu&lt;/a&gt;. Right now I pitch Eduglu as a “social learning platform” that includes a number of learning tools out of the box and can easily be extended to meet specific needs of the learning organization that adopts it. But when I pitch, I don’t seem to be moving anyone. It seems my pitch is falling into the too-general tool trap that William warned against. Yes, an adopting organization can use it for all sorts of things, eventually, but people don’t buy things to solve “all sorts of things”. They buy things to meet very specific needs.&lt;/p&gt;
  3021. &lt;p&gt;Or as Sean Murphy put it in another thread, narrower focus &amp;#x26; deeper pain is better.&lt;/p&gt;
  3022. &lt;p&gt;The hardest part of starting a company I think is learning to understand how others think and feel about something. As a toolbuilder, I’m very used to evaluating generic tools and understanding how to apply them to solve my specific problems. But most people aren’t as adept at that art. I need to understand how to get inside people’s heads and intimately understand what they need and the learn to present what I’m building in a way that it will be obvious to them how my tool will solve their problems.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Second release of Eduglu]]></title><description><![CDATA[New release of Eduglu I’m pleased to announce the second release of Eduglu! Eduglu is a Drupal distribution designed to support social…]]></description><link>https://bricolage.io/second-release-eduglu/</link><guid isPermaLink="false">https://bricolage.io/second-release-eduglu/</guid><pubDate>Tue, 01 Jun 2010 21:06:28 GMT</pubDate><content:encoded>&lt;h3 id=&quot;new-release-of-eduglu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#new-release-of-eduglu&quot; aria-label=&quot;new release of eduglu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;New release of Eduglu&lt;/h3&gt;
  3023. &lt;p&gt;I’m pleased to announce the second release of &lt;a href=&quot;http://eduglu.com&quot;&gt;Eduglu&lt;/a&gt;! Eduglu is a Drupal distribution designed to support social learning at institutions of higher learning. It’s available for download now at &lt;a href=&quot;http://eduglu.com/download-eduglu&quot;&gt;http://eduglu.com/download-eduglu&lt;/a&gt;. Since the first release, We’ve squashed dozens of major and minor bugs and made the significant jump to the &lt;a href=&quot;http://drupal.org/project/spaces&quot;&gt;Spaces 3&lt;/a&gt; and &lt;a href=&quot;http://drupal.org/project/context&quot;&gt;Context 3&lt;/a&gt;.&lt;/p&gt;
  3024. &lt;p&gt;Eduglu helps learners connect with one another and form learning communities. Eduglu provides online spaces for groups to learn together.&lt;/p&gt;
  3025. &lt;p&gt;Our social learning platform ships with a number of powerful social learning applications including discussion boards with full email integration (like Google Groups), polls, and wikis.&lt;/p&gt;
  3026. &lt;p&gt;I recorded a quick screencast demoing an initial setup of Eduglu. Check it out to get a flavor for what Eduglu can do.&lt;/p&gt;
  3027. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 80.20833333333334%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;p&gt; &lt;object style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/Z7HkN2W3vrI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/Z7HkN2W3vrI&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/object&gt; &lt;/p&gt; &lt;/div&gt;
  3028. &lt;h3 id=&quot;hosted-eduglu-coming&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hosted-eduglu-coming&quot; aria-label=&quot;hosted eduglu coming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hosted Eduglu coming&lt;/h3&gt;
  3029. &lt;p&gt;I’m also rather excited to announce that a fully supported hosted version of Eduglu is coming. Schools and other organizations will soon be able to easily sign-up for hosted Eduglu to meet the social learning needs of their organization. Head over to &lt;a href=&quot;http://eduglu.com&quot;&gt;eduglu.com&lt;/a&gt; and leave your email address to hear when we open up for business and to provide early feedback.&lt;/p&gt;
  3030. &lt;p&gt;This will be our initial stab at creating a &lt;a href=&quot;http://buytaert.net/on-business-models-for-drupal-distributions&quot;&gt;sustainable business model for our Drupal educational distribution&lt;/a&gt;. There’s been &lt;a href=&quot;http://acquia.com/blog/drupal-software-publishing&quot;&gt;a&lt;/a&gt; &lt;a href=&quot;http://buytaert.net/on-business-models-for-drupal-distributions&quot;&gt;lot&lt;/a&gt; &lt;a href=&quot;http://developmentseed.org/blog/2010/mar/13/ideas-open-atrium-partners-program&quot;&gt;of&lt;/a&gt; discussion &lt;a href=&quot;http://www.agileapproach.com/blog-entry/openpublish-20-and-beyond-labor-love-1&quot;&gt;lately&lt;/a&gt; in the Drupal community about finding business models that can help create sustainable Drupal Distributions. I’m not sure hosted Eduglu is the right business model for that task but since a startup is ”&lt;a href=&quot;http://steveblank.com/2010/04/12/why-startups-are-agile-and-opportunistic-%E2%80%93-pivoting-the-business-model/&quot;&gt;an organization formed to search for a repeatable and scalable business model&lt;/a&gt;”, we’ll give this business model a try for awhile as we look for ways to freshen the stagnant world of educational technology.&lt;/p&gt;
  3031. &lt;h3 id=&quot;whats-coming-next-for-eduglu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-coming-next-for-eduglu&quot; aria-label=&quot;whats coming next for eduglu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s coming next for Eduglu?&lt;/h3&gt;
  3032. &lt;p&gt;Eduglu works well with 500-1000 members. But we want it to work for much much larger organizations. Organizations the size of my alma mater Brigham Young University that has 30,000 students and 250,000+ alumni. To make Eduglu work on that scale, we’ll be adding features such as group suggesting, robust search and filtering, activity streams, and twitter-style following.&lt;/p&gt;
  3033. &lt;p&gt;Also we’re working on a number of social learning applications. Right now Eduglu ships with four social learning applications. A discussion/mailing list, wiki, and polling.&lt;/p&gt;
  3034. &lt;p&gt;The next two major applications we’d like to ship are a blogging application that let’s learners blog on various things they are learning and comment on other’s blogs. If the learner has an existing blog, they’ll be able to connect it to their Eduglu blog so new posts there are automatically imported.&lt;/p&gt;
  3035. &lt;p&gt;The second application is a Group RSS Reader that lets a group of learners subscribe to content via RSS and provides various means for rating, sorting, sharing, and discussing content brought into the group.&lt;/p&gt;
  3036. &lt;p&gt;Both are powerful learning tools that help students more easily share what they are learning and track and discuss the best ideas that are being written about on the Internet and we’re excited to get them out into the wild.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Conversation]]></title><description><![CDATA[From British political philosopher Michael Oakeshott: Conversation is not … a contest where a winner gets a prize, … it is an endless…]]></description><link>https://bricolage.io/conversation/</link><guid isPermaLink="false">https://bricolage.io/conversation/</guid><pubDate>Mon, 26 Apr 2010 20:48:42 GMT</pubDate><content:encoded>&lt;p&gt;From British political philosopher Michael Oakeshott:&lt;/p&gt;
  3037. &lt;blockquote&gt;
  3038. &lt;p&gt;Conversation is not … a contest where a winner gets a prize, … it is an endless, unrehearsed, intellectual adventure in which in imagination we enter a variety of modes of understanding the world and ourselves. And, we are not disconcerted by the differences, or dismayed by the inconclusiveness of it all.&lt;/p&gt;
  3039. &lt;/blockquote&gt;
  3040. &lt;p&gt;I really like that. Good conversation is good for the soul.&lt;/p&gt;
  3041. &lt;p&gt;Taken from &lt;a href=&quot;http://andrewmcafee.org/&quot;&gt;Andrew McAfee’s&lt;/a&gt; ”&lt;a href=&quot;http://www.amazon.com/Enterprise-2-0-Collaborative-Organizations-Challenges/dp/1422125874/ref=sr_1_2?ie=UTF8&amp;#x26;s=books&amp;#x26;qid=1272314809&amp;#x26;sr=8-2&quot;&gt;Enterprise 2.0&lt;/a&gt;” book.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Notes from "The Future of Teaching & Learning" conference — Tools and Technology Models]]></title><description><![CDATA[Two questions from moderator: What will the next generation of learning tools look like? What do Universities need to do to prepare? Marko…]]></description><link>https://bricolage.io/notes-future-teaching-learning-conference-tools-and-technology-models/</link><guid isPermaLink="false">https://bricolage.io/notes-future-teaching-learning-conference-tools-and-technology-models/</guid><pubDate>Sat, 17 Apr 2010 19:39:34 GMT</pubDate><content:encoded>&lt;p&gt;Two questions from moderator:&lt;/p&gt;
  3042. &lt;ul&gt;
  3043. &lt;li&gt;What will the next generation of learning tools look like?&lt;/li&gt;
  3044. &lt;li&gt;What do Universities need to do to prepare?&lt;/li&gt;
  3045. &lt;/ul&gt;
  3046. &lt;p&gt;Marko Turpeinen from Helsinki Institute for Information Technology demoing &lt;a href=&quot;http://www.sizzlelab.org/&quot;&gt;Sizzle&lt;/a&gt;.&lt;/p&gt;
  3047. &lt;p&gt;DrChuck warning that what works for small sizes don’t scale. Too much friction to using these tech tools. There should be a one-click install.&lt;/p&gt;
  3048. &lt;p&gt;He envisions large diverse ecosystem of learning applications where teachers, grad students, small startups build learning tools that all interoperate with one another. Like the app store — teachers can find apps and click to add them depending on their need.&lt;/p&gt;
  3049. &lt;p&gt;For all this talk about next generation learning — very very few people are doing anything similar. Huge inertia. Have to build pathways into future. Lower friction to using new tools. Dr. Chuck looking at adding escape hatches into major LMSs.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Notes from "The Future of Teaching & Learning" conference — Howard Rheingold's keynote]]></title><description><![CDATA[First Keynote from Howard Rheingold. Started teaching a digital journalism class then moved on to teaching digital literacy. When first…]]></description><link>https://bricolage.io/notes-future-teaching-learning-conference-howard-rheingolds-keynote/</link><guid isPermaLink="false">https://bricolage.io/notes-future-teaching-learning-conference-howard-rheingolds-keynote/</guid><pubDate>Sat, 17 Apr 2010 17:04:24 GMT</pubDate><content:encoded>&lt;p&gt;First Keynote from Howard Rheingold.&lt;/p&gt;
  3050. &lt;p&gt;Started teaching a digital journalism class then moved on to teaching digital literacy. When first started teaching classrooms, thought about how to use online media to overcome disadvantages of teaching in classrooms namely a) not all teachers good at speaking extemporously and b) classroom learning militates against thoughtfulness, can’t share thought that occurs an hour after class.&lt;/p&gt;
  3051. &lt;p&gt;First started experimenting with using online tools for learning in 1995.&lt;/p&gt;
  3052. &lt;p&gt;When first started teaching in 2005? Used wikis from one tool, forums from another, blogs from another. Immediate feedback from students was this was too complex. So thought about consolidating tools. Entered Haystack competition and won some money to create the socialmediaclassroom.com.&lt;/p&gt;
  3053. &lt;p&gt;Socialmediaclassroom tool is freely downloadable or you can ask for hosted version. He’s developed a number of lesson plans for introducing participatory media to students.&lt;/p&gt;
  3054. &lt;p&gt;Developed way within Drupal to tie all work done around a lecture to be listed on page.&lt;/p&gt;
  3055. &lt;p&gt;Says forums not used as much as 10-15 years ago.&lt;/p&gt;
  3056. &lt;p&gt;Unique accordance of forums — long-lasting conversations on topics. Help students get to know each other. Continue classroom discussions asynchronously online.&lt;/p&gt;
  3057. &lt;p&gt;Introducing other features of socialmediaclassroom — blogs w/ rich media, group chat, syllabus in the wiki, social bookmarking (which is new to a lot of students) — use to collect resources for class project. Depending on class, sends students to delicious or diigo for discovery of different resources.&lt;/p&gt;
  3058. &lt;p&gt;Has found that moving classroom chairs into a circle resulting in increase in classroom conversation.&lt;/p&gt;
  3059. &lt;p&gt;Has co-teaching teams made up of students. He asks them to lists concepts and terms talked about in each class. Then other classmates fill out the descriptions.&lt;/p&gt;
  3060. &lt;p&gt;Surprised at how &lt;em&gt;illiterate&lt;/em&gt; most students were when he started teaching college students.&lt;/p&gt;
  3061. &lt;p&gt;Essence of what skills needs to teach children — How can you find the answer to any question? How do you know that what you find is accurate?&lt;/p&gt;
  3062. &lt;p&gt;Example he uses — if do search for “martin luther king jr” The 8th result is from martinlutherking.org — which is a website slamming on MLK. Used whoisit.com to find martinlutherking.org owned by white nationalist site Stormfront.&lt;/p&gt;
  3063. &lt;p&gt;Seems clear that youth are moving from passive consumption to active participation. Youth can create as well as consume online.&lt;/p&gt;
  3064. &lt;p&gt;Gave a number of examples of how students are using social tools to help organize collective action.&lt;/p&gt;
  3065. &lt;p&gt;We need to look at network theory, sociology research, network literacies, media theory as we redesign education for the digital age.&lt;/p&gt;
  3066. &lt;p&gt;Don’t just pay attention to technology, also pay attention to literacies.&lt;/p&gt;
  3067. &lt;p&gt;Social medias are not always appropriate to teaching&lt;/p&gt;
  3068. &lt;p&gt;Not add ons, essential elements of student’s lives of today and tomorrow. Need to help students understand social media.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My social learning Drupal distribution Eduglu is out for testing]]></title><description><![CDATA[The first alpha of Eduglu is out and ready for testing. Download it at http://community.eduglu.org/release-announcement/node/8 What I hope…]]></description><link>https://bricolage.io/eduglu-alpha-1-out-testing/</link><guid isPermaLink="false">https://bricolage.io/eduglu-alpha-1-out-testing/</guid><pubDate>Mon, 22 Mar 2010 20:19:25 GMT</pubDate><content:encoded>&lt;p&gt;The first alpha of Eduglu is out and ready for testing. Download it at &lt;a href=&quot;http://community.eduglu.org/release-announcement/node/8&quot;&gt;http://community.eduglu.org/release-announcement/node/8&lt;/a&gt;&lt;/p&gt;
  3069. &lt;h2 id=&quot;what-i-hope-to-accomplish-with-this-first-alpha&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-i-hope-to-accomplish-with-this-first-alpha&quot; aria-label=&quot;what i hope to accomplish with this first alpha permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What I hope to accomplish with this first Alpha?&lt;/h2&gt;
  3070. &lt;p&gt;My hope is that releasing this first of Eduglu will start a conversation about what shape should a Drupal educational distro take. Eduglu is a partial-implementation of my vision of what an Drupal education distro should be. But I’m well aware that my vision is limited in many ways and that the problems I’ve designed Eduglu to solve probably don’t even begin to cover all the different problems you as a collective are trying to solve.&lt;/p&gt;
  3071. &lt;p&gt;So let’s get the conversation going. What do you think Eduglu should be? What problems are you facing? What would your dream social learning website be? If you’re building some sort of social learning tool on Drupal already (as I know many of you are), what are you trying to do and how?&lt;/p&gt;
  3072. &lt;p&gt;So this first alpha is a chance for us to talk about what Eduglu should be. Once we’ve decided what Eduglu should be, we can start pushing toward a stable Beta release, fixing bugs and adding missing features.&lt;/p&gt;
  3073. &lt;p&gt;&lt;a href=&quot;http://community.eduglu.org&quot;&gt;Let’s get started!&lt;/a&gt;&lt;/p&gt;
  3074. &lt;h2 id=&quot;screencast-of-installation-and-initial-setup-of-eduglu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#screencast-of-installation-and-initial-setup-of-eduglu&quot; aria-label=&quot;screencast of installation and initial setup of eduglu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Screencast of installation and initial setup of Eduglu&lt;/h2&gt;
  3075. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 79.54545454545455%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;p&gt; &lt;object style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/-5SLfDKxTi8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;hd=1&amp;amp;border=1&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/-5SLfDKxTi8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;hd=1&amp;amp;border=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;660&quot; height=&quot;525&quot;&gt;&lt;/object&gt; &lt;/p&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Looking for Alpha Testers for Eduglu, a new Drupal Install Profile for Higher Education]]></title><description><![CDATA[I’ve been working on a social learning site based on Drupal for the past two years as a student at Brigham Young University and am now…]]></description><link>https://bricolage.io/need-alpha-testers-eduglu-new-drupal-install-profile-higher-education/</link><guid isPermaLink="false">https://bricolage.io/need-alpha-testers-eduglu-new-drupal-install-profile-higher-education/</guid><pubDate>Fri, 05 Feb 2010 18:47:56 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been working on a &lt;a href=&quot;https://island.byu.edu&quot;&gt;social learning site based on Drupal&lt;/a&gt; for the past two years as a student at Brigham Young University and am now working towards readying it for its maiden release into the world as a full-fledged Drupal install profile.&lt;/p&gt;
  3076. &lt;p&gt;My goal with &lt;a href=&quot;http://eduglu.com&quot;&gt;Eduglu&lt;/a&gt; is to:&lt;/p&gt;
  3077. &lt;p&gt;a) Provide a &lt;strong&gt;superb out-of-the-box social learning engine&lt;/strong&gt; to help departments, clubs, classrooms, and other campus groups communicate, collaborate, and learn with one another.&lt;/p&gt;
  3078. &lt;p&gt;b) Support a &lt;strong&gt;social learning platform&lt;/strong&gt; which individual universities and Drupal shops can integrate with existing tools and services and use to build custom tools supporting specific learning practices.&lt;/p&gt;
  3079. &lt;p&gt;Or in simpler terms, &lt;strong&gt;Eduglu = robust social learning engine + pluggable educational tools&lt;/strong&gt;.&lt;/p&gt;
  3080. &lt;p&gt;For Drupalers, Eduglu is built on the same stack of modules as &lt;a href=&quot;http://openatrium.com&quot;&gt;Open Atrium&lt;/a&gt;; &lt;a href=&quot;http://drupal.org/project/og&quot;&gt;Organic Groups&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/spaces&quot;&gt;Spaces&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/context&quot;&gt;Context&lt;/a&gt;, and &lt;a href=&quot;http://drupal.org/project/features&quot;&gt;Features&lt;/a&gt;.&lt;/p&gt;
  3081. &lt;p&gt;I’m also working to start a company to provide commercial support and hosting for Eduglu.&lt;/p&gt;
  3082. &lt;p&gt;But we’re not there yet. My plan is to make the first beta release by Drupalcon where &lt;a href=&quot;http://sf2010.drupal.org/conference/sessions/introducing-eduglu-new-drupal-install-profile-higher-education&quot;&gt;I’ll be presenting more about Eduglu&lt;/a&gt;. But to be ready by then, &lt;strong&gt;I need alpha testers&lt;/strong&gt;. If you’re interested in becoming an alpha tester, &lt;a href=&quot;mailto:mathews.kyle@gmail.com&quot;&gt;please contact me&lt;/a&gt;. I’ll be preparing an initial release over the next couple of weeks.&lt;/p&gt;
  3083. &lt;p&gt;Also, if you do &lt;strong&gt;Drupal consulting in higher education&lt;/strong&gt;, I’d love to work with you. &lt;a href=&quot;mailto:mathews.kyle@gmail.com&quot;&gt;Please contact me&lt;/a&gt; and let’s discuss how we can work together.&lt;/p&gt;
  3084. &lt;p&gt;Lastly, if you’re an &lt;strong&gt;educator working in higher ed&lt;/strong&gt;, I’d love to talk to you as well. Especially people working at online or virtual colleges and community colleges. If there’s an educational tool you’ve dreamed of having — or tried building and failed — &lt;a href=&quot;mailto:mathews.kyle@gmail.com&quot;&gt;contact me&lt;/a&gt; and tell me about it and I might just build it for you.&lt;/p&gt;
  3085. &lt;p&gt;And if you’re not in one of the above three groups but know someone who is — please connect me with those people.&lt;/p&gt;
  3086. &lt;p&gt;I’ll be doing a bit of travel in a couple of weeks. I’ll be in Boston February 17th-20th, New York February 22-23 and Washington DC on the 24th-25th. If you’re in one of those cities and want to meet and talk Drupal/higher education, let’s get in touch!&lt;/p&gt;
  3087. &lt;p&gt;Thanks all! It’s going to be an exciting ride and I’m looking forward to it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[An Education Syllogism]]></title><description><![CDATA[Schools exist to prepare students to thrive in the environment where they live. The environment we live in has changed significantly in the…]]></description><link>https://bricolage.io/education-syllogism/</link><guid isPermaLink="false">https://bricolage.io/education-syllogism/</guid><pubDate>Tue, 02 Feb 2010 22:24:43 GMT</pubDate><content:encoded>&lt;p&gt;Schools exist to prepare students to thrive in the environment where they live.&lt;/p&gt;
  3088. &lt;p&gt;The environment we live in has changed significantly in the past fifty years from a mechanistic to an electronic world.&lt;/p&gt;
  3089. &lt;p&gt;Therefore, schools must change their methods for how they prepare students from mechanistic preparation (&lt;a href=&quot;http://www.jonmott.com/blog/2008/07/learner-presence-in-course-management-systems/&quot;&gt;fixed length/content courses&lt;/a&gt;, &lt;a href=&quot;http://www.everythingismiscellaneous.com/&quot;&gt;categorized knowledge&lt;/a&gt;) to electronic preparation (&lt;a href=&quot;/marshall-mcluhan-education&quot;&gt;pattern recognition&lt;/a&gt;, &lt;a href=&quot;/organizing-university-learning-moving-beyond-classroom&quot;&gt;rhizomic&lt;/a&gt; &lt;a href=&quot;http://davecormier.com/edblog/2008/06/03/rhizomatic-education-community-as-curriculum/&quot;&gt;learning&lt;/a&gt;).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[McLuhan predicts newspaper's demise in 1965.]]></title><description><![CDATA[Reading through ”Understanding Media: The Extensions of Man” by Marshall McLuhan, I came across this gem of a quote: The classified ads (and…]]></description><link>https://bricolage.io/mcluhan-predicts-newspapers-demise-1965/</link><guid isPermaLink="false">https://bricolage.io/mcluhan-predicts-newspapers-demise-1965/</guid><pubDate>Sat, 19 Dec 2009 20:29:17 GMT</pubDate><content:encoded>&lt;p&gt;Reading through ”&lt;a href=&quot;http://www.amazon.com/Understanding-Media-Extensions-Marshall-McLuhan/dp/0262631598&quot;&gt;Understanding Media: The Extensions of Man&lt;/a&gt;” by Marshall McLuhan, I came across this gem of a quote:&lt;/p&gt;
  3090. &lt;blockquote&gt;
  3091. &lt;p&gt;The classified ads (and stock-market quotations) are the bedrock of the press. Should an alternative source of easy access to such diverse daily information be found, the press will fold.&lt;/p&gt;
  3092. &lt;/blockquote&gt;
  3093. &lt;p&gt;And I think we all know how that’s turned out.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Three adoption patterns for educational social software]]></title><description><![CDATA[I’ve been reading and thinking a lot lately about how to drive more adoption of the social learning platform I’m building here at BYU, https…]]></description><link>https://bricolage.io/three-adoption-patterns-educational-social-software/</link><guid isPermaLink="false">https://bricolage.io/three-adoption-patterns-educational-social-software/</guid><pubDate>Wed, 18 Nov 2009 19:55:21 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been reading and thinking a lot lately about how to drive more adoption of the social learning platform I’m building here at BYU, &lt;a href=&quot;https://island.byu.edu&quot;&gt;https://island.byu.edu&lt;/a&gt;, and wanted to summarize some of the highlights of what I’ve learned. All of the patterns come directly from &lt;a href=&quot;http://ross.typepad.com/&quot;&gt;Ross Mayfield&lt;/a&gt; and &lt;a href=&quot;http://michaeli.typepad.com/my_weblog/&quot;&gt;Michael Idinopulos’s&lt;/a&gt; writings so a big shout out to the great work they’re doing at &lt;a href=&quot;http://www.socialtext.com/&quot;&gt;Socialtext&lt;/a&gt;.&lt;/p&gt;
  3094. &lt;h4 id=&quot;pattern-1-launch-broad-then-deep&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pattern-1-launch-broad-then-deep&quot; aria-label=&quot;pattern 1 launch broad then deep permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pattern 1: Launch Broad then Deep&lt;/h4&gt;
  3095. &lt;p&gt;I wrote extensively about this pattern about a month ago in my post &lt;a href=&quot;/deploying-social-software-universities-broad-then-deep&quot;&gt;Deploying Social Software in Universities: Go Broad then Deep&lt;/a&gt;. The crux of the argument is that when deploying social software, you should first aim to get wide adoption, sign up as many people as possible, before trying to facilitate deeper, more complex engagement between your users. Social software without people is useless or as &lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/08/enterprise-20-skip-the-pilot.html&quot;&gt;Michael Idinopulos puts it&lt;/a&gt;, “Scale is the oxygen that feeds collaboration.” In the competitive web2.0 world, the simplest tool almost always will win.&lt;/p&gt;
  3096. &lt;p&gt;Once you’ve achieved broad adoption, the next step is to go deep. To quote Michael again, “[after achieving scale] deliver deep value by following up with local champions [deans, teachers, students] who want to invest time and effort in more robust, group-specific forms of collaboration.”&lt;/p&gt;
  3097. &lt;p&gt;So launch simply and broadly. Let students and teachers adjust to having a web-enabled learning environment. Then go deep by building into the social learning platform higher-value tools such as blogs, wikis, and other collaborative learning tools and workflows.&lt;/p&gt;
  3098. &lt;h4 id=&quot;pattern-2-help-learners-climb-the-participation-curve&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pattern-2-help-learners-climb-the-participation-curve&quot; aria-label=&quot;pattern 2 help learners climb the participation curve permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pattern 2: Help Learners Climb the Participation Curve&lt;/h4&gt;
  3099. &lt;p&gt;Ross Mayfield came up with a beautiful concept a number of years ago called the ”&lt;a href=&quot;http://ross.typepad.com/blog/2006/04/power_law_of_pa.html&quot;&gt;Power Law of Participation&lt;/a&gt;”&lt;/p&gt;
  3100. &lt;p&gt;Reproduced image:&lt;/p&gt;
  3101. &lt;p&gt;&lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/09/launching-at-scale-.html&quot;&gt;&lt;span
  3102.      class=&quot;gatsby-resp-image-wrapper&quot;
  3103.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; &quot;
  3104.    &gt;
  3105.      &lt;a
  3106.    class=&quot;gatsby-resp-image-link&quot;
  3107.    href=&quot;/static/8978482c953b5a26dd03abd0060a0635/41099/power-law-participation.jpg&quot;
  3108.    style=&quot;display: block&quot;
  3109.    target=&quot;_blank&quot;
  3110.    rel=&quot;noopener&quot;
  3111.  &gt;
  3112.    &lt;span
  3113.    class=&quot;gatsby-resp-image-background-image&quot;
  3114.    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAe8mqacpFn//xAAZEAACAwEAAAAAAAAAAAAAAAABEAACIRT/2gAIAQEAAQUCXNRbAc//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwFH/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAECAQE/AVy1v//EABgQAAIDAAAAAAAAAAAAAAAAAAEQIUGR/9oACAEBAAY/AleqAv/EABsQAQEBAAIDAAAAAAAAAAAAAAEAETFBUZHB/9oACAEBAAE/IUOW3ET15lXe8TXZPoYQDf/aAAwDAQACAAMAAAAQLP8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EA2Rf//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxDFsIX/xAAdEAEBAAIBBQAAAAAAAAAAAAABEQAxIUFhgaHR/9oACAEBAAE/EC9C98YAx07fiYqgVYcD1j0HJpWzxq5a7HbFzaAEc//Z&apos;); background-size: cover; display: block;&quot;
  3115.  &gt;&lt;/span&gt;
  3116.  &lt;img
  3117.        class=&quot;gatsby-resp-image-image&quot;
  3118.        alt=&quot;power law participation&quot;
  3119.        title=&quot;&quot;
  3120.        src=&quot;/static/8978482c953b5a26dd03abd0060a0635/41099/power-law-participation.jpg&quot;
  3121.        srcset=&quot;/static/8978482c953b5a26dd03abd0060a0635/a80bd/power-law-participation.jpg 148w,
  3122. /static/8978482c953b5a26dd03abd0060a0635/1c91a/power-law-participation.jpg 295w,
  3123. /static/8978482c953b5a26dd03abd0060a0635/41099/power-law-participation.jpg 500w&quot;
  3124.        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
  3125.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3126.        loading=&quot;lazy&quot;
  3127.        decoding=&quot;async&quot;
  3128.      /&gt;
  3129.  &lt;/a&gt;
  3130.    &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
  3131. &lt;p&gt;The essence of the model is that in any community, the vast majority of the members will not have a very high level of engagement with the community. For example, in most classes there will be a few students who actively participate while the rest play solitaire. When you first deploy social learning software, most learners will only participate by reading. While they do get value from reading and lurking in communities, learners will benefit even more if they move up the participation curve and engage more deeply in some of the communities they participate in.&lt;/p&gt;
  3132. &lt;p&gt;Software adoption can be thought of in two dimensions, broad and deep. If your learners are successfully engaging in higher value / engagement tasks on your site, this deep adoption is occurring.&lt;/p&gt;
  3133. &lt;h4 id=&quot;pattern-3-focus-on-creating-value&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pattern-3-focus-on-creating-value&quot; aria-label=&quot;pattern 3 focus on creating value permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pattern 3: Focus on Creating Value&lt;/h4&gt;
  3134. &lt;p&gt;It’s far to easy to focus on the tools we use rather than the value we’re trying to create (See Jon Mott’s blog, ”&lt;a href=&quot;http://www.jonmott.com/blog/2008/06/beginning-with-the-end-in-mind/&quot;&gt;The End in Mind&lt;/a&gt;” for an extended discussion on this subject). Adoption will increase if we focus on more creating value (&lt;a href=&quot;http://www.globalnerdy.com/2009/10/17/its-about-helping-your-users-become-awesome-or-being-better-is-better-by-kathy-sierra/&quot;&gt;making our users awesome&lt;/a&gt;) and less on the specific tools we are building/using.&lt;/p&gt;
  3135. &lt;p&gt;A social learning platform can add value to educational institutions in four contexts (See Michael’s post &lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/04/the-social-software-value-matrix.html&quot;&gt;The Social Software Value Matrix&lt;/a&gt; for more):&lt;/p&gt;
  3136. &lt;ol&gt;
  3137. &lt;li&gt;Within the classroom&lt;/li&gt;
  3138. &lt;li&gt;Within departments&lt;/li&gt;
  3139. &lt;li&gt;Within the institution&lt;/li&gt;
  3140. &lt;li&gt;Across multiple institutions&lt;/li&gt;
  3141. &lt;/ol&gt;
  3142. &lt;p&gt;Socialtext recently released a white paper on the &lt;a href=&quot;http://docs.google.com/gview?a=v&amp;#x26;q=cache:vxa4yzS7cNcJ:www.socialtext.com/documents/wp_6WaystoGetBusinessValuefromSocialSoftware.pdf+formal+informal+socialtext&amp;#x26;hl=en&amp;#x26;gl=us&amp;#x26;sig=AFQjCNFjnMdK1kI1rm0w-XW6Vxx0WlzFYQ&quot;&gt;6 Ways to Get Business Value from Social Software&lt;/a&gt;. They discuss there how social software can greatly improve the formal and informal processes in each of the contexts that social software operates in.&lt;/p&gt;
  3143. &lt;p&gt;Formal processes they define as “those things your organization does on a repeated basis.”&lt;/p&gt;
  3144. &lt;p&gt;In an educational environment those would be things such as lectures, quizzes, studying, group projects, writing essays, exams, and so forth.&lt;/p&gt;
  3145. &lt;p&gt;Informal processes they define as “all the many interactions that take place outside of this [formal] structure. They are not predictable and repeated, and therefore cannot be codified and defined… Informal processes make up the bulk of [learners] interactions.”&lt;/p&gt;
  3146. &lt;p&gt;In an educational environment informal processes would include such activities as informal study groups, conversations in hallways, individuals or small groups meeting with professors or TAs, forums, clubs, and so forth.&lt;/p&gt;
  3147. &lt;p&gt;Within an educational institutions there are many formal and informal learning processes that can be improved. As we focus on identifying poor processes and creating learning tools that clearly improve them, adoption of our social learning software will increase.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Marshall McLuhan on education]]></title><description><![CDATA[I’ve started reading ”Understanding Media: The Extensions of Man” by Marshall McLuhan and am greatly enjoying it. It’s an incredibly dense…]]></description><link>https://bricolage.io/marshall-mcluhan-education/</link><guid isPermaLink="false">https://bricolage.io/marshall-mcluhan-education/</guid><pubDate>Thu, 12 Nov 2009 16:17:57 GMT</pubDate><content:encoded>&lt;p&gt;I’ve started reading ”&lt;a href=&quot;http://www.amazon.com/Understanding-Media-Extensions-Marshall-McLuhan/dp/0262631598&quot;&gt;Understanding Media: The Extensions of Man&lt;/a&gt;” by Marshall McLuhan and am greatly enjoying it. It’s an incredibly dense read but so far my efforts have been richly rewarded.&lt;/p&gt;
  3148. &lt;p&gt;I haven’t read enough of the book yet to feel up to writing a proper review/analysis but I wanted to pass along a bit from the introduction to the paperback edition that McLuhan wrote on education as the analysis (~50 years after it was written!) is still spot on and entirely appropriate to our discussions today on what education should become in the 21st century.&lt;/p&gt;
  3149. &lt;blockquote&gt;
  3150. &lt;p&gt;Any new technology gradually creates a totally new human environment. Environments are not passive wrappings but active processes. In his splendid work &lt;em&gt;&lt;a href=&quot;http://www.amazon.com/Preface-Plato-History-Greek-Mind/dp/0674699068&quot;&gt;Preface to Plato&lt;/a&gt;&lt;/em&gt; (Harvard University Press, 1963), Eric Havelock contrasts the oral and written cultures of the Greeks. By Plato’s time the written word had created a new environment that had begun to detribalize man. Previously the Greeks had grown up by benefit of the process of the tribal encyclopedia. They had memorized the poets. The poets provided specific operational wisdom for all the contingencies of life—Ann Landers in verse. With the advent of individualized man, a new education was needed. Plato devised such a new program for literate men. It was based on the Ideas. With the phonetic alphabet, classified wisdom took over from the operational wisdom of Homer and Hesiod and the tribal encyclopedia. Education by classified data has been the Western program ever since.&lt;/p&gt;
  3151. &lt;p&gt;Now, however, in the electronic age, data classification yields to pattern recognition, the key phrase at IBM. When data move instantly, classification is too fragmentary. In order to cope with data a electric speed in typical situations of “information overload,” men resort to the study of configurations, like the sailor in &lt;a href=&quot;http://en.wikipedia.org/wiki/A_Descent_into_the_Maelstr%C3%B6m&quot;&gt;Edgar Allan Poe’s &lt;em&gt;Maelstrom&lt;/em&gt;&lt;/a&gt;. The drop-out situation in our schools at present has only begun to develop. The young student today grows up in an electrically configured world. It is a world not of wheels but of circuits, not of fragments but of integral patterns. The student today &lt;em&gt;lives&lt;/em&gt; mythically and in depth. At school, however, he encounters a situation organized by means of classified information. The subjects are unrelated. They are visually conceived in terms of a blueprint. The student can find no possible means of involvement for himself, nor can he discover how the educational scene relates to the “mythic” world of electronically processed data and experience that he takes for granted. As one IBM executive puts it, “My children had lived several lifetimes compared to their grandparents when they begun grade one.”&lt;/p&gt;
  3152. &lt;/blockquote&gt;
  3153. &lt;p&gt;His definition of “myth” is necessary to understand the above quote. Taken from pg. 25 of the paperback version:&lt;/p&gt;
  3154. &lt;blockquote&gt;
  3155. &lt;p&gt;Myth is the instant vision of a complex process that ordinarily extends over a long period. Myth is contraction or implosion of any process, and the instant speed of electricity confers the mythic dimension on ordinary industrial and social action today.&lt;/p&gt;
  3156. &lt;/blockquote&gt;
  3157. &lt;p&gt;Later in the book McLuhan writes that, “We &lt;em&gt;live&lt;/em&gt; mythically but continue to think fragmentarily and on single planes.” The new electronic/internet environment we live in has reshaped how we live, learn, and work. The disconnect McLuhan identified between how we live and learn &lt;em&gt;outside&lt;/em&gt; of school vs. &lt;em&gt;inside&lt;/em&gt; of school has only grown since the 1960s.&lt;/p&gt;
  3158. &lt;p&gt;Much of what passes for educational best practices these days are merely vestiges of a bygone era. For better or for worse, the electronic age has radically reshaped human thought and behavior. Clinging to educational practices designed to teach “data classification” helps no one — especially the students who are facing a world radically different than the one our schools prepare them for.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How we ran a micro-lab course]]></title><description><![CDATA[This is the second part of a (most likely) three-part series of posts I’m harvesting from a journal article Tim Olsen and I wrote earlier…]]></description><link>https://bricolage.io/how-we-ran-micro-lab-course/</link><guid isPermaLink="false">https://bricolage.io/how-we-ran-micro-lab-course/</guid><pubDate>Fri, 30 Oct 2009 16:26:04 GMT</pubDate><content:encoded>&lt;p&gt;This is the second part of a (most likely) three-part series of posts I’m harvesting from a journal article Tim Olsen and I wrote earlier this year. You might want to read the first post for context, &lt;a href=&quot;/organizing-university-learning-moving-beyond-classroom&quot;&gt;Organizing University Learning: Moving Beyond the Course to Micro-labs&lt;/a&gt;, before continuing here.&lt;/p&gt;
  3159. &lt;p&gt;This post is taken from the section of the paper where we describe our experience running a micro-lab course (with &lt;a href=&quot;http://warp.byu.edu/site/&quot;&gt;Conan Albrecht&lt;/a&gt; as the head teacher) in the &lt;a href=&quot;http://marriottschool.byu.edu/bsisys/&quot;&gt;Information Systems department&lt;/a&gt; at &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt;.&lt;/p&gt;
  3160. &lt;p&gt;First a review of the micro labs concept taken from the &lt;a href=&quot;/organizing-university-learning-moving-beyond-classroom&quot;&gt;first post&lt;/a&gt;:&lt;/p&gt;
  3161. &lt;blockquote&gt;
  3162. &lt;p&gt;Micro-labs are small learning communities centered around answering a question, not mastering standardized content/skills&lt;/p&gt;
  3163. &lt;p&gt;Micro-labs are a proposed university course architecture which supports and incorporates “web 2.0” informal learning principles, enabling students to entirely create their own curriculum with the goal of contributing all objects created by learning back to a learning community of practice, and an Internet audience. This course design seeks to harness both the student’s natural (intrinsic) desire to learn and the ease of access to knowledge created by advances in communication technologies.&lt;/p&gt;
  3164. &lt;/blockquote&gt;
  3165. &lt;p&gt;In our micro-lab course, the students were asked to do four projects through the course of the semester. Each project had four steps. Students 1) create and post on the class website a learning contract specifying what they wish to learn, their process for learning, and planned deliverables. This contract is 2) revised with feedback from the instructor and fellow students. Students 3) complete the proposed learning contract and 4) share the completed deliverables by posting them to the class website and delivering an ignite-style presentation to the class (and if you’re curious, all learning contracts, project deliverables, and public discussion can be see on the &lt;a href=&quot;https://island.byu.edu/unclass/content/winter-2009-projects&quot;&gt;class website&lt;/a&gt;).&lt;/p&gt;
  3166. &lt;h2 id=&quot;1-formation-of-learning-contract&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-formation-of-learning-contract&quot; aria-label=&quot;1 formation of learning contract permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Formation of Learning Contract&lt;/h2&gt;
  3167. &lt;p&gt;The project proposals were written by a student or a group of students, and defines what they wish to learn during the 3-4 week period of each project. Proposals can be a “learning project”, where students research a topic and write up a report, or a “building project”, where the student defines what they will create. Examples of learning projects include a &lt;a href=&quot;https://island.byu.edu/unclass/wiki/jee5-learning-write&quot;&gt;report on Java Enterprise Edition 5&lt;/a&gt;, or &lt;a href=&quot;https://island.byu.edu/cloud-computing/wiki/amazon-web-services-overview&quot;&gt;wiki pages describing Amazon web services.&lt;/a&gt; Building projects include making an &lt;a href=&quot;https://island.byu.edu/unclass/content/android-web-service-app-my-weather-running-and-full-source-code&quot;&gt;Android application&lt;/a&gt;, a &lt;a href=&quot;https://island.byu.edu/unclass/wiki/visual-lyrics-phase-2&quot;&gt;lyrics visualization plug-in for iTunes&lt;/a&gt;, or an &lt;a href=&quot;https://island.byu.edu/unclass/wiki/text-messaging-sms-gateway-interactivity&quot;&gt;SMS gateway&lt;/a&gt;. During the last week of each project, students start to prepare learning contracts for the next iteration.&lt;/p&gt;
  3168. &lt;p&gt;An obvious feature of the learning contract is that it is written entirely by the student. This allows for intrinsic motivation, as is illustrated in this student quote: “I was able to learn a lot about and use a bunch of technologies that I never would have been able to otherwise. I feel like I learned more than in a normal class, and because I got to choose what I wanted to learn, I would usually have trouble putting down my unclass project work to take care of my other homework.”&lt;/p&gt;
  3169. &lt;p&gt;The ambiguous nature of how much work should go into a contract was a source of frustration for students. One student describes the initial disorganization and lack of set expectation: “We didn’t have any initial standard to set our projects to. I wasn’t sure if I had to build something huge to be considered complete, and I wasn’t sure what was expected of the presentations. I chalk all of that up to a learning experience though. I wasn’t given a ceiling so I was inclined to take my projects as far as I could, primarily because they were fun.” This quote raises an interesting research question: If students (instead of teachers) are allowed to set a learning contract for a course, are the students more ambitious?&lt;/p&gt;
  3170. &lt;h2 id=&quot;2-students-incorporate-feedback-into-proposals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-students-incorporate-feedback-into-proposals&quot; aria-label=&quot;2 students incorporate feedback into proposals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Students Incorporate Feedback into Proposals.&lt;/h2&gt;
  3171. &lt;p&gt;Students post their learning contract to the class website to elicit feedback from the instructor and other students. This enables other students to see and learn from the feedback from the instructor. It also allows for the possible recruitment of other students to participate in the learning project. Once the contract is revised, the instructor approves the project and the students’ grade is bound to the satisfactory completion of the project.&lt;/p&gt;
  3172. &lt;h2 id=&quot;3-contract-fulfillment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-contract-fulfillment&quot; aria-label=&quot;3 contract fulfillment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Contract fulfillment&lt;/h2&gt;
  3173. &lt;p&gt;Students work individually or in teams to complete their learning contracts. They are challenged with the task of finding their own learning resources, and may ask the instructor and other students for direction. This is seen as a key feature of the design. As students find their own learning resources they are able to select resources which they find most helpful. Research suggests that students and experts possess different cognitive structures (Ericsson, Charness, Feltovich, &amp;#x26; Robert R. Hoffman, 2006). Experts are able compare a new situation to what they have experienced before through pattern recognition and are then able to recognize nuances and focus on important, rather than unessential elements.&lt;/p&gt;
  3174. &lt;p&gt;Novices do not yet have a rich experience base, and as such learning is sequential (R. R. Hoffman, Shadbolt, Burton, &amp;#x26; Klein, 1995). We suggest that as students possess similar cognitive architectures they are better able to relate to novices in their class and outside of their class. As the process of learning becomes “transparent” and open through the use of technology students are able to use resources created by other novices to grapple with new subjects.&lt;/p&gt;
  3175. &lt;h3 id=&quot;what-resources-did-the-students-use&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-resources-did-the-students-use&quot; aria-label=&quot;what resources did the students use permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What resources did the students use?&lt;/h3&gt;
  3176. &lt;p&gt;If, as we suggest, students are better able to learn from learning objects created by novices (instead of experts), allowing the students to incorporate and find their own learning objects is a logical design for a course. Yet, from our experience, doing this can be very difficult for teachers. Data from the students gave surprising results on what resources were used to complete projects, and how they were found.&lt;/p&gt;
  3177. &lt;p&gt;We were surprised by how many students used social networks to find learning resources. One student remarked, “Usually I would just start on a project, and when I came to the parts I didn’t know as much about I would search using Google and talk to friends who I thought might be knowledgeable on the subject.” As the course progressed student’s utilized the social network created through the class blog and wiki which was used to share knowledge that students had developed through the course of completing projects. This is illustrated through the following student comment.&lt;/p&gt;
  3178. &lt;blockquote&gt;
  3179. &lt;p&gt;It was very helpful to use island and the respective blogs resulting from other student’s completed projects as a resource for my projects. I could remember certain things that the other class members were doing from their projects and ask them questions via instant messaging or island [the course website]. Because the class members took ownership of their projects I found them all to be very knowledgeable about the subjects they studied. This helped build a very nice knowledge base.&lt;/p&gt;
  3180. &lt;/blockquote&gt;
  3181. &lt;p&gt;Another student mentioned other professors and students as well as people he had met on the internet through blogs as means through which he found educational resources. Most students mentioned that they contributed to the class blog as well as other students blogs, or their own blogs.&lt;/p&gt;
  3182. &lt;h2 id=&quot;4-share-learning-deliverable&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-share-learning-deliverable&quot; aria-label=&quot;4 share learning deliverable permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Share learning deliverable&lt;/h2&gt;
  3183. &lt;p&gt;Student’s share what they learn in two ways. First they post it on the course website so that other students can read and comment on it. Second, they create an “ignite presentation” which consists of a 5 minute power point presentation of 20 slides in which the slides automatically advance every 15 seconds. This is intended to be a rapid way of transmitting ideas in an engaging and entertaining manner.&lt;/p&gt;
  3184. &lt;p&gt;By making the student learning deliverables available publicly on the Internet, it encourages student accountability for learning and creates learning objects that classmates and future students can access and build upon for their learning projects. These public traces of work are also useful as mentioned because students, by seeing what other students are working on, learn which students are expert in what and are able to use them as learning resources for those subjects. Another advantage is it helps market the class, major, and university to current and potential students. As these future students come to explore the college or university they will be able to “lurk” and see the projects and potential colleagues which they would be working with.&lt;/p&gt;
  3185. &lt;h2 id=&quot;assessment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#assessment&quot; aria-label=&quot;assessment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Assessment&lt;/h2&gt;
  3186. &lt;p&gt;Given the unusual nature of the class, assessment was handled differently. The majority (70%) of the points came from completely the contract as agreed upon in the learning contract. The remainder of the points were awarded for either extra work done on projects or where students helped other students in some way. This following is &lt;a href=&quot;https://island.byu.edu/unclass/wiki/unclasssyllabus&quot;&gt;the assessment portion of the class syllabus&lt;/a&gt;:&lt;/p&gt;
  3187. &lt;ul&gt;
  3188. &lt;li&gt;70% of your grade will come from the completion of your project. Items to be graded include:&lt;/li&gt;
  3189. &lt;li&gt;Complete a contract that lists the work to be done (or learning to be achieved), the specific tasks or responsibilities of each student in the group, and any deliverables to be created.&lt;/li&gt;
  3190. &lt;li&gt;Complete an appropriately difficult project meeting the contract agreed upon&lt;/li&gt;
  3191. &lt;li&gt;Submit weekly progress updates&lt;/li&gt;
  3192. &lt;li&gt;Attendance at weekly group meetings&lt;/li&gt;
  3193. &lt;li&gt;Give an ignite presentation&lt;/li&gt;
  3194. &lt;li&gt;Attend and present at least one session at the twice per semester unconference&lt;/li&gt;
  3195. &lt;li&gt;20% of your grade will come from Learning 2.0 points. These include things such as:&lt;/li&gt;
  3196. &lt;li&gt;Reviewing and making comments on other students’ contracts&lt;/li&gt;
  3197. &lt;li&gt;Stories or blog posts to your project Island group&lt;/li&gt;
  3198. &lt;li&gt;Comments made on other users’ stories, blog posts, and comments&lt;/li&gt;
  3199. &lt;li&gt;Other indicators of interactions and work&lt;/li&gt;
  3200. &lt;li&gt;10% of your grade will come from Friend points.&lt;/li&gt;
  3201. &lt;li&gt;These are points that others can give to you (the student). They are totally at the discretion of the owner of the points. The teacher has a number of friend points he can assign, and each student has friend points he or she can give. Each student will be given 10 friends points per project. These points must be given to other students during the project or they are lost.&lt;/li&gt;
  3202. &lt;/ul&gt;
  3203. &lt;p&gt;Two students mentioned that the grading procedure was the worst part of the class: “There was no fair assessment of the work we did.” “The [biggest problem with the course] was trying to figure out a grading metric for the class.”&lt;/p&gt;
  3204. &lt;p&gt;As this was our first time involved with this type of course, we were unsure what would unfold. We were pleased to watch the class become a success, and see self-directed learning, and peer-teaching. Strong connections quickly formed between students which enabling them to access learning resources found throughout the community. We’re sure our course design could be significantly improved but we are thrilled it was successful as it was.&lt;/p&gt;
  3205. &lt;p&gt;Ericsson, K. A., Charness, N., Feltovich, P. J., &amp;#x26; Hoffman, R. R. (2006). The Cambridge Handbook of Expertise and Expert Performance (1st ed.). Cambridge University Press.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Organizing University Learning: Moving Beyond the Course to Micro-labs]]></title><description><![CDATA[University learning is centered on the course. A pattern for learning familiar to any current or past student. Students and teacher meet 1-…]]></description><link>https://bricolage.io/organizing-university-learning-moving-beyond-classroom/</link><guid isPermaLink="false">https://bricolage.io/organizing-university-learning-moving-beyond-classroom/</guid><pubDate>Wed, 21 Oct 2009 17:43:27 GMT</pubDate><content:encoded>&lt;p&gt;University learning is centered on the course. A pattern for learning familiar to any current or past student. Students and teacher meet 1-3 times per week for 8-12 weeks. There’s lectures, readings, papers, projects, quizzes, and tests.&lt;/p&gt;
  3206. &lt;p&gt;This, by and large, is an adequate pattern for many learning purposes. But no rational person would suggest this is the only workable solution or even what’s best, or adequate, for all purposes.&lt;/p&gt;
  3207. &lt;p&gt;There have been many alternative models proposed. One model I’ve taken a liking to was described in a recent journal article by Ann Pendleton-Jullian titled, &lt;a href=&quot;http://fourplusone.wordpress.com/design-education-and-innovation-ecotones/&quot;&gt;Design Education and Innovation Ecotones&lt;/a&gt;.&lt;/p&gt;
  3208. &lt;p&gt;Over the next couple of weeks I’ll be recycling material from a paper that &lt;a href=&quot;http://www.timolsen.com/&quot;&gt;Tim Olsen&lt;/a&gt; and I wrote this past summer (which was rejected for publication sadly — but luckily we have our own worldwide publication systems we can use as a fall-back :) on the micro-labs concept and our experience running and participating in class that used similar concepts.&lt;/p&gt;
  3209. &lt;h2 id=&quot;micro-labs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#micro-labs&quot; aria-label=&quot;micro labs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Micro Labs&lt;/h2&gt;
  3210. &lt;p&gt;Micro-labs are small learning communities centered around answering a question, not mastering standardized content/skills&lt;/p&gt;
  3211. &lt;p&gt;Micro-labs are a proposed university course architecture which supports and incorporates “web 2.0” informal learning principles, enabling students to entirely create their own curriculum with the goal of contributing all objects created by learning back to a learning community of practice, and an Internet audience. This course design seeks to harness both the student’s natural (intrinsic) desire to learn and the ease of access to knowledge created by advances in communication technologies.&lt;/p&gt;
  3212. &lt;p&gt;Micro-labs may be contrasted with a normal lab, which are found at most universities. Labs are large expensive operations that might take years to set-up and are expected to run for many years. Micro-labs, by contrast, are quick to set-up and cheap to run with as few as 2-3 students and a faculty adviser who meet in the Library. Many small, tightly networked micro-labs would collectively create an impact far beyond a few larger labs.&lt;/p&gt;
  3213. &lt;blockquote&gt;
  3214. &lt;p&gt;[these micro-labs are] easier and quicker than large centers to plan, build and reconfigure as projects shift and move in other directions, they facilitate grassroots creative research. These highly networked micro labs, focused on topics of deep inquiry, need not have dozens of participants sitting in the same room. A team of participants with the necessary skills might be distributed among several institutions, several countries, networked digitally and through ongoing academic relationships…Because they are networked, a single micro-lab’s reach extends beyond the team itself or the duration of a specific project. When the opportunity arises, these micro-labs can coalesce into one larger lab with tremendous diversity and richness of talent. Breaking apart again, they may redistribute talent and resources. Analogous to the way ‘process networks’ mobilize highly specialized small companies across an extended integrated design and manufacturing process, a network of micro-labs creates a horizontal rhizomic structure in which the whole is much greater than the sum of the parts. The networked micro-lab can adapt to new questions and opportunities from outside as well as inside the network. &lt;em&gt;(Pendleton-Jullian, 2009)&lt;/em&gt;&lt;/p&gt;
  3215. &lt;/blockquote&gt;
  3216. &lt;p&gt;Micro-labs are a simple and efficient mechanism for providing students informal learning opportunities in niches of their choices.&lt;/p&gt;
  3217. &lt;p&gt;In a micro-labs course, student teams outline a plan of study and learning deliverables with the help of an instructor. Each study is completed over the period of 2-6 weeks. Coached by an instructor, students utilize any content they wish, including Open Educational Resources, to learn material in an authentic learning environment (Herrington &amp;#x26; Oliver, 2000). The learning outcomes consist of deliverables, which are typically given to the community, including blog posts, tutorials, software tools, and conference presentations.&lt;/p&gt;
  3218. &lt;p&gt;Micro-labs courses promise many benefits. In some universities 50 percent of enrollment is concentrated in only 25 of the largest classes (Graham &amp;#x26; Stacey, 2002). This suggests the high financial cost of serving students in smaller niche classes, which can be reduced through the use of micro-labs courses as one teacher can coach significantly more student-led learning teams and less building resources are needed. Self-adaptive learning benefits students as they are able to learn the material in the manner, and with the resources of their choice. Students are also able to learn from and contribute to a community of practice in which they may later be employed. In addition, micro-labs courses better prepare students for today’s highly competitive and rapidly changing workplace, as they develop experience in directing their own learning.&lt;/p&gt;
  3219. &lt;h3 id=&quot;micro-labs-as-a-class&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#micro-labs-as-a-class&quot; aria-label=&quot;micro labs as a class permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Micro-labs as a Class&lt;/h3&gt;
  3220. &lt;p&gt;A normal class defines both the required learning outcomes and the required inputs (the homework, projects, group assignments etc.) that students must experience in order to (hopefully) arrive at the required outcomes. In other words, the professor decides, not only &lt;em&gt;what&lt;/em&gt; the students should learn but also &lt;em&gt;how&lt;/em&gt; they should learn.&lt;/p&gt;
  3221. &lt;p&gt;This factory model for education is growing increasingly untenable as the world grows more complex. Today’s students graduate into a world of far greater uncertainty and far greater diversity as the formerly monolithic landscape dominated by a few large companies grows increasing fragmented and diversified. Our universities must help prepare students for many more types of career paths.&lt;/p&gt;
  3222. &lt;p&gt;The core idea is that micro-lab classes adapts to its learners instead of requiring its learners to adapt to the class. This is the central idea of many web 2.0 applications. Services such as Twitter and Flickr provide simple mechanisms that users can apply to meet a large number of needs. In a similar way, the micro-lab course provides an architecture for students to build learning communities and use learning objects of their choosing.&lt;/p&gt;
  3223. &lt;p&gt;Another model that’s helpful in understanding micro-lab classes is supply-push vs. demand-pull. Supply-push describes the traditional curriculum model, where faculty plan their courses to push knowledge to students through means such as textbooks or lectures. Demand-pull describes the type of learning typically done by extracurricular learners. For example, a person desiring more knowledge (demand) about RFID tags might search the Internet and pull information from various web pages.&lt;/p&gt;
  3224. &lt;p&gt;A micro-lab class is a demand-pull not supply-push type class. Students decide what they want to learn and pull in content as needed and ask questions to different learning communities as needed. Supply-push models work best when resources are scarce, such as when professors are the sole source of information. Demand-pull models seem best when resources are abundant. Today’s Internet provides a tidal wave of information that learners can access.&lt;/p&gt;
  3225. &lt;p&gt;Brown and Adler state:&lt;/p&gt;
  3226. &lt;blockquote&gt;
  3227. &lt;p&gt;The demand-pull approach is based on providing students with access to rich (sometimes virtual) learning communities built around a practice. It is passion-based learning, motivated by the student either wanting to become a member of a particular community of practice or just wanting to learn about, make, or perform something. Often the learning that transpires is informal rather than formally conducted in a structured setting. Learning occurs in part through a form of reflective practicum, but in this case the reflection comes from being embedded in a community of practice that may be supported by both a physical and a virtual presence and by collaboration between newcomers and professional practitioners/scholars.&lt;/p&gt;
  3228. &lt;/blockquote&gt;
  3229. &lt;p&gt;In my next post, I’ll describe a micro-lab class we ran at BYU.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Learning in the open]]></title><description><![CDATA[I’ve been thinking a lot lately about the power of transparent learning or learning in the open. With blogs, twitter, wikis, and other…]]></description><link>https://bricolage.io/learning-open/</link><guid isPermaLink="false">https://bricolage.io/learning-open/</guid><pubDate>Wed, 07 Oct 2009 17:28:58 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been &lt;a href=&quot;/when-doubt-make-it-public&quot;&gt;thinking a lot lately&lt;/a&gt; about the power of transparent learning or learning in the open. With blogs, twitter, wikis, and other social media tools, our ability to share what we’re learning with others has increased dramatically. The shift from learning in private to learning in public is dramatic and chaotic, much like swimming from the edge of a river into the fast flowing current. All of a sudden you’re being pushed and tumbled along much faster than before.&lt;/p&gt;
  3230. &lt;p&gt;I’m reading a book by Albert Bandura this semster called “Social Learning Theory.” Bandura was a psychologist in the mid to late 20th century who researched the role of &lt;a href=&quot;http://en.wikipedia.org/wiki/Albert_Bandura&quot;&gt;social modeling on human motivation, thought, and action&lt;/a&gt;. A lot of what I’m reading supports what I’ve experienced with learning in the open.&lt;/p&gt;
  3231. &lt;p&gt;Here’s some of what he wrote on social modeling:&lt;/p&gt;
  3232. &lt;blockquote&gt;
  3233. &lt;p&gt;Learning would be exceedingly laborious, not to mention hazardous, if people had to rely solely on the effects of their own actions to inform them what to do. Fortunately, most human behavior is learned observationally through modeling: from observing others one forms an idea of how new behaviors are performed, and on later occasions this coded information serves as a guide for action. Because people can learn from example what to do, at least in approximate form, before performing any behavior, they are spared needless errors.&lt;/p&gt;
  3234. &lt;/blockquote&gt;
  3235. &lt;p&gt;One of the best parts about being an entrepreneur in this day and age is the many great learning resources on the internet. My favorite place to hangout on the internet is &lt;a href=&quot;http://news.ycombinator.com/&quot;&gt;Hacker News&lt;/a&gt;. There hackers (the good type) and entrepreneurs share interesting news and opinion posts and have conversations about them. Almost everything I know about entrepreneurship has come from joining and participating and emulating others within that community of makers who, to an incredible extent, learn in the open.&lt;/p&gt;
  3236. &lt;p&gt;I started doing web development about three years ago — and at the time knew almost nothing really about building websites. But I made the decision then to join the Drupal community and learn web development using the Drupal social publishing platform. Since then I’ve learned an great deal about building sophisticated modern websites. I’ve been to two Drupal conferences and presented at both. I participated in the Google Summer of Code last year on a Drupal project. I’ve spent hundreds of hours reading blog posts from other Drupalers and hundreds more hours reading discussions between programmers about how to write different pieces of code studying how they think and solve technical problems. Almost everything I know about web development has come from my choice to involve myself in the Drupal community.&lt;/p&gt;
  3237. &lt;p&gt;The problem with many classes in the University and K-12 is that teachers (and students) forget that learning is much more than the acquisition of facts and figures — learning is the process of becoming something. It’s the the process of becoming a full member of a &lt;a href=&quot;http://en.wikipedia.org/wiki/Community_of_practice&quot;&gt;community of practice.&lt;/a&gt;&lt;/p&gt;
  3238. &lt;p&gt;To become a physicist one for sure must learn physics equations. But much more than that, the student must learn to &lt;em&gt;be&lt;/em&gt; a physicist — think and act like a physicist would. Approach problems like a physicist would.&lt;/p&gt;
  3239. &lt;p&gt;If teachers ask students to learn in the open — through blogging, editing wikis, public discussions, etc — the more advanced students will serve as models for the rest and the student’s progress at learning to become a chemist, a mathematician, a programmer, or whatever the community may be that they are trying to enter, will accelerate. The progress is even greater if teachers actively model the thinking and problem-solving skills of that community.&lt;/p&gt;
  3240. &lt;p&gt;&lt;a href=&quot;http://www.connectivism.ca/?p=122&quot;&gt;George Siemen’s explained the idea very well&lt;/a&gt; when he wrote, “Watching others learn is an act of learning.”&lt;/p&gt;
  3241. &lt;p&gt;He continued:&lt;/p&gt;
  3242. &lt;blockquote&gt;
  3243. &lt;p&gt;Let me explain. When someone decides to share their thoughts and ideas in a transparent manner, they become a teacher to those who are observing. Social technology — such as Twitter, blogs, Facebook — opens the door to sharing the process of learning, not only the final product.&lt;/p&gt;
  3244. &lt;/blockquote&gt;
  3245. &lt;p&gt;There’s a lot of promising educational ideas out there — but this one excites me probably the most of all of them. Why? because it’s so simple to implement. The teachers and students just have to do what they have been doing — but make it open. And then reap the benefits.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to create custom ical exports by category using Drupal and the Views and Calendar modules]]></title><description><![CDATA[Lately I’ve been helping out a web development team at BYU develop a new calendaring system in Drupal to replace our existing all-in-one…]]></description><link>https://bricolage.io/how-create-custom-ical-exports-category-using-drupal-and-views/</link><guid isPermaLink="false">https://bricolage.io/how-create-custom-ical-exports-category-using-drupal-and-views/</guid><pubDate>Tue, 06 Oct 2009 15:32:34 GMT</pubDate><content:encoded>&lt;p&gt;Lately I’ve been helping out a web development team at BYU develop a new calendaring system in Drupal to replace our &lt;a href=&quot;http://byunews.byu.edu/calendar/&quot;&gt;existing all-in-one calendar&lt;/a&gt;. It’s an ambitious project that’s leveraging quite a few different modules from the Drupalsphere.&lt;/p&gt;
  3246. &lt;p&gt;Some of the features include:&lt;/p&gt;
  3247. &lt;ul&gt;
  3248. &lt;li&gt;Import ical feeds.&lt;/li&gt;
  3249. &lt;li&gt;Filter events for display by event category&lt;/li&gt;
  3250. &lt;li&gt;Download customized ical feeds by category (i.e. Student wants to import just sport and academic events into his personal calendar).&lt;/li&gt;
  3251. &lt;li&gt;Hovering on event titles exposes tooltip (we’re using &lt;a href=&quot;http://www.lullabot.com/files/bt/bt-latest/DEMO/index.html&quot;&gt;Beautytips&lt;/a&gt;) with full event info&lt;/li&gt;
  3252. &lt;/ul&gt;
  3253. &lt;p&gt;Here’s a screenshot of the UI as of last night:&lt;/p&gt;
  3254. &lt;p&gt;&lt;span
  3255.      class=&quot;gatsby-resp-image-wrapper&quot;
  3256.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  3257.    &gt;
  3258.      &lt;a
  3259.    class=&quot;gatsby-resp-image-link&quot;
  3260.    href=&quot;/static/7f3f880e96b31454abaa8139c6b7538d/ea7fb/tooltip.png&quot;
  3261.    style=&quot;display: block&quot;
  3262.    target=&quot;_blank&quot;
  3263.    rel=&quot;noopener&quot;
  3264.  &gt;
  3265.    &lt;span
  3266.    class=&quot;gatsby-resp-image-background-image&quot;
  3267.    style=&quot;padding-bottom: 82.43243243243244%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAADJUlEQVR42oWT6XLbNhRG9f6P0TZt2jSp4zpe6n0c17J2W5a1VAslkZK4SKS4iYvoU4BWMml/tJz5BhfA3ANc3I8FxOf5IercYjoz8XWT1Fpihhv0KCJ0TRLXIAwdVhsHJ1pjLZdY5hLPifHtmLWX5oqTlIIEZi8vAuoT+AHOcIwrpLou6iYktGfikD6+Z6J7CyzfQNM0NHWGrXs4us9yFWIuA4miMBwOUJQxrVab53aH7mhEu9+n1+miKgpDsdds/8XVbY3bP2tcXJfp9QcMRwMGisidKnk8nij0RV5hNtfFiXOajw/UalWen55o1OsirvH01MrXqtUK9XqDu2KR+3KZ6WiKNpygKRrqaMyw22M8UjAMg4LtBpjWilq1SqVSoSwS5FjdzeX4RRLeaAhw+RN3tbc0u0csJh08Y0TkznkRT1cQwvP8PPn/VRYH16g/nPLY+o1295jtNsrfTsJyoJwEQZDf7Iuq8mY7yLfrUqVSifXaySGRcEGWZTlIjlI5MAxDLMvCXi3pjSbcPPT4LNQR3ZZrC91gvliwFHbRdWmhTQ7cxDFpmr7GUSxuu6XgBhFDw2NqR8zclLHwVkNdC7n0jECsJWjrGNWJxJig2iGpSPy2zH+UvPQ23HXmnJXbnJWeKXdVWrM1Tc2hZ4ZMvQzVz9CCF7QQFHtDvLvVv4HZiyh56YZc17ucFuuc3FY4vClzcFNl7/KeP4oP1Psan8X+9X2Lm0qbenfCNnuFZFv5dq9xus3yuGDYHu+Ozvlp/4T3x1e8/f2UXz6d8+bjCfsXdzmwWOtTb2rcV6eUHlX66wV1c8SzoxFvkxzoib+q44wpKDOLd4fn/Lh3zM8Hp7kkXEqCHxQDJ3i1RhJnjBcuXhzhhB6bNP5asuzwypuLP8Vy+PX4kjd7hwJ2xvcfDvjhw6GYH/Hd+wMuKi0GmsnCspHVKIZDkv5HUwzH56Mobf+yyFVNNqaZ2+ZcjDIudSY0RnrerPZ8zcAKhP/i13cTzdnuOp7s4oK/iZlYHgs3xgq36H6C4acYQSpiIS/J92aOy8JeoRka0cbb+TD5aiHpQ2nsvwG0apIot+sVQwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  3268.  &gt;&lt;/span&gt;
  3269.  &lt;img
  3270.        class=&quot;gatsby-resp-image-image&quot;
  3271.        alt=&quot;tooltip&quot;
  3272.        title=&quot;&quot;
  3273.        src=&quot;/static/7f3f880e96b31454abaa8139c6b7538d/fcda8/tooltip.png&quot;
  3274.        srcset=&quot;/static/7f3f880e96b31454abaa8139c6b7538d/12f09/tooltip.png 148w,
  3275. /static/7f3f880e96b31454abaa8139c6b7538d/e4a3f/tooltip.png 295w,
  3276. /static/7f3f880e96b31454abaa8139c6b7538d/fcda8/tooltip.png 590w,
  3277. /static/7f3f880e96b31454abaa8139c6b7538d/ea7fb/tooltip.png 788w&quot;
  3278.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  3279.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3280.        loading=&quot;lazy&quot;
  3281.        decoding=&quot;async&quot;
  3282.      /&gt;
  3283.  &lt;/a&gt;
  3284.    &lt;/span&gt;&lt;/p&gt;
  3285. &lt;p&gt;I wanted to blog about how we created our ical exports by category as I couldn’t find any documentation about this and it doesn’t work out of the box.&lt;/p&gt;
  3286. &lt;p&gt;The default view from Calendar includes an ical display. This, by default, filters ical feeds by date — e.g. only include events in the ical feed after a certain date. This works fine.&lt;/p&gt;
  3287. &lt;p&gt;The problem we ran into is how to filter the ical feed by taxonomy terms. In Views we created a taxonomy term filter and exposed that to users so they can created custom calendar views of different event categories. That worked wonderfully. The problem was that when you downloaded the ical feed from the filtered calendar view, it included all events, not just events from the categories you’d selected.&lt;/p&gt;
  3288. &lt;p&gt;After examining the url for the ical feed we found the problem.&lt;/p&gt;
  3289. &lt;p&gt;The default ical URL that’s generated looks like this:&lt;/p&gt;
  3290. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/aiocalendar/calendar/ical/2009-10?tid[2]=2&amp;amp;tid[1]=1&amp;amp;tid[3]=3&amp;amp;tid[4]=4&amp;amp;tid[5]=5&amp;amp;tid[6]=6&amp;amp;tid[7]=7&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  3291. &lt;p&gt;Views takes each url segment separated by a forward slash as arguments. &lt;code class=&quot;language-text&quot;&gt;calendar/ical&lt;/code&gt; tells views to return an ical representation of the calendar. &lt;code class=&quot;language-text&quot;&gt;2009-10&lt;/code&gt; tells views to only include events from October 2009 onward. But the next bit, &lt;code class=&quot;language-text&quot;&gt;?tid[2][2]=2&amp;amp;tid[1][1]=1&amp;amp;tid[3][3]=3&amp;amp;tid[4][4]=4&amp;amp;tid[5]=5&amp;amp;tid[6][5]=6&amp;amp;tid[7][6]=7&lt;/code&gt;, a list of term IDs that were currently active on the calendar view, weren’t working at helping Views produced a filtered ical feed.&lt;/p&gt;
  3292. &lt;p&gt;Digging into the taxonomy term argument, I discovered it expected arguments in the form of &lt;code class=&quot;language-text&quot;&gt;1+2+3&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;1,2,3&lt;/code&gt;. &lt;code class=&quot;language-text&quot;&gt;1+2+3&lt;/code&gt; meaning Views would return events that had terms &lt;code class=&quot;language-text&quot;&gt;1 OR 2 OR 3&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;1,2,3&lt;/code&gt; meaning Views would return events that had terms &lt;code class=&quot;language-text&quot;&gt;1 AND 2 AND 3&lt;/code&gt;. For example, &lt;code class=&quot;language-text&quot;&gt;aiocalendar/calendar/ical/2009-10/1+4+6&lt;/code&gt; would return an ical feed of all events from October 2009 onward that had term ids of &lt;code class=&quot;language-text&quot;&gt;1 or 4 or 6&lt;/code&gt;.&lt;/p&gt;
  3293. &lt;p&gt;I jumped to the command line and tested my theory by using wget and some handcrafted urls and it worked! The ical feeds I was getting only included events from categories I included as arguments in the URL.&lt;/p&gt;
  3294. &lt;p&gt;Now the trick was to override the ical url generated to replace it with one in the correct format. I found the theme function in the Calendar module where the the ical feed icon was generated, copied that to my module, and rewrote the url using some regex kungfu (read more &lt;a href=&quot;http://drupal.org/node/11811&quot;&gt;on overriding theme functions&lt;/a&gt; in the &lt;a href=&quot;http://drupal.org/handbooks&quot;&gt;Drupal handbook&lt;/a&gt;).&lt;/p&gt;
  3295. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
  3296. &lt;span class=&quot;token comment&quot;&gt;/*
  3297. * Override theme_calendar_ical_icon() so we can override the url produced.
  3298. */&lt;/span&gt;
  3299. &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;phptemplate_calendar_ical_icon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  3300.  &lt;span class=&quot;token comment&quot;&gt;// Pull out array of Term IDs from the url.&lt;/span&gt;
  3301.  &lt;span class=&quot;token variable&quot;&gt;$search&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;preg_match_all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;/tid\[([0-9])*\]/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$matches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3302.  &lt;span class=&quot;token variable&quot;&gt;$tids&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$matches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3303.  
  3304.  &lt;span class=&quot;token comment&quot;&gt;// Grab url stem, we&apos;ll add the Term ID arguments back in a bit.&lt;/span&gt;
  3305.  &lt;span class=&quot;token variable&quot;&gt;$search&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;preg_match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;/(.*ical\/)20[0-9]{2}-.*/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$url_stem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3306.  
  3307.  &lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$url_stem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3308.  
  3309.  &lt;span class=&quot;token comment&quot;&gt;// Views arguments treat a &quot;+&quot; between arguments as OR.&lt;/span&gt;
  3310.  &lt;span class=&quot;token comment&quot;&gt;// So we&apos;re crafting an argument that asks for all events which match one of the&lt;/span&gt;
  3311.  &lt;span class=&quot;token comment&quot;&gt;// term IDs.&lt;/span&gt;
  3312.  &lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$tids&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$tid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  3313.    &lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$tid&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;+&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3314.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  3315.  
  3316.  &lt;span class=&quot;token comment&quot;&gt;// Trim off extra +&lt;/span&gt;
  3317.  &lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;+&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3318.  
  3319.  
  3320.  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;image&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;drupal_get_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;date_api&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;/images/ical16x16.gif&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;Add to calendar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;Add to calendar&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  3321.    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;&amp;lt;div style=&quot;text-align:right&quot;&gt;&amp;lt;a href=&quot;&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;check_url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;&quot; class=&quot;ical-icon&quot; title=&quot;ical&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;&amp;lt;/a&gt;&amp;lt;/div&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  3322.  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  3323. &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  3324. &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  3325. &lt;p&gt;We’ll be releasing our calendar, custom code and all, as a feature on BYU’s own feature server once the new calendar is released to production. But you can grab a development copy of it now at &lt;a href=&quot;https://island.byu.edu/content/first-upload-calendar-feature&quot;&gt;https://island.byu.edu/content/first-upload-calendar-feature&lt;/a&gt;&lt;/p&gt;
  3326. &lt;p&gt;The BYU Drupal community is collaborating to improve our calendar feature as it solves nicely a common need on the many department web sites deployed on campus. If you’d like to join the &lt;a href=&quot;https://island.byu.edu/group/drupal-calendar&quot;&gt;Drupal Calendar group&lt;/a&gt; to participate, &lt;a href=&quot;mailto:mathews.kyle@gmail.com&quot;&gt;contact me&lt;/a&gt;, and I’ll create an account for you on our groups site.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[When in Doubt, Make it Public]]></title><description><![CDATA[I recently (re)read a great post on Coding Horror which pointed me towards an article by Jason Kottke who noted that many successful web2.…]]></description><link>https://bricolage.io/when-doubt-make-it-public/</link><guid isPermaLink="false">https://bricolage.io/when-doubt-make-it-public/</guid><pubDate>Thu, 10 Sep 2009 00:15:20 GMT</pubDate><content:encoded>&lt;p&gt;I recently (re)read a &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000840.html&quot;&gt;great post on Coding Horror&lt;/a&gt; which pointed me towards an article by &lt;a href=&quot;http://www.kottke.org/07/03/public-and-permanent/&quot;&gt;Jason Kottke who noted that many successful web2.0 projects&lt;/a&gt; are a result of taking “something that everyone does with their friends and make it public and permanent. (Permanent as in permalinked.)”&lt;/p&gt;
  3327. &lt;p&gt;Some examples:&lt;/p&gt;
  3328. &lt;blockquote&gt;
  3329. &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://blogger.com&quot;&gt;Blogger&lt;/a&gt; = public email messages.&lt;/strong&gt; (1999) Instead of “Dear Bob, Check out this movie.” it’s “Dear People I May or May Not Know Who Are Interested in Film Noir, check out this movie. If you like it, maybe we can be friends.”&lt;/p&gt;
  3330. &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://flickr.com&quot;&gt;Flickr&lt;/a&gt; = public photo sharing.&lt;/strong&gt; (2004) Flickr co-founder Caterina Fake said in a recent interview: “When we started the company, there were dozens of other photosharing companies such as Shutterfly, but on those sites there was no such thing as a public photograph — it didn’t even exist as a concept — so the idea of something ‘public’ changed the whole idea of Flickr.”&lt;/p&gt;
  3331. &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://youtube.com&quot;&gt;YouTube&lt;/a&gt; = public home videos.&lt;/strong&gt; (2005) Bob Saget was onto something.&lt;/p&gt;
  3332. &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; = public IM.&lt;/strong&gt; (2006) I don’t think it’s any coincidence that one of the people responsible for Blogger is also responsible for Twitter.&lt;/p&gt;
  3333. &lt;/blockquote&gt;
  3334. &lt;p&gt;I love these examples because that’s exactly the same thing I’m trying to do with the social learning platform I’m building. Taking what was previously private (classroom discussions/instruction, hallway debate) and making it public, open, and permanent.&lt;/p&gt;
  3335. &lt;p&gt;This is has many many powerful effects (all of which I won’t mention right now). But one quick recent example of this principle.&lt;/p&gt;
  3336. &lt;p&gt;One of the classes at BYU using Island this semester is ISys 401 Systems Analysis. The teacher recently got an email from a student — and instead of answering the question through email, he decided to &lt;a href=&quot;https://island.byu.edu/content/hw-3-backlog-question&quot;&gt;make his answer public and post it to the class group.&lt;/a&gt;&lt;/p&gt;
  3337. &lt;p&gt;The student wrote:&lt;/p&gt;
  3338. &lt;blockquote&gt;
  3339. &lt;p&gt;Question:&lt;/p&gt;
  3340. &lt;p&gt;Dr. Liddle,&lt;/p&gt;
  3341. &lt;p&gt;I have read the scrum guide that is listed in the course schedule, and even looked up on wikipedia what a backlog is, but I still don’t understand what exactly you want us to do for homework 3. What do you mean by create a backlog of user stories from 401? If you could even point me in the direction of where to find a more precise definition on what a backlog, then that would be helpful as well.&lt;/p&gt;
  3342. &lt;p&gt;Thank you&lt;/p&gt;
  3343. &lt;p&gt;[Member of the ISys Core]&lt;/p&gt;
  3344. &lt;/blockquote&gt;
  3345. &lt;p&gt;Then Dr. Liddle went on to answer the question.&lt;/p&gt;
  3346. &lt;p&gt;Whether Dr. Liddle answered the student’s question through email or through posting it to the class group — the action had the same effect — the original student’s question was answered. But what else happened as a result of making it public?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Deploying Social Software in Universities: Go Broad then Deep]]></title><description><![CDATA[Michael Idinopolus wrote an intriguing post over on his excellent blog yesterday titled ”Enterprise 2.0: Skip the Pilot.” I thought I’d…]]></description><link>https://bricolage.io/deploying-social-software-universities-broad-then-deep/</link><guid isPermaLink="false">https://bricolage.io/deploying-social-software-universities-broad-then-deep/</guid><pubDate>Wed, 02 Sep 2009 23:53:44 GMT</pubDate><content:encoded>&lt;p&gt;Michael Idinopolus wrote an intriguing post over on &lt;a href=&quot;http://michaeli.typepad.com/my_weblog/&quot;&gt;his excellent blog&lt;/a&gt; yesterday titled ”&lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/08/enterprise-20-skip-the-pilot.html&quot;&gt;Enterprise 2.0: Skip the Pilot.&lt;/a&gt;”&lt;/p&gt;
  3347. &lt;p&gt;I thought I’d repeat some of his arguments because it agrees nicely with an argument I’ve been formulating lately regarding deployment strategy for social learning software within higher education.&lt;/p&gt;
  3348. &lt;p&gt;But first to his article:&lt;/p&gt;
  3349. &lt;blockquote&gt;
  3350. &lt;p&gt;There’s an orthodoxy in Enterprise 2.0 circles about how you’re supposed to run an implementation. The orthodoxy goes something like this: Start with small-scale pilots, define your business objectives, watch the pilots closely, evaluate their success, make a go/no-go decision.&lt;/p&gt;
  3351. &lt;p&gt;As far as I can tell it’s what everyone thinks. In fact, it’s what I used to think. Unfortunately, it’s dead wrong. The orthodoxy is wrong for a very simple reason: Size matters. By constraining the size of your pilot, you significantly alter the way your company can and will use the tools.&lt;/p&gt;
  3352. &lt;p&gt;I’m not opposed to pilots for most enterprise IT solutions. Companies like to pilot new technologies with small populations before they roll them out enterprise-wide. That approach makes a lot of sense for transactional systems like order management, project management, purchasing, ERP, and so on. By piloting with a small group, you reduce implementation risk. You get a read on the value of the solution, and you get feedback which you can use to make modifications while those modifications are still relatively easy and inexpensive.&lt;/p&gt;
  3353. &lt;p&gt;But social software is different from traditional IT. Traditional IT enables individuals to carry out well-defined, highly standardized transactions. Users go into the system to process transactions—to transfer funds, purchase supplies, track inventory, etc. The nature of these transactions, and the system’s ability to enable them, do not vary much according to the number of people using the system. Whether 100 people are entering orders or 10,000 people are entering orders, the transactions themselves doesn’t really change. What that means is that a representative small-scale sample is an accurate predictor of adoption and value at full scale.&lt;/p&gt;
  3354. &lt;p&gt;But Enterprise 2.0 tools are different from traditional IT systems. Traditional IT enables &lt;strong&gt;transactions&lt;/strong&gt;; Enterprise 2.0 enables &lt;strong&gt;interactions&lt;/strong&gt;.&lt;/p&gt;
  3355. &lt;p&gt;…&lt;/p&gt;
  3356. &lt;p&gt;That doesn’t mean small-scale Enterprise 2.0 pilots can’t succeed. They can, and many do. But even when pilots succeed, they have limited ability to predict how the organization goes on to use the capabilities once they are rolled out enterprise-wide. Pilots typically fall into the lower left-hand corner of the &lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/04/the-social-software-value-matrix.html&quot;&gt;Social Software Value Matrix&lt;/a&gt;: improve existing interactions within existing silos. That includes things like project team workspaces, departmental workspaces, and technical knowledgebases. When organizations really embrace Enterprise 2.0, however, they almost always play in multiple sections of the Value Matrix, launching solutions like collaborative intranets, ideation portals, private extranets, Those solutions, almost by definition, require scale.&lt;/p&gt;
  3357. &lt;p&gt;Scale is the oxygen that feeds collaboration. That’s why collaborative tools like Facebook, and Twitter have taken off so spectacularly on the public web: With over a billion people on the Internet, the opportunities for interpersonal interaction are unbelievably high.&lt;/p&gt;
  3358. &lt;/blockquote&gt;
  3359. &lt;p&gt;Ok, fair enough. Social software needs other people in order to work properly (imagine Facebook if it was just you there). What does that have to do with deploying a social learning platform at a university?&lt;/p&gt;
  3360. &lt;p&gt;Before I answer that question, let me step back and explain a bit about what I mean by a social learning platform.&lt;/p&gt;
  3361. &lt;p&gt;First it’s designed to support social learning meaning it’s designed to help/encourage/faciliate conversations and connections between like-minded learners as they pursue their personal learning goals.&lt;/p&gt;
  3362. &lt;p&gt;Second it’s a platform giving the software two qualities:&lt;/p&gt;
  3363. &lt;ol&gt;
  3364. &lt;li&gt;It gives people the freedom and tools to build onto the platform — in the case of a social learning platform, people will primarily build learning communities.&lt;/li&gt;
  3365. &lt;li&gt;&lt;a href=&quot;http://andrewmcafee.org/2006/05/the_mechanisms_of_online_emergence/&quot;&gt;New patterns or structure will emerge within the system&lt;/a&gt; that are unplanned and undirected&lt;/li&gt;
  3366. &lt;/ol&gt;
  3367. &lt;p&gt;The social learning platform should improve existing interactions and create new interactions within classrooms, within majors, and between multiple institutions such as nearby universities or members of the community (or in other words, create value in each of the quadrants within the &lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/04/the-social-software-value-matrix.html&quot;&gt;social software value matrix&lt;/a&gt;).&lt;/p&gt;
  3368. &lt;p&gt;My best stab at creating this tool can be seen at &lt;a href=&quot;https://island.byu.edu&quot;&gt;https://island.byu.edu&lt;/a&gt;—a tool I’ve been building for some time with the help of many others. Island provides simple tools to improve existing interactions and enable new interactions within classrooms, across campus, and eventually will have tools that will allow learners from multiple campuses interact.&lt;/p&gt;
  3369. &lt;p&gt;So how should such a tool be deployed at a university?&lt;/p&gt;
  3370. &lt;p&gt;Michael Idinopolus answers that question in a second article ”&lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/09/launching-at-scale-.html&quot;&gt;Launch E2.0 Broad, Then Go Deep&lt;/a&gt;” where he references &lt;a href=&quot;http://ross.typepad.com/blog/2006/04/power_law_of_pa.html&quot;&gt;Ross Mayfield’s power law of participation graph&lt;/a&gt;.&lt;/p&gt;
  3371. &lt;p&gt;&lt;a href=&quot;http://michaeli.typepad.com/my_weblog/2009/09/launching-at-scale-.html&quot;&gt;&lt;span
  3372.      class=&quot;gatsby-resp-image-wrapper&quot;
  3373.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; &quot;
  3374.    &gt;
  3375.      &lt;a
  3376.    class=&quot;gatsby-resp-image-link&quot;
  3377.    href=&quot;/static/8978482c953b5a26dd03abd0060a0635/41099/power-law-participation.jpg&quot;
  3378.    style=&quot;display: block&quot;
  3379.    target=&quot;_blank&quot;
  3380.    rel=&quot;noopener&quot;
  3381.  &gt;
  3382.    &lt;span
  3383.    class=&quot;gatsby-resp-image-background-image&quot;
  3384.    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAe8mqacpFn//xAAZEAACAwEAAAAAAAAAAAAAAAABEAACIRT/2gAIAQEAAQUCXNRbAc//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwFH/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAECAQE/AVy1v//EABgQAAIDAAAAAAAAAAAAAAAAAAEQIUGR/9oACAEBAAY/AleqAv/EABsQAQEBAAIDAAAAAAAAAAAAAAEAETFBUZHB/9oACAEBAAE/IUOW3ET15lXe8TXZPoYQDf/aAAwDAQACAAMAAAAQLP8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EA2Rf//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxDFsIX/xAAdEAEBAAIBBQAAAAAAAAAAAAABEQAxIUFhgaHR/9oACAEBAAE/EC9C98YAx07fiYqgVYcD1j0HJpWzxq5a7HbFzaAEc//Z&apos;); background-size: cover; display: block;&quot;
  3385.  &gt;&lt;/span&gt;
  3386.  &lt;img
  3387.        class=&quot;gatsby-resp-image-image&quot;
  3388.        alt=&quot;power law participation&quot;
  3389.        title=&quot;&quot;
  3390.        src=&quot;/static/8978482c953b5a26dd03abd0060a0635/41099/power-law-participation.jpg&quot;
  3391.        srcset=&quot;/static/8978482c953b5a26dd03abd0060a0635/a80bd/power-law-participation.jpg 148w,
  3392. /static/8978482c953b5a26dd03abd0060a0635/1c91a/power-law-participation.jpg 295w,
  3393. /static/8978482c953b5a26dd03abd0060a0635/41099/power-law-participation.jpg 500w&quot;
  3394.        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
  3395.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3396.        loading=&quot;lazy&quot;
  3397.        decoding=&quot;async&quot;
  3398.      /&gt;
  3399.  &lt;/a&gt;
  3400.    &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
  3401. &lt;p&gt;The key insight contained in the graph is that for different ways of participating in a social software environment there are different thresholds for joining. Reading takes little skill and effort while editing a wiki takes comparatively considerable more effort and community knowledge.&lt;/p&gt;
  3402. &lt;p&gt;From this we’d also expect that the higher the threshold to participate in a certain way, the fewer people will participate. Survey results prove that out. While &lt;a href=&quot;http://www.harrisinteractive.com/harris_poll/index.asp?PID=879&quot;&gt;roughly 20-30% of Americans regularly read blogs&lt;/a&gt;, only &lt;a href=&quot;http://www.pewinternet.org/Commentary/2005/May/New-data-on-blogs-and-blogging.aspx&quot;&gt;6% of Americans have created a blog&lt;/a&gt; (and probably considerably less regularly write updates).&lt;/p&gt;
  3403. &lt;p&gt;I’ve seen the same sort of behavior on Island. I &lt;a href=&quot;/power-law-graphs-from-classroom-community-website&quot;&gt;wrote a post on this subject last year&lt;/a&gt; where I noticed a power law that emerged when I graphed the students participation in a number of different ways. I only posted two graphs in that post but the same relationship showed up across all types of participation. A few participated a great deal but most didn’t.&lt;/p&gt;
  3404. &lt;p&gt;Returning to Michael’s article:&lt;/p&gt;
  3405. &lt;blockquote&gt;
  3406. &lt;p&gt;Historically, Enterprise 2.0 implementations have focused on collaborative tools [with] fairly high participation thresholds: blogs and wikis. That’s not by design, it’s by default. Until recently, those were the only Enterprise 2.0 tools that showed potential for high-value business use.&lt;/p&gt;
  3407. &lt;p&gt;Today, Enterprise 2.0 participation is a whole different game. At the “low threshold” end of the curve, we have low-engagement tools like social messaging (internal “Twitter”), social bookmarking. By leading your implementation with these low-threshold tools, you lower the risk of implementation while still launching at the scale required for success.&lt;/p&gt;
  3408. &lt;/blockquote&gt;
  3409. &lt;p&gt;He goes on to describe an enthusiastic response to a recent webinar on his companies internal “twitter” app &lt;a href=&quot;http://www.socialtext.com/products/signals.php&quot;&gt;Signals&lt;/a&gt;.&lt;/p&gt;
  3410. &lt;blockquote&gt;
  3411. &lt;p&gt;Signals was not just a useful tool, it was also a stepping stone that helped participants move to the right on the Participation curve (see image above). As participants started to get the hang of Signals, many started to ask about Socialtext’s other collaborative features: What are workspaces? How do I use the Dashboard? How do I look up an individual?&lt;/p&gt;
  3412. &lt;/blockquote&gt;
  3413. &lt;p&gt;From what I’ve seen, most social software deployments in universities have preceded in a similar way to what Michael describes — deploy high-value learning tools such as blogs and wikis in a small-pilot, evaluate their success, and make a go/no-go decision.&lt;/p&gt;
  3414. &lt;p&gt;I think this is wrong for the same reasons Michael lists. First, a social learning platform needs large numbers of learners to work (“Scale is the oxygen that feeds collaboration”) and second, blogs and wikis are difficult tools to use — both the steepness of learning curve and the amount of time required to use them effectively. Relatively few students will ever use them to the extent that some of us wish.&lt;/p&gt;
  3415. &lt;p&gt;In addition, I think we (grizzled web-heads who readily see the value of social software tools such as wikis and blogs in the classroom) frequently underestimate how scary and confusing these tools are to most teachers. These higher-threshold tools — they don’t get in general and definitely don’t get in specific, that is, how to use them in their classroom.&lt;/p&gt;
  3416. &lt;p&gt;With Island we’ve focused on the bottom of the participation curve — enabling simple group-based conversations through email. For the past year we’ve been building and testing Island’s infrastructure within the Information Systems major. We’re now focused on achieving scale by inviting the rest of the BYU campus. Once we’ve achieved scale, we’ll (to quote Michael again) “deliver deep value by following up with local champions [deans, teachers, students] who want to invest time and effort in more robust, group-specific forms of collaboration.”&lt;/p&gt;
  3417. &lt;p&gt;This, I think, is the correct sequence. Launch simply and broadly. Let students and teachers adjust to having a web-enabled learning environment. Then go deep by building into the social learning platform higher-value tools such as blogs, wikis, and other collaborative learning tools and workflows.&lt;/p&gt;
  3418. &lt;p&gt;Your thoughts?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Reflections on OpenEd09]]></title><description><![CDATA[Wow, what a great conference. And talk about intimidation. I had a mild to strong case at different times of Chris Lott’s imposter syndrome…]]></description><link>https://bricolage.io/reflections-opened09/</link><guid isPermaLink="false">https://bricolage.io/reflections-opened09/</guid><pubDate>Tue, 25 Aug 2009 17:12:26 GMT</pubDate><content:encoded>&lt;p&gt;Wow, what a great conference. And talk about intimidation. I had a mild to strong case at different times of &lt;a href=&quot;http://www.darcynorman.net/2009/08/20/on-the-open-education-experience/#comment-195623&quot;&gt;Chris Lott’s imposter syndrome&lt;/a&gt;. So many brilliant thinkers. But I’m definitely glad I made the effort to go as I learned a great deal. Many of my assumptions were confirmed and many gaps in my understanding were exposed. So an excellent time of growth and learning.&lt;/p&gt;
  3419. &lt;p&gt;The following is a few of the thoughts I had during the conference.&lt;/p&gt;
  3420. &lt;p&gt;I loved the case studies some teachers presented about successes they’ve had in integrating social media tools into their classroom. These are brilliant teachers, visionary, willing to go the extra mile for their students, technologically adept — and really are showing the way to the future for the rest of us. But my concern is that as ed tech designers and creators that we’ll be misled by these examples.&lt;/p&gt;
  3421. &lt;p&gt;These teachers are like a great pottery creator who makes brilliant one-off pieces of pottery art. Beautiful and inspiring but utterly useless at providing plates and bowls for the masses. Great teachers don’t scale. Their methods are incomprehensible and unusable by the average (or below-average teacher) which most students suffer with through their college experience.&lt;/p&gt;
  3422. &lt;p&gt;A few quick cherry-picked (probably inaccurate) quotes from memory. &lt;a href=&quot;http://openedconference.org/archives/549&quot;&gt;John Maxwell gave a session describing how he uses Wikis&lt;/a&gt; to support Simon Fraser University Masters program in Publishing. He said he loved using wikis because the interface is just text. He could just edit different parts of the interface to quickly change it’s functionality. He described the technology, a plone-based wiki, as one of the less common wiki platforms but as being very powerful and versatile. I understood everything he said — but that’s because I’ve spent a considerable amount of time designing, using, and reading about wikis. But to your average professor, all of that would of been complete nonsense. Wikis? Textual interfaces? Plone? Another example, in David Wiley’s classes, students write blog posts and he collects these blog posts by using Google Reader — again, brilliant solution but how many teachers have a clue what a blog reader is, or for that matter, what a blog is. I love what these teachers are doing but the current method of using a grab-bag of free web2.0 social media tools to drive classroom learning is completely unusable for the vast majority of teachers and students.&lt;/p&gt;
  3423. &lt;p&gt;The best teachers don’t realize how poor of teachers some of their colleagues are. Only students like me who have to sit through their classes can fully appreciate how wide the chasm is that separates the visionary resourceful teachers from the norm.&lt;/p&gt;
  3424. &lt;p&gt;What we need to do is to study these visionary teachers, &lt;a href=&quot;/presentation-opened-2009&quot;&gt;identify the successful patterns they’re using, and design social learning technology which implements these patterns&lt;/a&gt; in a vastly simplified and consistent manner. Only then will these technologies and methods see large adoption across many universities around the world.&lt;/p&gt;
  3425. &lt;p&gt;The first few days at the conference I was somewhat worried — perhaps as a consequence of my imposter syndrome. I started wandering if someone, somewhere had already figured everything out. I thought, surely with all this intellectual lightening crackling around me every problems been solved by now — which troubled me as I’m starting a company to develop a social learning platform — a worthless business if the works already been done.&lt;/p&gt;
  3426. &lt;p&gt;But gradually, as the days went by, it dawned on me—everyone is as clueless as me! They’re has been brilliant insights made and illuminating experiments run — but things are still early. We’re still flailing around trying to figure things out. Which is good, I like to flail about experimenting with new ideas. That’s why I’m starting a new company in my apartment instead of sitting in a cubicle right now.&lt;/p&gt;
  3427. &lt;p&gt;It was really interesting to me how differently I approach problems from the vast majority of people there at OpenEd. I’m at heart an engineer and by training a business person. I like to understand problems then solve them — preferably by building something cool. So it was remarkable for me to listen to conversations and sessions at OpenEd given by people almost entirely from a humanities / educational background. They framed and dissected problems in entirely different ways than me. I thought to myself after some of the sessions that what the presenter spent 45 minutes discussing, if that material had been part of a presentation I delivered, I might of spent all of one slide and thirty seconds discussing the same subject. But all the same, the new perspectives I heard are very valuable and a very useful addition to my mental toolkit for attacking problems.&lt;/p&gt;
  3428. &lt;p&gt;Thanks again to all the organizers and participants who made the trip and time so worthwhile. I think it was a brilliant success for everyone involved.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Presentation from OpenEd 2009]]></title><description><![CDATA[I presented at the OpenEd Conference this year in Vancouver BC. Great fun. Video My section starts ~20 minutes in. Slides Resources listed…]]></description><link>https://bricolage.io/presentation-opened-2009/</link><guid isPermaLink="false">https://bricolage.io/presentation-opened-2009/</guid><pubDate>Thu, 13 Aug 2009 21:38:59 GMT</pubDate><content:encoded>&lt;p&gt;I presented at the OpenEd Conference this year in Vancouver BC. Great fun.&lt;/p&gt;
  3429. &lt;h3 id=&quot;video&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#video&quot; aria-label=&quot;video permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Video&lt;/h3&gt;
  3430. &lt;p&gt;My section starts ~20 minutes in.&lt;/p&gt;
  3431. &lt;p&gt;
  3432.  &lt;embed flashvars=&quot;loc=%2F&amp;amp;autoplay=false&amp;amp;vid=1978484&quot; width=&quot;480&quot; height=&quot;386&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; src=&quot;http://www.ustream.tv/flash/video/1978484&quot; type=&quot;application/x-shockwave-flash&quot; /&gt;
  3433. &lt;/p&gt;
  3434. &lt;h3 id=&quot;slides&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#slides&quot; aria-label=&quot;slides permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slides&lt;/h3&gt;
  3435. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 83.37236533957847%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;p&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/1857718&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt; &lt;/p&gt; &lt;/div&gt;
  3436. &lt;h3 id=&quot;resources-listed-in-the-presentation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#resources-listed-in-the-presentation&quot; aria-label=&quot;resources listed in the presentation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Resources listed in the presentation:&lt;/h3&gt;
  3437. &lt;ul&gt;
  3438. &lt;li&gt;“Here Comes Everyone” by Clay Shirky &lt;a href=&quot;http://www.amazon.com/Here-Comes-Everybody-Organizing-Organizations/dp/1594201536&quot;&gt;http://www.amazon.com/Here-Comes-Everybody-Organizing-Organizations/dp/1594201536&lt;/a&gt;&lt;/li&gt;
  3439. &lt;li&gt;“Linked: How Everything Is Connected to Everything Else and What It Means” by Albert-Laszlo Barabasi Excellent intro to science of networks&lt;/li&gt;
  3440. &lt;li&gt;Introduction to using patterns in web design — &lt;a href=&quot;http://37signals.com/papers/introtopatterns/&quot;&gt;http://37signals.com/papers/introtopatterns/&lt;/a&gt;&lt;/li&gt;
  3441. &lt;li&gt;“Designing for Social Traction” — &lt;a href=&quot;http://bokardo.com/archives/designing-for-social-traction-slide-deck/&quot;&gt;http://bokardo.com/archives/designing-for-social-traction-slide-deck/&lt;/a&gt;&lt;/li&gt;
  3442. &lt;li&gt;“Drupal for Education and E-Learning” by Bill Fitzgerald&lt;/li&gt;
  3443. &lt;li&gt;“The Art of the Community” — upcoming book by Ubuntu community manager — &lt;a href=&quot;http://www.artofcommunityonline.org/&quot;&gt;http://www.artofcommunityonline.org/&lt;/a&gt;&lt;/li&gt;
  3444. &lt;li&gt;“The Fifth Discipline: The Art &amp;#x26; Practice of The Learning Organization” by Peter Senge&lt;/li&gt;
  3445. &lt;li&gt;“The Only Sustainable Edge: Why Business Strategy Depends on Productive Friction and Dynamic Specialization” by John Hagel and John Seely Brown&lt;/li&gt;
  3446. &lt;li&gt;“Minds on Fire: Open Education, the Long Tail, and Learning 2.0” by John Seely Brown and Richard P. Adler &lt;a href=&quot;http://www.educause.edu/EDUCAUSE+Review/EDUCAUSEReviewMagazineVolume43/MindsonFireOpenEducationtheLon/162420&quot;&gt;http://www.educause.edu/EDUCAUSE+Review/EDUCAUSEReviewMagazineVolume43/MindsonFireOpenEducationtheLon/162420&lt;/a&gt;&lt;/li&gt;
  3447. &lt;li&gt;“Design Innovation and Innovation Ecotones” by Ann Pendleton-Jullian &lt;a href=&quot;http://president.asu.edu/node/705&quot;&gt;http://president.asu.edu/node/705&lt;/a&gt;&lt;/li&gt;
  3448. &lt;li&gt;“Building Web 2.0 Reputation Systems” — &lt;a href=&quot;http://buildingreputation.com/&quot;&gt;http://buildingreputation.com/&lt;/a&gt;&lt;/li&gt;
  3449. &lt;li&gt;“Enterprise 2.0: New Collaborative Tools for Your Organization’s Toughest Challenges” by Andrew McAfee&lt;/li&gt;
  3450. &lt;/ul&gt;
  3451. &lt;h3 id=&quot;social-software-patterns&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#social-software-patterns&quot; aria-label=&quot;social software patterns permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Social software Patterns&lt;/h3&gt;
  3452. &lt;ul&gt;
  3453. &lt;li&gt;“Designing Social Interfaces” — &lt;a href=&quot;http://www.designingsocialinterfaces.com/patterns.wiki/index.php?title=Main_Page&quot;&gt;http://www.designingsocialinterfaces.com/patterns.wiki/index.php?title=Main_Page&lt;/a&gt;&lt;/li&gt;
  3454. &lt;li&gt;“Community Design Patterns” — &lt;a href=&quot;http://www.slideshare.net/pecus/online-communities-design-patterns-255635&quot;&gt;http://www.slideshare.net/pecus/online-communities-design-patterns-255635&lt;/a&gt;&lt;/li&gt;
  3455. &lt;li&gt;“Social Software Pattern Language” — &lt;a href=&quot;http://wikis.sun.com/display/ASSPL/A+Social+Software+Pattern+Language&quot;&gt;http://wikis.sun.com/display/ASSPL/A+Social+Software+Pattern+Language&lt;/a&gt;&lt;/li&gt;
  3456. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Startup Chronicles #1]]></title><description><![CDATA[Running a startup is an interesting experience — alternatively terrifying and thrilling. Today I read an article that made me burst out…]]></description><link>https://bricolage.io/startup-chronicles-1/</link><guid isPermaLink="false">https://bricolage.io/startup-chronicles-1/</guid><pubDate>Mon, 27 Jul 2009 22:40:41 GMT</pubDate><content:encoded>&lt;p&gt;Running a startup is an interesting experience — alternatively terrifying and thrilling. Today I read an article that made me burst out laughing. Paul Graham, the startup guru and founder of &lt;a href=&quot;http://ycombinator.com/&quot;&gt;Y Combinator&lt;/a&gt; wrote:&lt;/p&gt;
  3457. &lt;blockquote&gt;
  3458. &lt;p&gt;A company tends to feel rather theoretical when you first start it. It’s legally a company, but you feel like you’re lying when you call it one.&lt;/p&gt;
  3459. &lt;/blockquote&gt;
  3460. &lt;p&gt;That so perfectly describes how I feel. I tell people I’m running a company but the reality is I’m a poor college student working from a small messy apartment trying to turn vaporware into sell-able software. Shouldn’t a company have employees? a product? offices? revenue even? :)&lt;/p&gt;
  3461. &lt;p&gt;Read the rest:&lt;/p&gt;
  3462. &lt;p&gt;&lt;a href=&quot;http://paulgraham.com/ramenprofitable.html&quot;&gt;Ramen Profitable&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Video and slides from my presentation at Druplacon DC 2009]]></title><description><![CDATA[I had the amazing opportunity to present this past March at Drupalcon DC 2009 on my research and work on https://island.byu.edu It was by…]]></description><link>https://bricolage.io/video-and-slides-my-presentation-druplacon-dc-2009/</link><guid isPermaLink="false">https://bricolage.io/video-and-slides-my-presentation-druplacon-dc-2009/</guid><pubDate>Sat, 11 Apr 2009 15:17:27 GMT</pubDate><content:encoded>&lt;p&gt;I had the amazing opportunity to present this past March at &lt;a href=&quot;http://dc2009.drupalcon.org/&quot;&gt;Drupalcon DC 2009&lt;/a&gt; on my research and work on &lt;a href=&quot;https://island.byu.edu&quot;&gt;https://island.byu.edu&lt;/a&gt;&lt;/p&gt;
  3463. &lt;p&gt;It was by far the largest crowd I’ve ever presented (400) and the longest (1 hour) but I think it turned out pretty well — no rotten tomatoes anyways — and I really enjoyed the experience. The &lt;a href=&quot;http://dc2009.drupalcon.org/session/building-advanced-social-networks-large-us-university&quot;&gt;bulk of my talk&lt;/a&gt; was on how to design effective effective social networks pulling from my blog posts earlier this year on &lt;a href=&quot;/how-design-social-networking-site-using-social-objects&quot;&gt;building social networks&lt;/a&gt; with &lt;a href=&quot;/what-are-social-objects&quot;&gt;social objects&lt;/a&gt;.&lt;/p&gt;
  3464. &lt;h3 id=&quot;slides&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#slides&quot; aria-label=&quot;slides permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slides:&lt;/h3&gt;
  3465. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 83.37236533957847%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;p&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/1108515&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt; &lt;/p&gt; &lt;/div&gt;
  3466. &lt;h3 id=&quot;video&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#video&quot; aria-label=&quot;video permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Video:&lt;/h3&gt;
  3467. &lt;p&gt;The session was also recorded. You can &lt;a href=&quot;http://www.archive.org/details/DrupalconDc2009-BuildingAdvancedSocialNetworksAtALargeU.s.University&quot;&gt;download the video at archive.org.&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Video and pictures from my presentation at Ignite]]></title><description><![CDATA[Video from Ignite SLC 2 was posted earlier this week. You can watch all the videos at the Ignite SLC website. I’ve embedded below the video…]]></description><link>https://bricolage.io/video-and-pictures-my-presentation-ignite/</link><guid isPermaLink="false">https://bricolage.io/video-and-pictures-my-presentation-ignite/</guid><pubDate>Sat, 04 Apr 2009 00:44:22 GMT</pubDate><content:encoded>&lt;p&gt;Video from &lt;a href=&quot;http://www.ignitesaltlake.com&quot;&gt;Ignite SLC 2&lt;/a&gt; was posted earlier this week. You can &lt;a href=&quot;http://www.ignitesaltlake.com/ignite/index.cfm/watch-the-presentations/&quot;&gt;watch all the videos at the Ignite SLC website&lt;/a&gt;. I’ve embedded below the video of my presentation on building social networks at universities.&lt;/p&gt;
  3468. &lt;p&gt;Also, check out some &lt;a href=&quot;http://www.flickr.com/photos/calanan/3389617343/in/set-72157615984649932/&quot;&gt;pictures taken of me in the Ignite SLC Flickr photostream&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ignite Salt Lake 2 Presentation]]></title><description><![CDATA[I had a great time speaking last night at Ignite Salt Lake 2 on what we’re doing down at BYU with social networking in the classroom. Thanks…]]></description><link>https://bricolage.io/ignite-salt-lake-2-presentation/</link><guid isPermaLink="false">https://bricolage.io/ignite-salt-lake-2-presentation/</guid><pubDate>Fri, 27 Mar 2009 18:07:51 GMT</pubDate><content:encoded>&lt;p&gt;I had a great time speaking last night at &lt;a href=&quot;http://www.ignitesaltlake.com/ignite/index.cfm&quot;&gt;Ignite Salt Lake 2&lt;/a&gt; on what we’re doing down at BYU with social networking in the classroom. Thanks to all the organizers, sponsors, and other presenters!&lt;/p&gt;
  3469. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 83.37236533957847%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;p&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/1211626&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt; &lt;/p&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[How to design a social networking site using social objects]]></title><description><![CDATA[This is the second in a series of articles I’m writing to help me prep for my session next week at Drupalcon. The first article was my…]]></description><link>https://bricolage.io/how-design-social-networking-site-using-social-objects/</link><guid isPermaLink="false">https://bricolage.io/how-design-social-networking-site-using-social-objects/</guid><pubDate>Fri, 27 Feb 2009 18:20:59 GMT</pubDate><content:encoded>&lt;p&gt;This is the second in a series of articles I’m writing to help me prep for my &lt;a href=&quot;http://dc2009.drupalcon.org/session/building-advanced-social-networks-large-us-university&quot;&gt;session next week at Drupalcon&lt;/a&gt;. The first article was my attempt to &lt;a href=&quot;/what-are-social-objects&quot;&gt;define social objects&lt;/a&gt;. This article outlines how to use social object theory to design better social networking sites.&lt;/p&gt;
  3470. &lt;p&gt;First a review of &lt;a href=&quot;http://www.gapingvoid.com/Moveable_Type/archives/004390.html&quot;&gt;what are social objects&lt;/a&gt;. “The Social Object is the reason two people are talking to each other, as opposed to talking to somebody else.” People are social creatures. Social objects are the tools we use to create opportunities to socialize with other people. And lastly, for all their importance, objects are just a means to an end — the end is loving and being loved.&lt;/p&gt;
  3471. &lt;p&gt;So social objects are a cool theory but how can they help me design my new social networking site (or fix my broken one)?&lt;/p&gt;
  3472. &lt;p&gt;Jyri Engestrom, founder of &lt;a href=&quot;http://jaiku.com/&quot;&gt;Jaiku&lt;/a&gt;, answered this question in his blog post, ”&lt;a href=&quot;http://www.zengestrom.com/blog/2005/04/why_some_social.html&quot;&gt;Why some social network services work and others don’t --- Or: the case for object-centered sociality.&lt;/a&gt;”&lt;/p&gt;
  3473. &lt;p&gt;He argues:&lt;/p&gt;
  3474. &lt;blockquote&gt;
  3475. &lt;p&gt;the term ‘social networking’ makes little sense if we leave out the objects that mediate the ties between people. Think about the object as the reason why people affiliate with each specific other and not just anyone. For instance, if the object is a job, it will connect me to one set of people whereas a date will link me to a radically different group. This is common sense but unfortunately it’s not included in the image of the network diagram that most people imagine when they hear the term ‘social network.’ The fallacy is to think that social networks are just made up of people. They’re not; social networks consist of people who are connected by a shared object.&lt;/p&gt;
  3476. &lt;p&gt;The social networking services that really work are the ones that are built around objects. And, in my experience, their developers intuitively ‘get’ the object-centered sociality way of thinking about social life. Flickr, for example, has turned photos into objects of sociality. On del.icio.us the objects are the URLs. EVDB, Upcoming.org, and evnt focus on events as objects.&lt;/p&gt;
  3477. &lt;/blockquote&gt;
  3478. &lt;p&gt;Jyri wrote further that networking sites not based on social objects tend to not work as they are built on a flawed model for human interaction.&lt;/p&gt;
  3479. &lt;p&gt;The steps then for designing your social networking site around social objects are first, pick the objects around which people will socialize, next, decide what users can do to the objects and finally, design how people can share the objects or other wise socialize around the objects. Or as &lt;a href=&quot;http://twitter.com/chrismessina/statuses/1053693513&quot;&gt;Chris Messina&lt;/a&gt; put it, “define the objects, name the verbs, network the objects”&lt;/p&gt;
  3480. &lt;p&gt;Let’s look at some popular social networking sites and see how they’ve built their sites around social objects.&lt;/p&gt;
  3481. &lt;p&gt;&lt;a href=&quot;http://flickr.com&quot;&gt;Flickr’s&lt;/a&gt; social objects are pictures. People can do the following to pictures (the verbs): comment, annotate, tag, add them to sets and to groups, and share pictures through their URL.&lt;/p&gt;
  3482. &lt;p&gt;&lt;a href=&quot;http://youtube.com&quot;&gt;YouTube’s&lt;/a&gt; social objects are videos. People can watch, comment, rank, favorite, flag, create playlists of, and share objects.&lt;/p&gt;
  3483. &lt;p&gt;&lt;a href=&quot;http://dogster.com&quot;&gt;Dogster’s&lt;/a&gt; social objects are dogs (obviously). People can create profiles (for their dogs), give gifts, adopt other dogs, post videos and pictures, and find dog related businesses near their homes.&lt;/p&gt;
  3484. &lt;p&gt;&lt;a href=&quot;http://drupal.org&quot;&gt;Drupal’s&lt;/a&gt; social objects are Drupal (the software), the various modules in contrib and core, documentation pages, individual issues, and the various larger subtopics within the community such as documentation, social networking, education, and every other group found at groups.drupal.org (each group is a social object).&lt;/p&gt;
  3485. &lt;p&gt;Around issues in core and contrib, Drupalers can write issues, discuss issues on Twitter, IRC, email, blogs, enlist help on the issues through the same channels, and finally write code to solve issues.&lt;/p&gt;
  3486. &lt;p&gt;Drupal, the social object, brings people to Drupalcon and various other meetups around the world. Drupal draws us to read Drupal planet and comment on people’s blogs. Drupal draws us to &lt;a href=&quot;http://groups.drupal.org/node/19480&quot;&gt;comment and support other developers&lt;/a&gt; building sites with Drupal.&lt;/p&gt;
  3487. &lt;p&gt;&lt;a href=&quot;http://horncologne.com/content/community_our_strength_drupal_epiphany&quot;&gt;As&lt;/a&gt; &lt;a href=&quot;http://www.matthewbull.net/2008/10/23/hooked-into-drupal/&quot;&gt;is&lt;/a&gt; &lt;a href=&quot;http://www.angrydonuts.com/i-was-voted-packt-publishing-drupal-most-valuable-player&quot;&gt;often&lt;/a&gt; &lt;a href=&quot;http://cmscritic.com/drupal-founder-dries-buytaert-interview&quot;&gt;mentioned&lt;/a&gt;, the strength of Drupal is not the code but the community. The ideals and goals of Drupal (the idea not software) is what draws more and more people to the Drupal community. And as positive interaction builds upon positive interaction, the social object Drupal becomes more and more powerful.&lt;/p&gt;
  3488. &lt;p&gt;Jyri commented upon this in &lt;a href=&quot;http://www.youtube.com/watch?v=SiWjAVcWK4g&quot;&gt;a keynote he delivered last year&lt;/a&gt;. There he showed a picture he’d taken of himself and his boy in a forest. He said this picture had value but when he placed the picture on Flickr and his friends commented on it the picture became much more valuable.&lt;/p&gt;
  3489. &lt;p&gt;The picture had intrinsic value as an ‘object’ but became much more valuable when it became a ‘social object’. The comments by Jyri’s friends turned his picture into a social object. Or as &lt;a href=&quot;http://www.gapingvoid.com/Moveable_Type/archives/004318.html&quot;&gt;Hugh likes to put it&lt;/a&gt;, “social gestures beget social objects.” And as social gestures accumulate, the more valuable the social object becomes.&lt;/p&gt;
  3490. &lt;p&gt;JP Rangaswami created, what I think, is a &lt;a href=&quot;http://confusedofcalcutta.com/2008/02/16/musing-about-social-objects-molluscs-that-matter/&quot;&gt;brilliant metaphor for understanding how social objects grow through conversations&lt;/a&gt;. He compared the growth in value of a social object to the gradual adding of new layers to a pearl by an oyster.&lt;/p&gt;
  3491. &lt;p&gt;He wrote:&lt;/p&gt;
  3492. &lt;blockquote&gt;
  3493. &lt;p&gt;Conversations grow around social objects, much like pearls grow around microscopic dust. Social objects are about growth, they are “live”.&lt;/p&gt;
  3494. &lt;p&gt;A successful social object is one that has layer upon layer of conversation created around it; as the number of participants increases, social objects enjoy network effects.&lt;/p&gt;
  3495. &lt;/blockquote&gt;
  3496. &lt;p&gt;So to sum things up. To create a thriving social networking site, first choose good social objects for the core of your site and then create ways for people to share the social objects and socialize around them.&lt;/p&gt;
  3497. &lt;p&gt;My next post will be on social learning or how social object theory can help us design websites which help people with similar interests connect to each other and learn together.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What are Social Objects?]]></title><description><![CDATA[In preparation for my upcoming session at Drupalcon, I’m writing a short series of articles on social networking and learning theory. First…]]></description><link>https://bricolage.io/what-are-social-objects/</link><guid isPermaLink="false">https://bricolage.io/what-are-social-objects/</guid><pubDate>Sun, 22 Feb 2009 01:48:22 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;In preparation for &lt;a href=&quot;http://dc2009.drupalcon.org/session/building-advanced-social-networks-large-us-university.html&quot;&gt;my upcoming session at Drupalcon&lt;/a&gt;, I’m writing a short series of articles on social networking and learning theory. First up is an article on social objects.&lt;/em&gt;&lt;/p&gt;
  3498. &lt;blockquote&gt;
  3499. &lt;p&gt;The Social Object, in a nutshell, is the reason two people are talking to each other, as opposed to talking to somebody else.&lt;/p&gt;
  3500. &lt;/blockquote&gt;
  3501. &lt;p&gt;— &lt;a href=&quot;http://www.gapingvoid.com/Moveable_Type/archives/004390.html&quot;&gt;Hugh Macleod&lt;/a&gt;&lt;/p&gt;
  3502. &lt;p&gt;As humans we like to socialize but in order to socialize, we need a reason to get together. Social objects provide that reason.&lt;/p&gt;
  3503. &lt;h3 id=&quot;some-examples-of-social-objects&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#some-examples-of-social-objects&quot; aria-label=&quot;some examples of social objects permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Some examples of social objects&lt;/h3&gt;
  3504. &lt;p&gt;You and John are coworkers on a team working on the launch of a new microsite for your company. Your company, team, and project are all social objects.&lt;/p&gt;
  3505. &lt;p&gt;You and Fred are both Information Systems majors and have become friends as you study for tests and do homework together. Your major, classes, and homework assignments are social objects.&lt;/p&gt;
  3506. &lt;p&gt;Your wife wants to throw a big birthday party for you so she can invite all of her and your friends. The birthday party is a social object.&lt;/p&gt;
  3507. &lt;p&gt;Sue holds a tea party every Sunday evening. She invites all her friends and they come as they can. The tea party is a social object.&lt;/p&gt;
  3508. &lt;h3 id=&quot;social-objects-bind-us-together&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#social-objects-bind-us-together&quot; aria-label=&quot;social objects bind us together permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Social objects bind us together.&lt;/h3&gt;
  3509. &lt;p&gt;The more important a social object is to us, the stronger it’ll bind us to others who also hold that social object. I love &lt;a href=&quot;http://drupal.org&quot;&gt;Drupal&lt;/a&gt; and spend a good part of my time using it to build &lt;a href=&quot;https://island.byu.edu&quot;&gt;cool websites&lt;/a&gt;. As I meet others who also loves Drupal, we immediately have a strong connection through that shared social object.&lt;/p&gt;
  3510. &lt;p&gt;When you meet someone new or go on a first date, you start asking questions hoping to find “something in common” or shared social objects.&lt;/p&gt;
  3511. &lt;p&gt;If you date someone for a few months then break up, the reason you’ll often give is, “we just didn’t have much in common.”&lt;/p&gt;
  3512. &lt;p&gt;Families develop traditions. My family eats fancy sandwiches each Christmas Eve. The shared memories and rituals we’ve developed bind us together. Traditions are social objects.&lt;/p&gt;
  3513. &lt;h3 id=&quot;social-objects-come-in-all-sorts-of-types-and-strength&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#social-objects-come-in-all-sorts-of-types-and-strength&quot; aria-label=&quot;social objects come in all sorts of types and strength permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Social objects come in all sorts of types and strength&lt;/h3&gt;
  3514. &lt;p&gt;&lt;a href=&quot;http://www.zengestrom.com/blog/2007/08/what-makes-a-go.html&quot;&gt;Good social objects&lt;/a&gt; are complex and have lots of hooks around which to start conversations. A football game has history, statistics, personalities, rivalries, and a plot with heroes, goats, and momentum shifts. All of which provide rich meat for discussion before, during and after the game.&lt;/p&gt;
  3515. &lt;h3 id=&quot;we-change-our-behavior-because-of-social-objects&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#we-change-our-behavior-because-of-social-objects&quot; aria-label=&quot;we change our behavior because of social objects permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;We change our behavior because of social objects&lt;/h3&gt;
  3516. &lt;p&gt;If your coworkers are NBA fans and there’s a big game one night, you’ll watch the game so you can talk about it with your coworkers the next day. You buy that silly new iPhone app so you can share it with your coworkers. You join Facebook because all your friends are there. The NBA game, your new iPhone app, and Facebook are all social objects.&lt;/p&gt;
  3517. &lt;p&gt;But it’s important to remember that it’s not the social objects that matter but people. Loving and being loved is what matters. Social objects are just the tool we use to make it happen.&lt;/p&gt;
  3518. &lt;p&gt;Next I’ll write about &lt;a href=&quot;/how-design-social-networking-site-using-social-objects&quot;&gt;how social object theory can help us build better social networking websites&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[In social media there's not one right answer]]></title><description><![CDATA[Great blog post that explores the advantages and disadvantages of different social media structures. He explores when you want to follow…]]></description><link>https://bricolage.io/social-media-theres-not-one-right-answer/</link><guid isPermaLink="false">https://bricolage.io/social-media-theres-not-one-right-answer/</guid><pubDate>Sat, 13 Dec 2008 18:31:53 GMT</pubDate><content:encoded>&lt;p&gt;Great blog post that explores the advantages and disadvantages of different social media structures.&lt;/p&gt;
  3519. &lt;p&gt;He explores when you want to follow ideas (when the community is small) or people (when the community is too big to follow everything).&lt;/p&gt;
  3520. &lt;p&gt;He discusses the search/browse debate and concludes you need both. Different people tend toward one style or the other but both are needed for different purposes. Search is fast and takes you straight to content you’re interested in. Browse, on other hand, tends to be slower but helps you understand the context and organization of the content better.&lt;/p&gt;
  3521. &lt;p&gt;Great stuff. Read more here:&lt;/p&gt;
  3522. &lt;p&gt;&lt;a href=&quot;http://smoothspan.wordpress.com/2008/12/12/blackwhite-symmetryasymmetry-forumsocial-network-searchbrowse/&quot;&gt;http://smoothspan.wordpress.com/2008/12/12/blackwhite-symmetryasymmetry-forumsocial-network-searchbrowse/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Enterprise 2.0 Slides]]></title><description><![CDATA[Presentation from one of my classes in Information Systems.]]></description><link>https://bricolage.io/enterprise-20-slides/</link><guid isPermaLink="false">https://bricolage.io/enterprise-20-slides/</guid><pubDate>Thu, 11 Dec 2008 16:41:56 GMT</pubDate><content:encoded>&lt;p&gt;Presentation from one of my classes in Information Systems.&lt;/p&gt;
  3523. &lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 83.37236533957847%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;p&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/838583&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt; &lt;/p&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Some words of wisdom]]></title><description><![CDATA[The slenderest knowledge that may be obtained of higher things is more desirable than the most certain knowledge that may be obtained of…]]></description><link>https://bricolage.io/some-words-wisdom/</link><guid isPermaLink="false">https://bricolage.io/some-words-wisdom/</guid><pubDate>Mon, 01 Dec 2008 00:34:44 GMT</pubDate><content:encoded>&lt;blockquote&gt;
  3524. &lt;p&gt;The slenderest knowledge that may be obtained of higher things is more desirable than the most certain knowledge that may be obtained of lesser things&lt;/p&gt;
  3525. &lt;/blockquote&gt;
  3526. &lt;p&gt;Thomas Aquinas&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Process is an embedded reaction to prior stupidity]]></title><description><![CDATA[Since I read this quote by Clay Shirky, ”process is an embedded reaction to prior stupidity” it’s been at the top of my very long Shirky…]]></description><link>https://bricolage.io/process-embedded-reaction-prior-stupidity/</link><guid isPermaLink="false">https://bricolage.io/process-embedded-reaction-prior-stupidity/</guid><pubDate>Sun, 30 Nov 2008 02:39:36 GMT</pubDate><content:encoded>&lt;p&gt;Since I read this quote by Clay Shirky, ”&lt;a href=&quot;http://many.corante.com/archives/2003/09/17/process_is_an_embedded_reaction_to_prior_stupidity.php&quot;&gt;process is an embedded reaction to prior stupidity&lt;/a&gt;” it’s been at the top of my very long Shirky quote list. For someone like me who thrives on doing things, bureaucracy is a nightmare.&lt;/p&gt;
  3527. &lt;p&gt;Another of my favorite authors, Paul Graham, wrote a great essay along the same vein today, talking about the &lt;a href=&quot;http://www.paulgraham.com/artistsship.html&quot;&gt;gradual build-up of checks and processes&lt;/a&gt; and the very real cost those checks impose upon all of us.&lt;/p&gt;
  3528. &lt;p&gt;Some of my favorite parts:&lt;/p&gt;
  3529. &lt;blockquote&gt;
  3530. &lt;p&gt;One of the differences between big companies and startups is that big companies tend to have developed procedures to protect themselves against mistakes. A startup walks like a toddler, bashing into things and falling over all the time. A big company is more deliberate.&lt;/p&gt;
  3531. &lt;p&gt;The gradual accumulation of checks in an organization is a kind of learning, based on disasters that have happened to it or others like it. After giving a contract to a supplier who goes bankrupt and fails to deliver, for example, a company might require all suppliers to prove they’re solvent before submitting bids.&lt;/p&gt;
  3532. &lt;p&gt;As companies grow they invariably get more such checks, either in response to disasters they’ve suffered, or (probably more often) by hiring people from bigger companies who bring with them customs for protecting against new types of disasters.&lt;/p&gt;
  3533. &lt;p&gt;It’s natural for organizations to learn from mistakes. The problem is, people who propose new checks almost never consider that the check itself has a cost.&lt;/p&gt;
  3534. &lt;p&gt;…&lt;/p&gt;
  3535. &lt;p&gt;Whenever someone in an organization proposes to add a new check, they should have to explain not just the benefit but the cost. No matter how bad a job they did of analyzing it, this meta-check would at least remind everyone there had to be a cost, and send them looking for it.&lt;/p&gt;
  3536. &lt;p&gt;If companies started doing that, they’d find some surprises. Joel Spolsky recently spoke at Y Combinator about selling software to corporate customers. He said that in most companies software costing up to about $1000 could be bought by individual managers without any additional approvals. Above that threshold, software purchases generally had to be approved by a committee. But babysitting this process was so expensive for software vendors that it didn’t make sense to charge less than $50,000. Which means if you’re making something you might otherwise have charged $5000 for, you have to sell it for $50,000 instead.&lt;/p&gt;
  3537. &lt;p&gt;The purpose of the committee is presumably to ensure that the company doesn’t waste money. And yet the result is that the company pays 10 times as much.&lt;/p&gt;
  3538. &lt;p&gt;…&lt;/p&gt;
  3539. &lt;p&gt;In more recent times, Sarbanes-Oxley has practically destroyed the US IPO market [Ha! My accounting teachers never mentioned this]. That wasn’t the intention of the legislators who wrote it. They just wanted to add a few more checks on public companies. But they forgot to consider the cost. They forgot that companies about to go public are usually rather stretched, and that the weight of a few extra checks that might be easy for General Electric to bear are enough to prevent younger companies from being public at all.&lt;/p&gt;
  3540. &lt;p&gt;…&lt;/p&gt;
  3541. &lt;p&gt;Programmers are unlike many types of workers in that the best ones actually prefer to work hard. This doesn’t seem to be the case in most types of work. When I worked in fast food, we didn’t prefer the busy times. And when I used to mow lawns, I definitely didn’t prefer it when the grass was long after a week of rain.&lt;/p&gt;
  3542. &lt;p&gt;Programmers, though, like it better when they write more code. Or more precisely, when they release more code. Programmers like to make a difference. Good ones, anyway.&lt;/p&gt;
  3543. &lt;/blockquote&gt;
  3544. &lt;p&gt;Great stuff, &lt;a href=&quot;http://www.paulgraham.com/artistsship.html&quot;&gt;read the whole thing&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Love is the fountain for all creativity]]></title><description><![CDATA[At a recent education conference, I attended a session on creativity. The teachers were reporting on their experiences in teaching a course…]]></description><link>https://bricolage.io/love-fountain-all-creativity/</link><guid isPermaLink="false">https://bricolage.io/love-fountain-all-creativity/</guid><pubDate>Sat, 29 Nov 2008 19:53:57 GMT</pubDate><content:encoded>&lt;p&gt;At a recent education conference, I attended a session on creativity. The teachers were reporting on their experiences in teaching a course on creativity to freshmen college students. They reported on some things that happened and we did some of the exercises they do in their classes. I was disappointed though as the session leaders focused on teaching the &lt;em&gt;behaviors&lt;/em&gt; of creative people while completely missing what’s driving these behaviors.&lt;/p&gt;
  3545. &lt;p&gt;Love is at the heart of all creative acts.&lt;/p&gt;
  3546. &lt;p&gt;I can think of three reasons.&lt;/p&gt;
  3547. &lt;p&gt;A creative thought is just another word for an excellent thought. Most ideas are average. Most people settle for ideas that are “good enough.” And why not? Thinking is hard and if the first idea that comes along is “good enough”, why not use it? But if you truly love something, you can’t settle for “good enough.” Think of any great athlete. They are great because their love for the game pushes them to practice more than comparable athletes. Any great artist, musician, architect is driven by their &lt;em&gt;passion&lt;/em&gt; for the art. Even in fields not normally considered “creative”, the best in that field are the best because of their love for their craft. They do great and creative things because their love for their work pushes them beyond the “good enough.”&lt;/p&gt;
  3548. &lt;p&gt;Fear of failure drives people to be average. Fear of failure recedes as hope, driven by love, takes its place. Most people are driven primarily by fear. They settle for the “safe” answer. They do the sure thing, take the safe job, do what pleases the client, etc. People who love something &lt;em&gt;can’t&lt;/em&gt; settle on what’s safe as anything but the best for their beloved is not acceptable. Creative people, driven by love, behave recklessly in the eyes of their “saner” cousins.&lt;/p&gt;
  3549. &lt;p&gt;People who love something pay attention to what they love. If you pay attention to something, you will soon know much more about the thing you love than those who don’t pay attention to it. By knowing more about this thing you will soon have better ideas on how to improve this thing than someone who doesn’t love this thing. A parent who loves their children will talk and play with them and get to know them and by knowing them better becomes a better parent. A teacher who loves their students will learn their sometimes hidden strengths and weaknesses and learn how to nurture each in the way most suited. And the same is every case you can imagine. The man who loves his town will pay attention to it and soon have better, more creative, ideas on how to improve it. What I find remarkable about people who don’t seem to love is how little&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Knight News Challenge application to improve Memetracker and Content Recommendation Engine modules]]></title><description><![CDATA[I just submitted my application to the Knight News Challenge. My application is for money to bring the Memetracker and Content…]]></description><link>https://bricolage.io/knight-news-challenge-application-improve-memetracker-and-content-recommendation-eng/</link><guid isPermaLink="false">https://bricolage.io/knight-news-challenge-application-improve-memetracker-and-content-recommendation-eng/</guid><pubDate>Sun, 02 Nov 2008 06:47:27 GMT</pubDate><content:encoded>&lt;p&gt;I just submitted my application to the &lt;a href=&quot;http://www.newschallenge.org/&quot;&gt;Knight News Challenge&lt;/a&gt;. My application is for money to bring the &lt;a href=&quot;http://drupal.org/project/memetracker&quot;&gt;Memetracker&lt;/a&gt; and &lt;a href=&quot;http://drupal.org/project/cre&quot;&gt;Content Recommendation Engine&lt;/a&gt; modules to production ready status. Memetracker, is of course, &lt;a href=&quot;/ive-been-accepted-to-google-summer-of-code&quot;&gt;the module I wrote this past summer&lt;/a&gt; as part of &lt;a href=&quot;http://code.google.com/soc/2008/&quot;&gt;Google Summer of Code&lt;/a&gt;.&lt;/p&gt;
  3550. &lt;h3 id=&quot;title&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#title&quot; aria-label=&quot;title permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Title:&lt;/h3&gt;
  3551. &lt;p&gt;Improve modules for semi-automated news aggregation and content recommendation in Drupal&lt;/p&gt;
  3552. &lt;h3 id=&quot;describe-your-project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#describe-your-project&quot; aria-label=&quot;describe your project permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Describe your project:&lt;/h3&gt;
  3553. &lt;p&gt;All organizations, large and small, have a vital need to deliver relevant and timely information to its members. My project will be to make it possible for organizations to easily meet this need. I will work on two Drupal modules, write documentation, and build a Drupal install profile so that organizations can easily add sophisticated news aggregation and recommendation tools into their Drupal website.&lt;/p&gt;
  3554. &lt;p&gt;The two Drupal modules I will improve are Memetracker and Content Recommendation Engine.&lt;/p&gt;
  3555. &lt;p&gt;I wrote Memetracker as part of the 2008 Google Summer of Code. The Memetracker module uses machine learning algorithms to intelligently filter and group all types of content. The module’s purpose is to find and display to a community in real time the most interesting conversations and memes on relevant topics as they emerge.&lt;/p&gt;
  3556. &lt;p&gt;My goal for the memetracker module is for it emulate functionality of successful commercial memetrackers such as Techmeme, Google News, Tailrank, and Megite. I want it to be a robust open-source implementation of memetracking technology that can be easily plugged into Drupal-based community sites.&lt;/p&gt;
  3557. &lt;p&gt;The Content Recommendation Engine module is designed to provide personalized content recommendation. It learns what types of content individuals are interested in and recommends new content as it comes in.&lt;/p&gt;
  3558. &lt;p&gt;Both modules are powerful ideas but need quite a bit of work to be usable in real-life situations. I would use the Knight Foundation money to do fix bugs, add requested functionality, and to create an install profile which makes it very easy for non-technical end-users to install a sophisticated Drupal-based news aggregation and recommendation site.&lt;/p&gt;
  3559. &lt;h3 id=&quot;how-will-your-project-improve-the-way-news-and-information-are-delivered-to-geographic-communities&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-will-your-project-improve-the-way-news-and-information-are-delivered-to-geographic-communities&quot; aria-label=&quot;how will your project improve the way news and information are delivered to geographic communities permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How will your project improve the way news and information are delivered to geographic communities?&lt;/h3&gt;
  3560. &lt;p&gt;There are many tools available to communities to aggregate and distribute information. What’s missing are open source tools which leverage not just human intelligence to filter content but also artificial intelligence.&lt;/p&gt;
  3561. &lt;p&gt;There is far too much information for any person or organization to sort through manually. These automated tools can be thought of as pre-processors that improve the signal-to-noise ratio reducing the stress people endure trying to follow news. By filtering out the noise, important news is much more likely to be identified and acted upon.&lt;/p&gt;
  3562. &lt;h3 id=&quot;how-is-your-idea-innovative-new-or-different-from-what-already-exists&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-is-your-idea-innovative-new-or-different-from-what-already-exists&quot; aria-label=&quot;how is your idea innovative new or different from what already exists permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How is your idea innovative? (new or different from what already exists)&lt;/h3&gt;
  3563. &lt;p&gt;There are not any open source tools that do the automated content filtering and recommendation these two tools will do. In addition, the few tools that are similar to these are standalone applications where as my work would be built on Drupal, the most widely used open-source social publishing platform. This means two things. First, my tools would get wider adoption as they would fit into many organization’s existing technology stack. Second, they are more useful as they can take advantage of many other powerful modules available for Drupal. The tools will be the basic building blocks of a rich flowering of content aggregation / filtering web applications based on these modules and Drupal.&lt;/p&gt;
  3564. &lt;h3 id=&quot;what-experience-do-you-or-your-organization-have-to-successfully-develop-this-project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-experience-do-you-or-your-organization-have-to-successfully-develop-this-project&quot; aria-label=&quot;what experience do you or your organization have to successfully develop this project permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What experience do you or your organization have to successfully develop this project?&lt;/h3&gt;
  3565. &lt;p&gt;I was a &lt;a href=&quot;/drupal-memetracker-module-my-google-summer-of-code-application&quot;&gt;Google Summer of Code student&lt;/a&gt; this past summer where I wrote the Memetracker module.&lt;/p&gt;
  3566. &lt;p&gt;I traveled to Drupalcon in Hungary and presented there on the Memetracker module and on content filtering in general. The session and Q&amp;#x26;A can be viewed here:&lt;/p&gt;
  3567. &lt;p&gt;&lt;a href=&quot;http://www.archive.org/details/memtracker&quot;&gt;http://www.archive.org/details/memtracker&lt;/a&gt;&lt;/p&gt;
  3568. &lt;p&gt;Currently I’m building and maintaining a large Drupal-based social learning platform at Brigham Young University. As I develop tools for the site and work with and observe the 100s of student users (soon to be thousands), I’m developing a deep understanding of how information spreads though a community and how to develop technology to facilitate that process. I hope to use both modules extensively in this website. The social learning website can be viewed here: &lt;a href=&quot;https://island.byu.edu&quot;&gt;https://island.byu.edu&lt;/a&gt;&lt;/p&gt;
  3569. &lt;p&gt;I have been heavily involved in the Drupal community for the past 1.5 years. From this experience, I have obtained a good understanding about how open source development works and am confident I will be able to build these tools such that they are easily modified and extensible to meet the varying needs of different organizations.&lt;/p&gt;
  3570. &lt;p&gt;I am passionate about building tools that help organizations digest, interact around, and act upon information. I would very much appreciate support from the Knight Foundation to continue to improve the Memetracker and the Content Recommendation Engine modules and make them widely available. Thank you.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Proposal for Open Studies (Un)course]]></title><description><![CDATA[[This is the proposal I’m making for the creation of a new course at BYU.] Students have many different needs, one size does not fit all. In…]]></description><link>https://bricolage.io/proposal-open-studies-uncourse/</link><guid isPermaLink="false">https://bricolage.io/proposal-open-studies-uncourse/</guid><pubDate>Sat, 25 Oct 2008 00:33:29 GMT</pubDate><content:encoded>&lt;p&gt;[This is the &lt;a href=&quot;https://island.byu.edu/content/proposal-open-studies-uncourse&quot;&gt;proposal I’m making for the creation of a new course at BYU&lt;/a&gt;.]&lt;/p&gt;
  3571. &lt;p&gt;Students have many different needs, one size does not fit all. In our current courses, some are appropriately challenged but many others are bored and dissatisfied. Classes are not customizable by students to meet their needs or to fit their learning styles. In addition there are many subjects students would like to learn (the long-tail of education) that there isn’t enough demand to justify allocating a classroom and teacher. Most students already spend considerable time outside of school learning things not taught in their courses. This course would give them access to resources at school most importantly their peers as they study advanced topics in small groups.&lt;/p&gt;
  3572. &lt;p&gt;The course would be divided into three 6-week segments. In each segment, the student creates a learning project where they create both a learning goal and a learning plan. The learning plan will include the steps to reach their learning goal and a list of resources they will use which can include people and materials (books, OpenCourseWare, online resources, etc.). This learning plan will be reviewed by other students and a teacher before being passed off. Students can also “cite” other learning plans in their proposal creating a marketplace for learning plans. After learning plans are finalized, students will be organized into groups of 3-7 people who all are studying similar topics. These groups will meet weekly while students are working on their project.&lt;/p&gt;
  3573. &lt;h4 id=&quot;diagram-of-a-six-week-segment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#diagram-of-a-six-week-segment&quot; aria-label=&quot;diagram of a six week segment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Diagram of a six-week segment.&lt;/h4&gt;
  3574. &lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/82268668@N00/2969785767/&quot; title=&quot;openstudies by kylenumber5, on Flickr&quot;&gt;&lt;span
  3575.      class=&quot;gatsby-resp-image-wrapper&quot;
  3576.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  3577.    &gt;
  3578.      &lt;a
  3579.    class=&quot;gatsby-resp-image-link&quot;
  3580.    href=&quot;/static/33d42571143996c7a9733f1206541b90/72e01/2969785767_ce6ff99643_b.jpg&quot;
  3581.    style=&quot;display: block&quot;
  3582.    target=&quot;_blank&quot;
  3583.    rel=&quot;noopener&quot;
  3584.  &gt;
  3585.    &lt;span
  3586.    class=&quot;gatsby-resp-image-background-image&quot;
  3587.    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgAEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHrNiBaKv/EABsQAAEFAQEAAAAAAAAAAAAAAAEAAgMREiEx/9oACAEBAAEFArLn0opdNz3JQ8//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAeEAACAAYDAAAAAAAAAAAAAAAAAQIQESExMkGBkf/aAAgBAQAGPwJ2aRsYi7RU59l//8QAHBAAAwACAwEAAAAAAAAAAAAAAAERITFBUYGR/9oACAEBAAE/IUltA8O7L7OCL6XNA+U/o3O0FkZ9P//aAAwDAQACAAMAAAAQCA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPxCn/8QAHRABAQADAAIDAAAAAAAAAAAAAREAITFBUZGx8P/aAAgBAQABPxCUD7iENw6b+s1UDCh1hvnvJUSybl7Z63lYXtnGIUdbBh+1jmlJ5VfnP//Z&apos;); background-size: cover; display: block;&quot;
  3588.  &gt;&lt;/span&gt;
  3589.  &lt;img
  3590.        class=&quot;gatsby-resp-image-image&quot;
  3591.        alt=&quot;openstudies&quot;
  3592.        title=&quot;&quot;
  3593.        src=&quot;/static/33d42571143996c7a9733f1206541b90/1c72d/2969785767_ce6ff99643_b.jpg&quot;
  3594.        srcset=&quot;/static/33d42571143996c7a9733f1206541b90/a80bd/2969785767_ce6ff99643_b.jpg 148w,
  3595. /static/33d42571143996c7a9733f1206541b90/1c91a/2969785767_ce6ff99643_b.jpg 295w,
  3596. /static/33d42571143996c7a9733f1206541b90/1c72d/2969785767_ce6ff99643_b.jpg 590w,
  3597. /static/33d42571143996c7a9733f1206541b90/a8a14/2969785767_ce6ff99643_b.jpg 885w,
  3598. /static/33d42571143996c7a9733f1206541b90/72e01/2969785767_ce6ff99643_b.jpg 1024w&quot;
  3599.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  3600.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3601.        loading=&quot;lazy&quot;
  3602.        decoding=&quot;async&quot;
  3603.      /&gt;
  3604.  &lt;/a&gt;
  3605.    &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
  3606. &lt;p&gt;During the segment, students will be asked to share what they are learning. Each week they’ll make a post in an Island group about helpful resources they’ve found and/or how they solved a obstacle in their project. The last week of the segment is devoted to teaching what they learned. Each student will be asked to teach in a digital form what they learned and post it on Island. This could be as simple as a blog post or as elaborate as a screencast, a video, or podcast. In addition students will be asked to participate in an Ignite session (&lt;a href=&quot;http://ignite.oreilly.com/&quot;&gt;http://ignite.oreilly.com/&lt;/a&gt;) and an &lt;a href=&quot;http://www.digital-web.com/articles/understanding_the_unconference/&quot;&gt;Unconference&lt;/a&gt;. Ignite sessions are where each presenter has 5 minutes on stage with 20 slides which rotate automatically every 15 seconds. An Unconference is a new form of conferences organized on the premise that all attendees have something valuable to say. Students will be asked to attend the unconference held the final week and either present or blog some of the presentations.&lt;/p&gt;
  3607. &lt;p&gt;This course would produce a rapidly growing collection of valuable learning plans and learning resources useful to students and teachers alike. They will be useful to students who are taking the Open Studies class and need a good learning plan or who are studying outside of school. They will be useful teachers who are looking for new and innovative ways to help students learn.&lt;/p&gt;
  3608. &lt;p&gt;Teachers would have a different role in the Open Studies class. They would be mentors or coaches. They would help advanced students who are passionate about a subject complete effective projects. They would help train students to be proficient, self-directed, lifelong, and wise learners.&lt;/p&gt;
  3609. &lt;p&gt;There is a huge unmet demand for specialized classes in my major, Information Systems, and elsewhere across the BYU campus. I for one would love to take a classes on social network analysis, cloud computing, and Javascript UI design, none of which are available. I have a friend who wants to take a .NET web development class but can only find 4 other students who are interested. The Open Studies Course would meet these and other demands.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Internet reduces need for experts. Where does this leave professors?]]></title><description><![CDATA[[I wrote this originally on Island, the student learning website I’m building at BYU.] Clay Shirky writes: [Credentialed] experts the world…]]></description><link>https://bricolage.io/internet-reduces-need-experts-where-does-leave-professors/</link><guid isPermaLink="false">https://bricolage.io/internet-reduces-need-experts-where-does-leave-professors/</guid><pubDate>Thu, 23 Oct 2008 20:06:34 GMT</pubDate><content:encoded>&lt;p&gt;[I wrote this &lt;a href=&quot;https://island.byu.edu/content/internet-reduces-need-experts-where-does-leave-professors&quot;&gt;originally on Island&lt;/a&gt;, the student learning website I’m building at &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt;.]&lt;/p&gt;
  3610. &lt;p&gt;&lt;a href=&quot;http://www.boingboing.net/2007/06/21/clay-shirky-defends-.html&quot;&gt;Clay Shirky writes:&lt;/a&gt;&lt;/p&gt;
  3611. &lt;blockquote&gt;
  3612. &lt;p&gt;[Credentialed] experts the world over have been shocked to discover that they were consulted not as a direct result of their expertise, but often as a secondary effect --- the apparatus of credentialing made finding experts easier than finding [non-credentialed] amateurs, even when the amateurs knew the same things as the experts.&lt;/p&gt;
  3613. &lt;/blockquote&gt;
  3614. &lt;p&gt;In the web2.0 world, I’m seconds away from a Google search that connects me to resources and online communities that know more collectively than any professor. In this brave new world with near ubiquitous digital knowledge, what then are professors good for?&lt;/p&gt;
  3615. &lt;p&gt;They aren’t nearly as valuable at teaching explicit knowledge so what’s left is to teach tacit knowledge (knowledge that’s hard to learn from reading). What tacit knowledge? I’d suggest the most important tacit knowledge that professors can help students learn is how to ask the right questions in their field. How do students learn to ask the right questions? By joining and &lt;strong&gt;participating&lt;/strong&gt; in communities of practice.&lt;/p&gt;
  3616. &lt;p&gt;I see Island’s (and other web2.0 tools) greatest potential is in exposing and connecting students more easily to active participants in different communities of practice. Through this exposure and connections they can learn to emulate these experts through experiencing and doing what experts experience and do.&lt;/p&gt;
  3617. &lt;p&gt;Good learning is learning to &lt;strong&gt;be&lt;/strong&gt; something not learning &lt;strong&gt;about&lt;/strong&gt; something. I might know everything a book can teach me about chemistry but still fail miserably at being a chemist. I might be able to pass every grammar test in existence but still not be able to write a sensible essay. Learning split from its context is worthless.&lt;/p&gt;
  3618. &lt;p&gt;Some of my most valuable classes here at BYU were taught by active participants in their community of practice. By watching them practice their craft, I learned what it meant to &lt;strong&gt;be&lt;/strong&gt; a member of that community and what it meant to &lt;strong&gt;practice&lt;/strong&gt; that community’s craft.&lt;/p&gt;
  3619. &lt;p&gt;So what then are professors good for? I believe as guides. They can lead students into communities of practice and can model proper behavior and attitudes. And once students are &lt;strong&gt;in&lt;/strong&gt; the community of practice, professors can help students choose appropriate experiences that will help them move through the stages between novice to expert.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Content Recommendation]]></title><description><![CDATA[New Note 66 Each one of us wakes up everyday with a problem. A problem we must solve in order to have a successful day. The problem is…]]></description><link>https://bricolage.io/content-recommendation/</link><guid isPermaLink="false">https://bricolage.io/content-recommendation/</guid><pubDate>Tue, 14 Oct 2008 00:26:11 GMT</pubDate><content:encoded>&lt;p&gt;New Note 66&lt;/p&gt;
  3620. &lt;p&gt;Each one of us wakes up everyday with a problem. A problem we must solve in order to have a successful day. The problem is finding the right information. Without the right information, we can’t choose a good breakfast, catch the bus to work, find a restaurant, call a client, buy the right stock, cook chicken noodle soup, help a child with homework or complete any of the other billion and one tasks we do daily. If the information we know is either of bad quality or missing important pieces then we are poor employees, poor parents, poor friends, and live a life far short of its potential. If we know something we can do something. On the flip side, if we don’t know something then we are unable to do something. If we don’t know the bus time or bus number, we can’t ride it to work. If we don’t know a client’s number, then we can’t call them. If we don’t know a restaurant’s number then we’re unable to eat there. This is a vitally important point. We can’t do what we don’t know. If we know little we do little.&lt;/p&gt;
  3621. &lt;p&gt;Knowing and understanding things is a topic I’ve thought about deeply for a long time. Specifically about mechanisms we use on the individual, community and society-wide basis for identifying and propagating the most interesting and relevant news. This past summer, I worked on building an open-source memetracker for the Drupal social publishing platform as part of Google Summer of Code. Memetrackers are one technique used for creating automated news sites similar to Google News and Techmeme (see my original proposal to Google Summer of Code for more details). In this blog post I want to take a more holistic approach for examining the question of what exactly is content recommendation and why do we need it. Finally, I’ll use my analysis to make a recommendation for creating a general purpose content recommendation engine that can be implemented in Drupal (and other online systems).&lt;/p&gt;
  3622. &lt;p&gt;We need information to live. We need content recommendation because we can’t, by ourselves, get all the information we need. How much harder would all of our lives be if each of us, individually, had to figure out the bus schedule in our city? Probably billions of man-hours are saved yearly just because one of the employees of each bus company is responsible for creating a bus schedule and posting it online or in a booklet. In a similar fashion, think how useful are books. If you were a bit curious about astronomy and wanted to learn some think how difficult it’d be, unaided, to start to grasp what astronomy is all about. Books are so convenient. An expert in the field spends several months of their life distilling the most important important information for a beginner like you. One lazy Saturday afternoon with that book and you will know more about the subject then months of stumbling about trying to understand. And how did we find information before Google? Google (and other search engines) are critical for finding that very small needle of information in the very large haystack that is the internet.&lt;/p&gt;
  3623. &lt;p&gt;In short, we need help finding the right information; we need content recommendation. As my examples show there are times we need help because information is scare, there are times we need help because there is too much information and we need help filtering out the unneeded information so we’re left with a managable and digestable chunk. And at times, the right content is already available, we just need someone to point it out.&lt;/p&gt;
  3624. &lt;p&gt;What kind of content recommendation tools do we already use? I already mentioned a few, books and Google. In addition we use airfare searching sites, we read magazines, we ask librarians, we watch TV, we follow blogs, we talk to friends, we go to conferences, we join community groups, we join trade groups, we attend debates, and the list goes on and on. All of these are an effort to find information that is most relevant and most interesting for our particular needs.&lt;/p&gt;
  3625. &lt;p&gt;From thinking about all this, I’ve concluded that all content recommendation is the result of a process comprised of the following steps: filtering, organization, and display.&lt;/p&gt;
  3626. &lt;p&gt;If our starting point is all the information in the universe and our ending goal is useful and relevant information a filter is something which removes information, an organizer is something that sorts information into categories, and a displayer is set of decisions on how to display the filtered and organized information specifically the choice of what information to emphesize (and not) and what information you’ll make easily accessible and what information you will not.&lt;/p&gt;
  3627. &lt;p&gt;Consider the following two examples of content recommendation. I’ve broken down two content recommendation processes into their individual steps of filtering, organizing, and displaying information. The first process is the one used by my &lt;a href=&quot;/drupal-memetracker-module-my-google-summer-of-code-application&quot;&gt;Drupal memetracker module&lt;/a&gt; I wrote this summer. The second is the steps used by a typical US local newspaper.&lt;/p&gt;
  3628. &lt;p&gt;&lt;strong&gt;The Color Key&lt;/strong&gt;:&lt;/p&gt;
  3629. &lt;p&gt;Current state (size and type) of content&lt;/p&gt;
  3630. &lt;p&gt;&lt;em&gt;Filters&lt;/em&gt; remove content&lt;/p&gt;
  3631. &lt;p&gt;&lt;em&gt;Organizers&lt;/em&gt; sort content or place content into categories&lt;/p&gt;
  3632. &lt;p&gt;&lt;em&gt;Displays&lt;/em&gt; are the final decision about what content you emphasize and make easily accessible… and what content you don’t&lt;/p&gt;
  3633. &lt;h3 id=&quot;memetracker-filter-flowchart&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#memetracker-filter-flowchart&quot; aria-label=&quot;memetracker filter flowchart permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Memetracker Filter Flowchart:&lt;/h3&gt;
  3634. &lt;p&gt;Every last bit of content in the Universe&lt;/p&gt;
  3635. &lt;p&gt;1. Filter: What content sources will be imported into memetracker?&lt;/p&gt;
  3636. &lt;p&gt;All content imported from choosen content sources since the sources were added&lt;/p&gt;
  3637. &lt;p&gt;2. Filter: Was the content written in the past 48 hours?&lt;/p&gt;
  3638. &lt;p&gt;All content from online sources that was written in the past 48 hours&lt;/p&gt;
  3639. &lt;p&gt;3. Organize: Cluster content by meme&lt;/p&gt;
  3640. &lt;p&gt;4. Organize: Sort memes by size, age, and other factors&lt;/p&gt;
  3641. &lt;p&gt;All content from online sources that was written in the past 48 hours now organized by meme&lt;/p&gt;
  3642. &lt;p&gt;5. Filter: Is the meme one of the top 15?&lt;/p&gt;
  3643. &lt;p&gt;6. All content from online sources that was written in the past 48 hours that are part of the top 15 memes&lt;/p&gt;
  3644. &lt;p&gt;7. Display: Show headlines with related articles hidden&lt;/p&gt;
  3645. &lt;h3 id=&quot;local-newspaper-filter-flowchart&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#local-newspaper-filter-flowchart&quot; aria-label=&quot;local newspaper filter flowchart permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Local Newspaper Filter Flowchart:&lt;/h3&gt;
  3646. &lt;p&gt;Every last bit of content in the Universe&lt;/p&gt;
  3647. &lt;p&gt;1. Filter: Is the content local news?&lt;/p&gt;
  3648. &lt;p&gt;All local news from since last publication of newspaper&lt;/p&gt;
  3649. &lt;p&gt;2. Filter: Will the content be interesting to the locals?&lt;/p&gt;
  3650. &lt;p&gt;All local news from last publication of the newspaper that reporters/editors think will be interesting&lt;/p&gt;
  3651. &lt;p&gt;3. Filter: What part of the news story should we include?&lt;/p&gt;
  3652. &lt;p&gt;4. Organize: Categorize stories (politics, sports, etc.)&lt;/p&gt;
  3653. &lt;p&gt;All interesting local news now organized by story.&lt;/p&gt;
  3654. &lt;p&gt;5. Display: Print most important stories “above the fold”&lt;/p&gt;
  3655. &lt;p&gt;give examples of how the following filter/organize/display content - new york times, a book, a memetracker (interlinking and link popularity), a personalized social news recommnder (like findory)&lt;/p&gt;
  3656. &lt;p&gt;First filter by far the most important — determains charecter of filter, what this filter is — newspaper we show only local news. this memetracker is about soil erosion news in the midwestern states in the united states. Take filter from infinite possiblities to very finite. Further filtering, organizing, and display is merely a polishing process&lt;/p&gt;
  3657. &lt;p&gt;Call these filters — organizing and display is secondary. They’re just aids to understanding filtered data but once data is gone it is gone and can’t be recreated by the consumer of the filtered content.&lt;/p&gt;
  3658. &lt;p&gt;Every choice of how and when to filter, organize,&lt;/p&gt;
  3659. &lt;p&gt;and display is a reflection of the filter creator’s&lt;/p&gt;
  3660. &lt;p&gt;bias and has implications for what the consumer&lt;/p&gt;
  3661. &lt;p&gt;of the now filtered content will understand,&lt;/p&gt;
  3662. &lt;p&gt;belive, and do.&lt;/p&gt;
  3663. &lt;p&gt;Initial filter follows leader intent from making it stick&lt;/p&gt;
  3664. &lt;p&gt;Filter = remove content&lt;/p&gt;
  3665. &lt;p&gt;organize = sort content or place content in categories&lt;/p&gt;
  3666. &lt;p&gt;display = what content you emphesize and make easily assible… and what content you don’t&lt;/p&gt;
  3667. &lt;p&gt;A small Drupal note. This model fits very well into the views paradigm. I suggest that all content recommendation modules be consolidated within the views framework. For example, memetracker would be an organizer, you could filter by how many days you wanted, sort by interestingness of memes etc.&lt;/p&gt;
  3668. &lt;p&gt;visual of steps of filtering and organizing and displaying news&lt;/p&gt;</content:encoded></item><item><title><![CDATA[It's the culture, some insights on organizational learning]]></title><description><![CDATA[Here’s a great quote from a journal article I’m reading for class. The article nails the problem with most social media / knowledge…]]></description><link>https://bricolage.io/its-culture-some-insights-organizational-learning/</link><guid isPermaLink="false">https://bricolage.io/its-culture-some-insights-organizational-learning/</guid><pubDate>Fri, 26 Sep 2008 04:39:10 GMT</pubDate><content:encoded>&lt;p&gt;Here’s a great quote from a journal article I’m reading for class. The article nails the problem with most social media / knowledge management installations in organizations.&lt;/p&gt;
  3669. &lt;blockquote&gt;
  3670. &lt;p&gt;The difficulty in most knowledge management effort lies in &lt;em&gt;changing organizational culture and people’s work habits&lt;/em&gt;. It lies in getting people to &lt;em&gt;take the time to articulate and share the really good stuff&lt;/em&gt;. If a group of people don’t already share knowledge, don’t already have plenty of contact, don’t already &lt;em&gt;understand what insights and information will be useful to each other&lt;/em&gt;, information technology is not likely to create it. However, most knowledge management efforts treat these cultural issues as secondary, implementation issues. They typically focus on information systems—identifying what information to capture, constructing taxonomies for organizing information, determining access, and so on. &lt;strong&gt;The great trap in knowledge management is using information management tools and concepts to design knowledge management systems.&lt;/strong&gt;&lt;/p&gt;
  3671. &lt;/blockquote&gt;
  3672. &lt;p&gt;Sharing useful knowledge is a skill that few people learn to use effectively. The past year and a half for various reasons I’ve heavily involved myself in the &lt;a href=&quot;http://drupal.org&quot;&gt;Drupal&lt;/a&gt; open source community. One of the most fascinating things I’ve seen and learned from is how members of the community share knowledge. Drupal has a very effective knowledge sharing culture. What I’ve learned is that it’s the &lt;em&gt;people&lt;/em&gt; that make the Drupal culture effective not so much the tools or processes that the Drupal community has created.&lt;/p&gt;
  3673. &lt;p&gt;People who become members of open source communities love to create and share knowledge. The people who are attracted to these kinds of communities have a passion for sharing and collaboratively creating knowledge. Another difference is the incentive structures. Open source communities are &lt;a href=&quot;http://www.communitywiki.org/en/DoOcracy&quot;&gt;do-ocracies&lt;/a&gt;. People have power and influence within the Drupal community because they &lt;em&gt;do&lt;/em&gt; something. They write code, they write documentation, they answer questions in the forums, and so on. People who &lt;em&gt;do&lt;/em&gt; things get the respect and trust of their peers. In open source communities, both the people and the incentive structure encourage knowledge sharing.&lt;/p&gt;
  3674. &lt;p&gt;So even with the twin disadvantages of using relatively unsophisticated collaboration software and that most contributors don’t work closely together; open source communities’ “knowledge management” systems stand as gleaming pillars of success next to the smoking hulks of the many multi-million dollar knowledge management systems developed and abandoned by major corporations. Any organization that wants to develop a strong knowledge sharing culture would do well to study the successes of the many open source communities. Organizations must find or develop the right kind of people and create the right incentive structures.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Memetracker module gets some press]]></title><description><![CDATA[The Memetracker module I worked on this past summer for Google Summer of Code saw some press today. Web Dev News wrote: One of the most…]]></description><link>https://bricolage.io/memetracker-module-gets-some-press/</link><guid isPermaLink="false">https://bricolage.io/memetracker-module-gets-some-press/</guid><pubDate>Wed, 17 Sep 2008 22:08:08 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;http://drupal.org/project/memetracker&quot;&gt;Memetracker module&lt;/a&gt; I worked on this past summer for Google Summer of Code saw some press today. &lt;a href=&quot;http://webdevnews.net/2008/09/memetracker-module-released-for-drupal/&quot;&gt;Web Dev News wrote&lt;/a&gt;:&lt;/p&gt;
  3675. &lt;blockquote&gt;
  3676. &lt;p&gt;One of the most powerful and innovative modules to be developed for Drupal this year is Memetracker. Written by Kyle Mathews in the Google Summer of Code 2008, Memetracker intelligently filters content on a website to synthesize the most popular and important topics and conversations into memes. Similar to the way Google News and TechMeme operate, Memetracker can work with RSS and Atom feeds to track issues, current events, and internet “buzz” across numerous channels simultaneously. The module is a “smart aggregator” that can analyze the actual text of RSS feeds and group posts with related content into categories that can be displayed on a website.&lt;/p&gt;
  3677. &lt;/blockquote&gt;
  3678. &lt;p&gt;&lt;a href=&quot;http://webdevnews.net/2008/09/memetracker-module-released-for-drupal/&quot;&gt;Read the rest.&lt;/a&gt;&lt;/p&gt;
  3679. &lt;p&gt;I still find it rather weird to see my name in print (digital or otherwise) but it’s nice to see the module getting some notice. Drupal and memetracking are a powerful combination for building better communication tools for communities.&lt;/p&gt;
  3680. &lt;p&gt;All developers out there — memetracker is still in alpha and could use your help. If you’d like to help out on development, please &lt;a href=&quot;/contact&quot;&gt;contact me&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My educational philosophy]]></title><description><![CDATA[A book I read recently helped me finger out why school can be so irritating at times. The book is entitled Weird Ideas that Work: 11 1/…]]></description><link>https://bricolage.io/my-educational-philosophy/</link><guid isPermaLink="false">https://bricolage.io/my-educational-philosophy/</guid><pubDate>Wed, 10 Sep 2008 14:43:20 GMT</pubDate><content:encoded>&lt;p&gt;A book I read recently helped me finger out why school can be so irritating at times.&lt;/p&gt;
  3681. &lt;p&gt;The book is entitled &lt;a href=&quot;http://www.amazon.com/Weird-Ideas-That-Work-Sustaining/dp/0743212126&quot;&gt;Weird Ideas that Work: 11 1/2 Practices for Promoting, Managing, and Sustaining Innovation&lt;/a&gt;. One of its “weird ideas” is that companies should hire slow learners. Not stupid people but slow learners of the organization’s code. A code is, the author explains, “a company’s ‘knowledge and faiths,’ its history, memories, procedures, precedents, rules, and all those taken-for-granted, and often unspoken, assumptions about why things are supposed to be done in certain ways.”&lt;/p&gt;
  3682. &lt;p&gt;He goes on to say that most companies hire “fast learners” who quickly learn to do things the “right way” and see things much as others do in the company. But companies that do innovative work need a different kind of worker, one who won’t get “brainwashed into thinking just like everyone else. They need people who avoid, ignore, or reject ‘the heat of the herd…&apos;&quot;&lt;/p&gt;
  3683. &lt;p&gt;How do you find this sort of person? One suggestion he made is to hire smart people with bad grades. He says research has shown that many creative geniuses—including Edison and Darwin—were poor students.&lt;/p&gt;
  3684. &lt;blockquote&gt;
  3685. &lt;p&gt;Creativity researcher Dean Keith Simonton points out: “To obtain high marks in school often requires a high degree of conformity to conventional ways of looking at the world and people.” People who get good grades are often fast learners of social cues. By contrast, smart people who get bad grades are listening to their inner voice, doing &lt;em&gt;what they believe is interesting and right&lt;/em&gt;. Simonton observes that “one of the reasons creative talents often dislike school is that it can interfere with &lt;em&gt;what they really want to know&lt;/em&gt;. When faced with the choice of reading a good book or studying for an exam, the extracurricular but still instructive diversion may win out.” [italics mine]&lt;/p&gt;
  3686. &lt;/blockquote&gt;
  3687. &lt;p&gt;School irritates me because I’m often told by teachers to do things and learn things I don’t think are valuable. I have strong opinions about where I’m going and what I need to know to get there. When demands from school align with my own interests, things go well. But when they clash, school loses out.&lt;/p&gt;
  3688. &lt;p&gt;One of my guiding principles is maintaining control of my own destiny. I cede control of my experiences only to those with whom I have an unusual amount of trust. The trust threshold a person must meet before I’m willing to give up control varies upon the importance of the activity but for learning especially, it is very high. There is nothing more important than what I know, what I think, and especially how I think. My thoughts are my destiny. And when I let someone influence my thoughts, my destiny partially becomes theirs. And there are very few teachers indeed with whom I want to share destinies.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What is the key metric to measure Learning2.0?]]></title><description><![CDATA[This was a comment I left on Jon Mott’s blog post, Getting From Here to There. Jon is an Academic Technology Strategist here at BYU who…]]></description><link>https://bricolage.io/what-key-metric-measure-learning20/</link><guid isPermaLink="false">https://bricolage.io/what-key-metric-measure-learning20/</guid><pubDate>Fri, 18 Jul 2008 21:57:59 GMT</pubDate><content:encoded>&lt;p&gt;This was a comment I left on Jon Mott’s blog post, &lt;a href=&quot;http://www.jonmott.com/blog/?p=17#comment-937077&quot;&gt;Getting From Here to There&lt;/a&gt;. Jon is an Academic Technology Strategist here at &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt; who shares my enthusiasm for using web2.0 tools in the classroom.&lt;/p&gt;
  3689. &lt;p&gt;I think a critical tool to have in building and proselytizing learning 2.0 tools is a key metric. This metric would be used to guide building decisions and to measure success.&lt;/p&gt;
  3690. &lt;p&gt;In the book “Good to Great”, an important event in the transitions of good companies to great companies was identifying a key metric or denominator as the book calls it.&lt;/p&gt;
  3691. &lt;p&gt;The process of picking and using this denominator served as a mechanism to push deeper understanding of the company’s economic engine. The companies asked themselves this question “If we could only pick one and only one ratio — profit per x — to systematically increase over time, what x would have the greatest and most sustainable impact on our economic engine?&lt;/p&gt;
  3692. &lt;p&gt;Wells Fargo went through this process during bank deregulation:&lt;/p&gt;
  3693. &lt;blockquote&gt;
  3694. &lt;p&gt;“Consider Wells Fargo. When the Wells team confronted the brutal fact that deregulation would transform banking into a commodity, they realized that standard banker metrics, like profit per loan and profit per deposit, would no longer be the key drivers. Instead, they grasped a new denominator: &lt;em&gt;profit per employee&lt;/em&gt;. Following this logic, Wells Fargo became one of the first banks to change its distribution to rely primarily on stripped-down branches and ATMs.”&lt;/p&gt;
  3695. &lt;/blockquote&gt;
  3696. &lt;p&gt;Because Wells Fargo understood their key economic drivers, they were able to a) encapsulate this logic through identifying a new denominator and b) use this logic to make many highly successful changes.&lt;/p&gt;
  3697. &lt;p&gt;So my question is what are the key drivers of BYU’s (and other school’s) learning engine? What denominator or key metric offers the best insight as we plan / build / measure / proselyte new online technologies in education?&lt;/p&gt;
  3698. &lt;p&gt;My suggestion would be conversations on learning topics per student per day.&lt;/p&gt;
  3699. &lt;p&gt;I love Robert Scoble’s (social media figure) goal to &lt;a href=&quot;http://scobleizer.com/2008/04/10/not-productive-enough-turn-off-the-internet/&quot;&gt;have an interesting conversation every day&lt;/a&gt;. Conversations with others seems an important key to learning almost anything.&lt;/p&gt;
  3700. &lt;p&gt;My best educational experience by far here at BYU was the Information Systems Junior Core — It’s 24 credits over two semesters. I was placed in a group of four and spent eight hours a week sitting next to my group members. Almost all of our projects were group projects and those that weren’t we often ended up working together anyways. Everything about the core was designed to push us students to talk to one another. A mailing list was set up for the ~110 students in the core. It saw heavy usage with students asking / answering questions about all sorts of class / ISys related questions.&lt;/p&gt;
  3701. &lt;p&gt;The effect of all this was conversation, lots of it. Because of these conversations (and great professors / projects) I learned far more and I had much more fun than in other classes here. We talked so much about ISys / non ISys topics that many of us became good friends. I looked forward to class because I was going to see my friends.&lt;/p&gt;
  3702. &lt;p&gt;By comparison, in most other classes I learn in isolation. I don’t get to know other students very well so I don’t talk much with them about the subject so I learn less and the class is much more boring.&lt;/p&gt;
  3703. &lt;p&gt;My take on all this is we learn best with friends who are striving to become what we are striving to become.&lt;/p&gt;
  3704. &lt;p&gt;Obviously not every classroom experience at BYU can hope to replicate what’s done in the ISys Junior Core but I think much could be improved. The types of assignments given (e.g. more group work) and the integration of social software tools that make it easier for students and professors to connect online and offline would do much to help more conversations happen at BYU which would dramatically increase the quality and quantity of education.&lt;/p&gt;
  3705. &lt;p&gt;What do you all think?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A unit testing success story]]></title><description><![CDATA[This summer I was accepted to Google Summer of Code to build a memetracker application for Drupal. I want the Memetracker module to…]]></description><link>https://bricolage.io/a-unit-testing-success-story/</link><guid isPermaLink="false">https://bricolage.io/a-unit-testing-success-story/</guid><pubDate>Tue, 01 Jul 2008 21:46:58 GMT</pubDate><content:encoded>&lt;p&gt;This summer I was accepted to &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_Summer_of_Code&quot;&gt;Google Summer of Code&lt;/a&gt; to &lt;a href=&quot;/blog/2008/04/21/ive-been-accepted-to-google-summer-of-code&quot;&gt;build a memetracker application&lt;/a&gt; for &lt;a href=&quot;http://drupal.org&quot;&gt;Drupal&lt;/a&gt;.&lt;/p&gt;
  3706. &lt;p&gt;I want the &lt;a href=&quot;http://drupal.org/project/memetracker&quot;&gt;Memetracker module&lt;/a&gt; to facilitate online conversations amongst distributed communities. For my dream to become reality, Memetracker will need help from many talented developers. This summer I’ll be setting a solid foundation for future development of the memetracker module. One important thing I’ll be doing is writing unit tests for all the functions of the memetracker. Unit tests, I’m convinced, is one thing Memetracker needs in order to ensure its long term success.&lt;/p&gt;
  3707. &lt;p&gt;Unit tests are at the heart of &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot;&gt;Test Driven Development (TDD)&lt;/a&gt;. TDD and unit tests when used have been shown to improve the quality of code and reduce bugs and regressions (see this &lt;a href=&quot;http://www.lullabot.com/articles/introduction-unit-testing&quot;&gt;excellent post&lt;/a&gt; by &lt;a href=&quot;http://robshouse.net/&quot;&gt;Robert Douglass&lt;/a&gt; for a full introduction to unit testing).&lt;/p&gt;
  3708. &lt;p&gt;My brother &lt;a href=&quot;http://www.linkedin.com/in/benjaminmathews&quot;&gt;Ben&lt;/a&gt; is a software engineer and has long preached to me the benefits of unit tests and TDD. When I started programming Memetracker, I agreed in principle with the benefits of unit tests but as I wanted to see something working more than write boring test code, I just dived into the coding without writing any unit tests. But as the lines of code accumulated and the complexity grew, weird bugs started cropping up and having a solid coverage of unit tests as a safety net started sounding better and better.&lt;/p&gt;
  3709. &lt;p&gt;So I stopped coding and spent a day studying unit testing and &lt;a href=&quot;http://drupal.org/project/simpletest&quot;&gt;SimpleTest&lt;/a&gt; (the testing framework Drupal uses). There was a painful learning curve to wrap my head around the concepts but just a few days of coding with unit tests has made me a convert.&lt;/p&gt;
  3710. &lt;p&gt;A quick example of how SimpleTest has helped me improve the quality of my code.&lt;/p&gt;
  3711. &lt;p&gt;Memetracker tries to present to readers the most interesting memes (conversations around a topic) to readers on a web page. To learn which memes are interesting, Memetracker records the articles people click on from the memebrowsing page. By counting clicks, memetracker can calculate an interestingness score for the different memes and from that score, determine which memes to display and in what order.&lt;/p&gt;
  3712. &lt;p&gt;When a person clicks on a article, that information is sent from the browser to the memetracker module. In memetracker.module is a function, memetracker_set_click(), which saves the click information to a table in the database.&lt;/p&gt;
  3713. &lt;p&gt;I wanted to make sure this function works correctly so I wrote a unit test which sent a fake click to the memetracker_set_click function and then tested that the click was actually saved to the database.&lt;/p&gt;
  3714. &lt;p&gt;So I wrote the test… and it worked!&lt;/p&gt;
  3715. &lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/82268668@N00/2625633427/&quot; title=&quot;click_test by kylenumber5, on Flickr&quot;&gt;&lt;span
  3716.      class=&quot;gatsby-resp-image-wrapper&quot;
  3717.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 436px; &quot;
  3718.    &gt;
  3719.      &lt;a
  3720.    class=&quot;gatsby-resp-image-link&quot;
  3721.    href=&quot;/static/26705713de493e77942775425b45ffa5/8574c/2625633427_4fa80978a2_o.png&quot;
  3722.    style=&quot;display: block&quot;
  3723.    target=&quot;_blank&quot;
  3724.    rel=&quot;noopener&quot;
  3725.  &gt;
  3726.    &lt;span
  3727.    class=&quot;gatsby-resp-image-background-image&quot;
  3728.    style=&quot;padding-bottom: 9.45945945945946%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZUlEQVR42l2MSxZAMBAE3f8MzCTE5xocyBOSrJg2iYXHol5tuqsa0wQKDJtamGg/cFAn9WFAuykbJ32hOx1sbNHLABLGLAsgQDXEEbUnkH9OOcLZSrOxxixI3awE1o273mDe/oM3BHaCvJm/cUQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  3729.  &gt;&lt;/span&gt;
  3730.  &lt;img
  3731.        class=&quot;gatsby-resp-image-image&quot;
  3732.        alt=&quot;click_test&quot;
  3733.        title=&quot;&quot;
  3734.        src=&quot;/static/26705713de493e77942775425b45ffa5/8574c/2625633427_4fa80978a2_o.png&quot;
  3735.        srcset=&quot;/static/26705713de493e77942775425b45ffa5/12f09/2625633427_4fa80978a2_o.png 148w,
  3736. /static/26705713de493e77942775425b45ffa5/e4a3f/2625633427_4fa80978a2_o.png 295w,
  3737. /static/26705713de493e77942775425b45ffa5/8574c/2625633427_4fa80978a2_o.png 436w&quot;
  3738.        sizes=&quot;(max-width: 436px) 100vw, 436px&quot;
  3739.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3740.        loading=&quot;lazy&quot;
  3741.        decoding=&quot;async&quot;
  3742.      /&gt;
  3743.  &lt;/a&gt;
  3744.    &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
  3745. &lt;p&gt;But wait a second — I thought — it shouldn’t of worked. To save the click data a memetracker object has to be loaded which then does the actual saving of the click information. But when I wrote the unit test, I had made up an id for the memetracker object. All information for different memetracker objects are stored in the database (one website can have multiple memetrackers). If a memetracker didn’t exist in the database, it shouldn’t be loaded.&lt;/p&gt;
  3746. &lt;p&gt;I had already written some code to validate that a memetracker object existed before loading but somehow that validation wasn’t working. I looked at the validation code and quickly found the problem. Problem solved, and to ensure this didn’t happen again I wrote a new unit test to ensure my validation code works correctly in the future.&lt;/p&gt;
  3747. &lt;p&gt;Unit tests are valuable for any coding project longer than a few lines. Once you get past the learning curve, writing new tests are easy. And it’s a great feeling after making changes to run my tests and know in seconds everything is still working as it should.&lt;/p&gt;
  3748. &lt;p&gt;To learn more about unit testing, read &lt;a href=&quot;http://www.lullabot.com/about/angiebyron&quot;&gt;Angie Bryon’s (webchick)&lt;/a&gt; great blog post about how &lt;a href=&quot;http://www.lullabot.com/articles/drupal-module-developer-guide-simpletest&quot;&gt;unit tests let you to refactor without fear&lt;/a&gt;. The Lullabot crew had a &lt;a href=&quot;http://www.lullabot.com/audiocast/podcast-59-simpletest&quot;&gt;recent podcast&lt;/a&gt; on the wonders of unit testing. And lastly, there’s some great documentation being collected &lt;a href=&quot;http://groups.drupal.org/node/11020&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
  3749. &lt;p&gt;Happy unit testing!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Announcing the first alpha release of the Drupal Memetracker module]]></title><description><![CDATA[I recently made my first alpha release of the Drupal Memetracker module. You can download it from the project page on the Drupal community…]]></description><link>https://bricolage.io/announcing-first-alpha-release-drupal-memetracker-module/</link><guid isPermaLink="false">https://bricolage.io/announcing-first-alpha-release-drupal-memetracker-module/</guid><pubDate>Tue, 01 Jul 2008 21:26:22 GMT</pubDate><content:encoded>&lt;p&gt;I recently made my first alpha release of the Drupal Memetracker module. You can download it from the &lt;a href=&quot;http://drupal.org/project/memetracker&quot;&gt;project page&lt;/a&gt; on the Drupal community site.&lt;/p&gt;
  3750. &lt;p&gt;An screenshot from the latest code:&lt;/p&gt;
  3751. &lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/82268668@N00/2616168771/&quot; title=&quot;Screenshot 6/27/08 by kylenumber5, on Flickr&quot;&gt;&lt;span
  3752.      class=&quot;gatsby-resp-image-wrapper&quot;
  3753.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  3754.    &gt;
  3755.      &lt;a
  3756.    class=&quot;gatsby-resp-image-link&quot;
  3757.    href=&quot;/static/1cbe35120ae20cf7acd4d7098b7f9b15/3075e/2616168771_136c8c3e4a_o.png&quot;
  3758.    style=&quot;display: block&quot;
  3759.    target=&quot;_blank&quot;
  3760.    rel=&quot;noopener&quot;
  3761.  &gt;
  3762.    &lt;span
  3763.    class=&quot;gatsby-resp-image-background-image&quot;
  3764.    style=&quot;padding-bottom: 89.86486486486487%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAACvElEQVR42o1UaU/bQBDN//8pbT9QqVVBrVSQKJRCwhVy+L5jO3HsENuJr7zObEggJaisNJ6dPZ7neDut1WqF5XKJaBpjEk0xTWZYLJbYN/jsW7IZLf5k80fcXZ6jd3uNwW0HoW1iVeQo05mQYhahnMeolzn+N1oNoVfLBUYPl+idfEH352fcHH1E79d3GPdtqNe/oXbOoVydwpH760gmY5IJxuPxVpqmWQOyu0VZwvMDDIcDkiEkqQ9ZHsKwbDjeCIbtirntkNZ1GIYBVVWhaZqQMAy3YYuQ8zyHqshiU9d0mKYlLpiGCY20LEkCSJZl2tegKIoQBjZNUwBuQ2bkxYJC9jxE0QSe68Ejr0YjD67rwvd9mo8QkHYchy6PEYSBWPPoTpIkiOP42UOeVBRymuUoipLCL8QPFsu1TrMMaZpinmbIKBKWubBTcaesajDWptAtTmZVVcIIxxOYlCufQuCcxkSh94zVTpVfADqqhN7lGdS7Kwyv/8AZdpGFLvIowHxkIvUtpIGNma2Qdta2b6OhqPYCxtINrNOv0I8PYJ8dIuheIHENPIaUK1dH4ujCnpoSZp6JxDMQ03qePm69FIA1AfJCRjm761zg6ux4W0mNKs6UUbnihgWdbM20Sdtrm/YmUfTMw50cUu5sm/nmwDLXlOHKMmVMg8V4El2s2ZZFTHCIdtlzlV96mFARmA4+0yQISPuCLkHgi9fgELEFdQL6MXnmPtlxnOz3kHk36PehyAq9liGFrIq5LMlky7Q3QK/XEwTns/xT5m1JtNspSl3XaMhF9rQsChTUfViX1ZqXfKEgm18Ud6aS1l52mJ1uswHc5dPq1cF/29Sb7YuNkroNt6k6n6PKZmiqQsybRYo6e0Tzjrb1qn05D220jz6hffgBnR8HuD/5Bq3bgUyti4keUCE4Z/uE2bGJ8i+MrVSY7dyUiQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  3765.  &gt;&lt;/span&gt;
  3766.  &lt;img
  3767.        class=&quot;gatsby-resp-image-image&quot;
  3768.        alt=&quot;Screenshot 6/27/08&quot;
  3769.        title=&quot;&quot;
  3770.        src=&quot;/static/1cbe35120ae20cf7acd4d7098b7f9b15/fcda8/2616168771_136c8c3e4a_o.png&quot;
  3771.        srcset=&quot;/static/1cbe35120ae20cf7acd4d7098b7f9b15/12f09/2616168771_136c8c3e4a_o.png 148w,
  3772. /static/1cbe35120ae20cf7acd4d7098b7f9b15/e4a3f/2616168771_136c8c3e4a_o.png 295w,
  3773. /static/1cbe35120ae20cf7acd4d7098b7f9b15/fcda8/2616168771_136c8c3e4a_o.png 590w,
  3774. /static/1cbe35120ae20cf7acd4d7098b7f9b15/3075e/2616168771_136c8c3e4a_o.png 621w&quot;
  3775.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  3776.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3777.        loading=&quot;lazy&quot;
  3778.        decoding=&quot;async&quot;
  3779.      /&gt;
  3780.  &lt;/a&gt;
  3781.    &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
  3782. &lt;p&gt;A quick refresher on what my project is all about taken from my &lt;a href=&quot;/drupal-memetracker-module-my-google-summer-of-code-application/&quot;&gt;original proposal&lt;/a&gt; to Google Summer of Code.&lt;/p&gt;
  3783. &lt;blockquote&gt;
  3784. &lt;h3 id=&quot;memetracker--smart-aggregator&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#memetracker--smart-aggregator&quot; aria-label=&quot;memetracker  smart aggregator permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;memetracker = smart aggregator:&lt;/h3&gt;
  3785. &lt;p&gt;An aggregator is software like Drupal Planet or PlanetPlanet that aggregates related content from many sources to display in a central location. But current aggregators are dumb. The dumb aggregator knows no better than to pull in new content and order it chronologically.&lt;/p&gt;
  3786. &lt;p&gt;A memetracker is a smart aggregator. It also knows how to pull in new content as a dumb aggregator but it’s much smarter about how it displays the content. It can analyze the text of the content and know which authors are talking about the same topic and then group them together. But not only will the smart aggregator group similar topics but it will also learn what topics and authors are most interesting to members of the community and display those first. No more will you have to scroll through a long list of content skipping over content you’re not interested in but instead, new content will be nicely organized by meme and interestingness in a neat compact form.&lt;/p&gt;
  3787. &lt;/blockquote&gt;
  3788. &lt;p&gt;To join in the work of building an open source memetracker, join the &lt;a href=&quot;http://groups.drupal.org/memetracker&quot;&gt;Memetracker group&lt;/a&gt; at groups.drupal.org.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Excellence, creativity, innovation]]></title><description><![CDATA[I’ve been thinking a lot lately about excellency. What it means to be excellent and how to get there. I haven’t come to any firm conclusions…]]></description><link>https://bricolage.io/excellence-creativity-innovation/</link><guid isPermaLink="false">https://bricolage.io/excellence-creativity-innovation/</guid><pubDate>Sat, 17 May 2008 15:12:59 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been thinking a lot lately about excellency. What it means to be excellent and how to get there. I haven’t come to any firm conclusions but I wanted to quote a number of resources that have contributed to my thinking blah blah blah&lt;/p&gt;
  3789. &lt;p&gt;How to educate yourself to do something excellent —&lt;/p&gt;
  3790. &lt;p&gt;seth goodin — best jobs don’t take resumes, Great jobs, world class jobs, jobs people kill for… those jobs don’t get filled by people emailing in resumes. Ever.&lt;/p&gt;
  3791. &lt;p&gt;&lt;a href=&quot;http://sethgodin.typepad.com/seths_blog/2008/03/why-bother-havi.html&quot;&gt;http://sethgodin.typepad.com/seths_blog/2008/03/why-bother-havi.html&lt;/a&gt;&lt;/p&gt;
  3792. &lt;p&gt;these people don’t exist, anything innovative will get you pushback,&lt;/p&gt;
  3793. &lt;p&gt;&lt;a href=&quot;http://money.cnn.com/2008/04/29/magazines/fortune/larry_page_change_the_world.fortune/index3.htm&quot;&gt;http://money.cnn.com/2008/04/29/magazines/fortune/larry_page_change_the_world.fortune/index3.htm&lt;/a&gt;&lt;/p&gt;
  3794. &lt;p&gt;deliberate practice (from freckonomics report),&lt;/p&gt;
  3795. &lt;p&gt;&lt;a href=&quot;http://freakonomics.blogs.nytimes.com/2008/03/11/how-did-a-rod-get-so-good/&quot;&gt;http://freakonomics.blogs.nytimes.com/2008/03/11/how-did-a-rod-get-so-good/&lt;/a&gt;&lt;/p&gt;
  3796. &lt;p&gt;money in entrapreneurship comes in spurts —Steve Pavalina&lt;/p&gt;
  3797. &lt;p&gt;Confront the Brutal facts (yet never lose faith)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I deleted /bin]]></title><description><![CDATA[I was stupid tonight. I recently converted an old computer of mine into a Linux server. A file / web / whatever server. I picked up a 250 GB…]]></description><link>https://bricolage.io/i-deleted-bin/</link><guid isPermaLink="false">https://bricolage.io/i-deleted-bin/</guid><pubDate>Sat, 17 May 2008 15:12:59 GMT</pubDate><content:encoded>&lt;p&gt;I was stupid tonight. I recently converted an old computer of mine into a Linux server. A file / web / whatever server. I picked up a 250 GB hard drive to hold the Linux web server files and other stuff and planned to convert the original 80 GB hard drive so to be able to back up the files on my laptop there.&lt;/p&gt;
  3798. &lt;p&gt;I tried to delete /bin but not remembering the hard drives path was /media/backup I deleted /bin instead of /media/backup/bin. The server’s programs not the unneeded directory from the old hard drive. For those familiar with the Linux Enviorment, the closest equivalent is deleting the Program Files directory in Windows.&lt;/p&gt;
  3799. &lt;p&gt;My current plan is the follow the &lt;a href=&quot;http://www.ubuntuforums.org/showthread.php?t=330252&amp;#x26;highlight=deleted+%2Fbin&quot;&gt;advice I found on the Ubuntu forums&lt;/a&gt; and boot the computer off a live cd, mount the hard drive, and then copy the /bin from the cd to the hard drive. Hopefully that’ll work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to become an expert]]></title><description><![CDATA[I’m a big fan of Steven Covey’s “Seven Habits of Highly Effective People” and of th freakonomics blog so when I made a connection today…]]></description><link>https://bricolage.io/how-become-expert/</link><guid isPermaLink="false">https://bricolage.io/how-become-expert/</guid><pubDate>Sat, 17 May 2008 15:12:59 GMT</pubDate><content:encoded>&lt;p&gt;I’m a big fan of Steven Covey’s “Seven Habits of Highly Effective People” and of th freakonomics blog so when I made a connection today between the two, I knew I had to blog about it.&lt;/p&gt;
  3800. &lt;p&gt;A fundemental principle in Covey’s book is that private victory must proceed public victory.&lt;br&gt;
  3801. 1. Focus on technique as opposed to outcome.&lt;br&gt;
  3802. 2. Set specific goals.&lt;br&gt;
  3803. 3. Get good, prompt feedback, and use it.&lt;/p&gt;
  3804. &lt;p&gt;Don’t become an expert by trying to become an expert. You become an expert by molding yourself until you acquire the attributes of an expert. Then, naturally - almost without anymore effort on your part, people will recognize you as an expert.&lt;/p&gt;
  3805. &lt;p&gt;It’s a very common pattern for a young start-up to come out with an amazing new product and for the business press to wander how the start-up became so good so quickly. This ignores the years of trial and effort the start-up went through to get where it is.&lt;/p&gt;
  3806. &lt;p&gt;What do I take from this? I want to do great things in my life. How will I do this? Not by setting out tomorrow on some great task (don’t focus on the outcome) but by practicing basic techniques. Understanding myself, writing, reading, social skills, etc.&lt;br&gt;
  3807. By mastering the skils of greatness, then naturally I’ll be able to do great things.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My beef with the chief]]></title><description><![CDATA[The above is meant to be a slightly snapier introduction to my rant today about hierarchies.]]></description><link>https://bricolage.io/my-beef-with-chief/</link><guid isPermaLink="false">https://bricolage.io/my-beef-with-chief/</guid><pubDate>Sat, 17 May 2008 15:12:59 GMT</pubDate><content:encoded>&lt;p&gt;The above is meant to be a slightly snapier introduction to my rant today about hierarchies.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[school and learning]]></title><description><![CDATA[I care a lot about learning. And I’ve thought a lot about it. Why I want to learn, how I learn best, and why it seems I often don’t learn…]]></description><link>https://bricolage.io/school-and-learning/</link><guid isPermaLink="false">https://bricolage.io/school-and-learning/</guid><pubDate>Sat, 17 May 2008 15:12:59 GMT</pubDate><content:encoded>&lt;p&gt;I care a lot about learning. And I’ve thought a lot about it. Why I want to learn, how I learn best, and why it seems I often don’t learn. It’s an often quoted piece of wisdom that you learn the most when you fail. In the same way, you can improve the quality of your work on something by examining what parts you do poorly and improving those. As that is where your model or methodolgy for doing whatever is breaking down.&lt;/p&gt;
  3808. &lt;p&gt;Schooling has long been the least productive source of learning for me. College, thankfully, does much better then high school — therefore somewhat justifying the thousands of dollars they take from me each year. but still has weaknesses.&lt;/p&gt;
  3809. &lt;p&gt;I started reading a fascinating book this morning called “The Cluetrain”[add link]. What it was about is a subject for a different blog post, however it brought up the old irritiation I have with schools. Teaching done at school has several problems. Slow methods of learning - lecture, poorly motivated students that most be spoon-fed knowledge and/or students so drunken[think of better word] by schooling system that doesn’t encourage in the slightest independent learning/thinking that they can’t learn by themselves, and/or professors that don’t teach well.&lt;/p&gt;
  3810. &lt;p&gt;I measure learning by “ah hah” moments. Those times, when your reading or thinking about something and the pieces come together and your understanding crystalizes. These are like little shots of drugs to keep me going. It seems these moments come few and far between at school and much more often when learning by myself or with other like-minded people.&lt;/p&gt;
  3811. &lt;p&gt;Why? I learn things faster so often bored when professor going over things I already understand. Talking very slow way of transmiting knowledge as compared to reading. biggest thing to me is perspective.&lt;/p&gt;
  3812. &lt;p&gt;We learn things by looking at stuff from different perspectives. How often is there something you know, think you understand it very well but then talk to someone who understands it differently [think of concrete example] and all of a sudden you understand it so much better.&lt;/p&gt;
  3813. &lt;p&gt;It’s the difference between 2D and 3D. It’s like the difference on a movie between a static shot and a sweeping panoramic shot of a say a house. It’s the difference between trying to figure the height of a house from one [what is an example that people commonly grapple with or have experienced?] shot or 20 from all different angles and distances.&lt;/p&gt;
  3814. &lt;p&gt;If you only read liberal or conservative political commentary, how well will you truely understand issuies as compared to reading from a variety of sources?&lt;/p&gt;
  3815. &lt;p&gt;Professors only teach from one side of an issuie most of the time whether purposely or not. It’s hard to understand. Learning about project management. Textbook/professor has authoritative this is how it is. No nuance no subtiltiy. Just from my own little expereince in world know most projects aren’t managed like that.&lt;/p&gt;
  3816. &lt;p&gt;Being a bit unfair. What I’m learning does have some practical value. It just seems it’s undigested. I get this big ball of knowledge thrown in my lap and I have to do the hard work of unravelinging it and making connections from it. It seems to me that something well-written books and excellent teaching have in common is they help you make connections. The World Wide &lt;em&gt;Web&lt;/em&gt; is an excellent way of organizing information because it mimics how our brains stores and processes information. Think about the last time you had or read a really exciting idea. It explodes in your mind. Immediately you mind races making connections, oh, that is like this, that explains better this process, we can use that to improve such-and-such that we are doing.&lt;/p&gt;
  3817. &lt;p&gt;I like to think of our brain as an intricate web of little nuggets of knowledge with thousands of connections strewn between them forming uncountable number of connections. As we think and reason, we sail along the webs between all the different knowledge and experiences we’ve had and build up a whatever.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ubuntu meta-packages website]]></title><description><![CDATA[I watched the recent introduction of ubuntu-studio recently with great interest. Anyone who wants to have an audio/graphic/video Linux…]]></description><link>https://bricolage.io/ubuntu-meta-packages-website/</link><guid isPermaLink="false">https://bricolage.io/ubuntu-meta-packages-website/</guid><pubDate>Sat, 17 May 2008 15:12:59 GMT</pubDate><content:encoded>&lt;p&gt;I watched the recent introduction of ubuntu-studio recently with great interest. Anyone who wants to have an audio/graphic/video Linux workstation can now just download Ubuntu Studio. That’s great because it helps remove one barrier to using Linux — figuring out what software to use.&lt;/p&gt;
  3818. &lt;p&gt;Many new Linux users are confused about what software to use. It’s great that there are some 20,000 software packages now available in the Ubuntu repositories — but how is the poor new user to find the software that does what they need? Separate the grain from the chaff so to speak.&lt;/p&gt;
  3819. &lt;p&gt;So Ubuntu Studio is a recommend package list. The creators of Ubuntu Studio say that these are the best Linux programs to do these tasks — whether that be graphics, audio, or video editing. Then they make it simple to install by providing a DVD with the software or a meta-package that people can download from the Ubuntu repositories.&lt;br&gt;
  3820. I had a thought — what if there were meta-packages for every task. Meta-packages for stuff like web-development, games, java programming, music listening, school work, statistical analysis, kernel hacking, etc. For any imaginable task.&lt;br&gt;
  3821. Put these meta-packages on a website. Then visitors would rank, review, etc. Visitors could browse meta-packages by category, order by rankings, number of reviews, number of downloads and so forth.&lt;/p&gt;
  3822. &lt;p&gt;Once a visitor found a package they wanted. They’d click install. The file to download would be XML encoded with the programs to install. In Ubuntu, there’d be a nice GUI that’d intercept the xml and install the programs as normal via apt-get.&lt;/p&gt;
  3823. &lt;p&gt;I think this would be very simple but effective way for introducing the great Linux software available.&lt;br&gt;
  3824. What do you think? Would this help you?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Never update your resume again (just your blog)]]></title><description><![CDATA[I’ve written before how your blog can replace your resume but I enjoyed reading another blogger’s experience. I haven’t had the chance yet…]]></description><link>https://bricolage.io/never-update-your-resume-again/</link><guid isPermaLink="false">https://bricolage.io/never-update-your-resume-again/</guid><pubDate>Sat, 17 May 2008 13:22:14 GMT</pubDate><content:encoded>&lt;p&gt;I’ve &lt;a href=&quot;/why-i-blog-part-2/&quot;&gt;written before how your blog can replace your resume&lt;/a&gt; but I enjoyed reading another blogger’s experience. I haven’t had the chance yet to send my blog url instead of a resume but I have been contacted about a job once directly because of what I’ve written here and elsewhere.&lt;/p&gt;
  3825. &lt;blockquote&gt;
  3826. &lt;p&gt;I hated updating my resume. It is such a brilliantly inefficient medium to communicate your value proposition.&lt;/p&gt;
  3827. &lt;p&gt;Now when situations of resumes arise, I send the url for the blog. The longer it exists the more valuable it becomes as a alternative resume.&lt;/p&gt;
  3828. &lt;p&gt;On blogs you can’t fake it (atleast not for a very long time) and it so perfectly reflects your intelligence, your character, your values, your smarts (or lack there of) and so on and so forth. You can “fake” the piece of paper, you can’t fake a blog.&lt;/p&gt;
  3829. &lt;p&gt;Of course the flip side is also true. If you have a great blog you might not have to go look for a job. They’ll come find you. I am sure all the bloggers in our space get at least two job offers a week. :)&lt;/p&gt;
  3830. &lt;p&gt;And here is perhaps the nicest benefit of having your own blog (and making sure your potential new employer has it and has sent it to the interview committee): They won’t ask you silly questions.&lt;/p&gt;
  3831. &lt;p&gt;They have a good idea of who you actually are and smart interviewers just get to the point. And that is a good thing.&lt;/p&gt;
  3832. &lt;/blockquote&gt;
  3833. &lt;p&gt;&lt;a href=&quot;http://www.kaushik.net/avinash/2008/05/benefits-of-blogging-a-practitioners-perspective.html&quot;&gt;Read the whole thing.&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I've been accepted to Google Summer of Code]]></title><description><![CDATA[I’m very excited to announce that I’ve been accepted to participate in the Google Summer of Code program. I will be writing memetracking…]]></description><link>https://bricolage.io/ive-been-accepted-to-google-summer-of-code/</link><guid isPermaLink="false">https://bricolage.io/ive-been-accepted-to-google-summer-of-code/</guid><pubDate>Tue, 22 Apr 2008 03:59:17 GMT</pubDate><content:encoded>&lt;p&gt;I’m very excited to announce that I’ve been accepted to participate in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_Summer_of_Code&quot;&gt;Google Summer of Code&lt;/a&gt; program. I will be writing &lt;a href=&quot;http://en.wikipedia.org/wiki/Memetracker&quot;&gt;memetracking&lt;/a&gt; software that will enable anyone to set up a &lt;a href=&quot;http://news.google.com&quot;&gt;Google News&lt;/a&gt; or &lt;a href=&quot;http://techmeme.com&quot;&gt;Techmeme&lt;/a&gt; like site on any topic. Do you want to develop a news site following economic news? You can with my software. Do you want a site that tracks the latest Facebook Application development news? You can do that with my software. &lt;a href=&quot;/drupal-memetracker-module-my-google-summer-of-code-application/&quot;&gt;Read my full application&lt;/a&gt; for more about what the memetracker will do.&lt;/p&gt;
  3834. &lt;p&gt;A big thanks to those who will be helping me write this software. First to Google who sponsors the Summer of Code program. Then to my mentors from the &lt;a href=&quot;http://drupal.org&quot;&gt;Drupal&lt;/a&gt; community (&lt;a href=&quot;http://www.funnymonkey.com/&quot;&gt;Bill Fitzgerald&lt;/a&gt;, &lt;a href=&quot;http://wundo.net/&quot;&gt;Fabiano Sant’Ana&lt;/a&gt;, and &lt;a href=&quot;http://scotthadfield.ca/&quot;&gt;Scott Hadfield&lt;/a&gt;). Then the &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt; Professors who’ve volunteered to help me (&lt;a href=&quot;https://cs.byu.edu/faculty/giraudcarrier_christophe&quot;&gt;Christophe Giraud-Carrier&lt;/a&gt; and &lt;a href=&quot;http://axon.cs.byu.edu/Dan/&quot;&gt;Dan Ventura&lt;/a&gt;) and Ph.D student &lt;a href=&quot;http://dml.cs.byu.edu/~smitty/&quot;&gt;Matt Smith&lt;/a&gt;.&lt;/p&gt;
  3835. &lt;p&gt;It’s going to be a great summer! I’ll be posting updates on this blog as summer rolls on.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Assorted Links]]></title><description><![CDATA[I think I’m going to start doing “link posts” more often. I run into content I think I should write about here but then never have time to…]]></description><link>https://bricolage.io/assorted-links/</link><guid isPermaLink="false">https://bricolage.io/assorted-links/</guid><pubDate>Thu, 17 Apr 2008 18:43:26 GMT</pubDate><content:encoded>&lt;p&gt;I think I’m going to start doing “link posts” more often. I run into content I think I should write about here but then never have time to write a full-blown post. Onto the links.&lt;/p&gt;
  3836. &lt;p&gt;&lt;a href=&quot;http://www.boingboing.net/2007/06/21/clay-shirky-defends-.html&quot;&gt;Clay Shirky says Internet reduces needs for “experts” by lowering transaction costs&lt;/a&gt;&lt;/p&gt;
  3837. &lt;blockquote&gt;
  3838. &lt;p&gt;“Experts the world over have been shocked to discover that they were consulted not as a direct result of their expertise, but often as a secondary effect --- the apparatus of credentialing made finding experts easier than finding amateurs, even when the amateurs knew the same things as the experts.”&lt;/p&gt;
  3839. &lt;/blockquote&gt;
  3840. &lt;p&gt;&lt;a href=&quot;http://www.classroom20.com/profiles/blog/show?id=649749%3ABlogPost%3A115854&quot;&gt;Web 2.0 Is the Future of Education&lt;/a&gt;&lt;/p&gt;
  3841. &lt;p&gt;Lists 10 cultural trends which is pushing education towards a web2.0 model&lt;/p&gt;
  3842. &lt;p&gt;&lt;a href=&quot;http://www.elearnspace.org/blog/archives/003289.html&quot;&gt;A world without courses&lt;/a&gt;&lt;/p&gt;
  3843. &lt;p&gt;Thought experiment how universities would work without actual courses. An interesting ideas. I’ve often wandered if courses are the best method for learning. I know I learn far more outside of class then inside the classroom.&lt;/p&gt;
  3844. &lt;p&gt;&lt;a href=&quot;http://tip.psychology.org/vygotsky.html&quot;&gt;Vygotsky’s Social Development Theory&lt;/a&gt; — &lt;a href=&quot;http://www.simplypsychology.pwp.blueyonder.co.uk/vygotsky.html&quot;&gt;more here&lt;/a&gt;&lt;/p&gt;
  3845. &lt;blockquote&gt;
  3846. &lt;p&gt;Every function in the child’s cultural development appears twice: first, on the social level, and later, on the individual level; first, between people (interpsychological) and then inside the child (intrapsychological). This applies equally to voluntary attention, to logical memory, and to the formation of concepts. All the higher functions originate as actual relationships between individuals.&lt;/p&gt;
  3847. &lt;/blockquote&gt;
  3848. &lt;p&gt;&lt;a href=&quot;http://freakonomics.blogs.nytimes.com/2008/03/11/how-did-a-rod-get-so-good/&quot;&gt;How to become great?&lt;/a&gt; Research suggests:&lt;/p&gt;
  3849. &lt;ol&gt;
  3850. &lt;li&gt;Focus on technique as opposed to outcome.&lt;/li&gt;
  3851. &lt;li&gt;Set specific goals.&lt;/li&gt;
  3852. &lt;li&gt;Get good, prompt feedback, and use it.&lt;/li&gt;
  3853. &lt;/ol&gt;
  3854. &lt;p&gt;&lt;a href=&quot;http://willrichardson.wikispaces.com/page/diff/home/20048645&quot;&gt;Thoughts, quotes, questions about how web2.0 is challenging traditional methods of education&lt;/a&gt;&lt;/p&gt;
  3855. &lt;p&gt;&lt;a href=&quot;http://tip.psychology.org/bandura.html&quot;&gt;Bandura Social Learning Theory&lt;/a&gt;&lt;/p&gt;
  3856. &lt;blockquote&gt;
  3857. &lt;p&gt;Learning would be exceedingly laborious, not to mention hazardous, if people had to rely solely on the effects of their own actions to inform them what to do. Fortunately, most human behavior is learned observationally through modeling: from observing others one forms an idea of how new behaviors are performed, and on later occasions this coded information serves as a guide for action.&lt;/p&gt;
  3858. &lt;/blockquote&gt;
  3859. &lt;p&gt;&lt;a href=&quot;http://tip.psychology.org/lave.html&quot;&gt;Lave’s Situated Learning Theory&lt;/a&gt;&lt;/p&gt;
  3860. &lt;blockquote&gt;
  3861. &lt;p&gt;Lave argues that learning as it normally occurs is a function of the activity, context and culture in which it occurs (i.e., it is situated). This contrasts with most classroom learning activities which involve knowledge which is abstract and out of context. Social interaction is a critical component of situated learning — learners become involved in a “community of practice” which embodies certain beliefs and behaviors to be acquired. As the beginner or newcomer moves from the periphery of this community to its center, they become more active and engaged within the culture and hence assume the role of expert or old-timer. Furthermore, situated learning is usually unintentional rather than deliberate. These ideas are what Lave &amp;#x26; Wenger (1991) call the process of “legitimate peripheral participation.”&lt;/p&gt;
  3862. &lt;/blockquote&gt;
  3863. &lt;p&gt;&lt;a href=&quot;http://www.socialtext.net/stanfordsocialmedia/index.cgi?syllabus&quot;&gt;Syllabus for Virtual community/social media class at Stanford&lt;/a&gt; — Loads of links to great resources.&lt;/p&gt;
  3864. &lt;p&gt;&lt;a href=&quot;http://www.cognitive-edge.com/2006/10/they_did_not_respect_or_sit_st.php&quot;&gt;Learn the difference between states of order and unorder — a birthday story&lt;/a&gt;&lt;/p&gt;
  3865. &lt;p&gt;One of the most profound insights into management I’ve read. To manage states of unorder you make boundaries, create attractors, stabilize the patterns you desire and disrupt the patterns that threaten danger and harm. Read the story linked above then the full paper &lt;a href=&quot;http://www.cognitive-edge.com/articledetails.php?articleid=40&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
  3866. &lt;p&gt;&lt;a href=&quot;http://www.cognitive-edge.com/blogs/guest/2008/04/on_average_averages_are_the_ex.php#more&quot;&gt;On average, averages are the exception not the rule&lt;/a&gt;&lt;/p&gt;
  3867. &lt;p&gt;Worth linking to for the title alone. Explores some failures of statistics particularly social scientists ignorance of Zipth or the Power law&lt;/p&gt;
  3868. &lt;p&gt;&lt;a href=&quot;http://sethgodin.typepad.com/seths_blog/2008/03/why-bother-havi.html&quot;&gt;Why bother having a resume?&lt;/a&gt;&lt;/p&gt;
  3869. &lt;p&gt;Seth Godin asks why bother having a resume. He says “I think if you’re remarkable, amazing or just plain spectacular, you probably shouldn’t have a resume at all… Great jobs, world class jobs, jobs people kill for… those jobs don’t get filled by people emailing in resumes. Ever.&lt;/p&gt;
  3870. &lt;p&gt;&lt;a href=&quot;http://cannell.org/blog/?q=node/229&quot;&gt;Ross Mayfield Shares Four Use Cases For Wikis&lt;/a&gt;&lt;/p&gt;
  3871. &lt;p&gt;The four are:&lt;/p&gt;
  3872. &lt;ol&gt;
  3873. &lt;li&gt;collaborative intelligence&lt;/li&gt;
  3874. &lt;li&gt;participatory knowledge base&lt;/li&gt;
  3875. &lt;li&gt;flexible client collaboration&lt;/li&gt;
  3876. &lt;li&gt;business social networks&lt;/li&gt;
  3877. &lt;/ol&gt;
  3878. &lt;p&gt;&lt;a href=&quot;http://www.technologyreview.com/blog/boyden/21925/&quot;&gt;How to think: Managing brain resources in an age of complexity&lt;/a&gt;&lt;/p&gt;
  3879. &lt;p&gt;Great, great suggestions on how to think. Read the whole thing. One sample point:&lt;/p&gt;
  3880. &lt;blockquote&gt;
  3881. &lt;p&gt;&lt;strong&gt;Make your mistakes quickly.&lt;/strong&gt; You may mess things up on the first try, but do it fast, and then move on. Document what led to the error so that you learn what to recognize, and then move on. Get the mistakes out of the way. As Shakespeare put it, “Our doubts are traitors, and make us lose the good we oft might win, by fearing to attempt.&lt;/p&gt;
  3882. &lt;/blockquote&gt;
  3883. &lt;p&gt;&lt;a href=&quot;http://www.wikipatterns.com/display/wikipatterns/Wikipatterns&quot;&gt;Wikipatterns — Design patterns for wikis&lt;/a&gt; — Great resource&lt;/p&gt;
  3884. &lt;p&gt;&lt;a href=&quot;http://blog.hbs.edu/faculty/amcafee/index.php/faculty_amcafee_v3/now_thats_what_im_talking_about/&quot;&gt;Case study of Enterprise2.0 implementation&lt;/a&gt; at &lt;a href=&quot;http://www.avenuea-razorfish.com/&quot;&gt;Avenue A | Razorfish&lt;/a&gt;&lt;/p&gt;
  3885. &lt;p&gt;&lt;a href=&quot;http://www.shirky.com/writings/situated_software.html&quot;&gt;Situated Software&lt;/a&gt;&lt;/p&gt;
  3886. &lt;p&gt;Clay Shirky tells how open source software enables cheap creation of social software situated to needs of a specific community. He’s ideas are partly what inspired my creation of &lt;a href=&quot;http://vinvesting.com/docs/munger/human_misjudgement.html&quot;&gt;BYU&lt;/a&gt;&lt;/p&gt;
  3887. &lt;p&gt;&lt;a href=&quot;http://vinvesting.com/docs/munger/human_misjudgement.html&quot;&gt;The Psychology of human misjudgement&lt;/a&gt;&lt;/p&gt;
  3888. &lt;p&gt;Psychology fascinates me — particularly how we mess up. My hope is if I understand why my psychology causes me to mess up, I’ll be able to compensate. This is a speech by Charlie Munger, a wise old sage of the business world. He lists 24 reasons why humans misjudge.&lt;/p&gt;
  3889. &lt;p&gt;&lt;a href=&quot;http://avc.blogs.com/a_vc/2008/03/where-my-traffi.html&quot;&gt;Where my traffic comes from&lt;/a&gt;&lt;/p&gt;
  3890. &lt;p&gt;Popular blogger says more traffic now comes from “smart aggregators. As there is more and more good content being posted, people are starting to rely more on social filtering.&lt;/p&gt;
  3891. &lt;p&gt;&lt;a href=&quot;http://acko.net/blog/safe-string-theory-for-the-web&quot;&gt;Safe String Theory for the Web&lt;/a&gt; — Everything you ever wanted to know about handling strings on the web.&lt;/p&gt;
  3892. &lt;p&gt;&lt;a href=&quot;http://www.nytimes.com/2008/04/02/opinion/02aamodt.html?_r=3&amp;#x26;oref=slogin&amp;#x26;oref=slogin&amp;#x26;oref=login&quot;&gt;Willpower is like a muscle says research&lt;/a&gt;&lt;/p&gt;
  3893. &lt;p&gt;New York Times article summarizes research that suggests your will power can be strengthened by exercising it, much as a muscle.&lt;/p&gt;
  3894. &lt;blockquote&gt;
  3895. &lt;p&gt;In psychological studies, even something as simple as using your nondominant hand to brush your teeth for two weeks can increase willpower capacity. People who stick to an exercise program for two months report reducing their impulsive spending, junk food intake, alcohol use and smoking. They also study more, watch less television and do more housework. Other forms of willpower training, like money-management classes, work as well.&lt;/p&gt;
  3896. &lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Drupal Memetracker Module — My Google Summer of Code Application]]></title><description><![CDATA[Executive Summary I propose to write two modules for Drupal as part of Google Summer of Code. One called memetracker and the other called…]]></description><link>https://bricolage.io/drupal-memetracker-module-my-google-summer-of-code-application/</link><guid isPermaLink="false">https://bricolage.io/drupal-memetracker-module-my-google-summer-of-code-application/</guid><pubDate>Fri, 04 Apr 2008 23:03:38 GMT</pubDate><content:encoded>&lt;h2 id=&quot;executive-summary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#executive-summary&quot; aria-label=&quot;executive summary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Executive Summary&lt;/h2&gt;
  3897. &lt;p&gt;I propose to write two modules for &lt;a href=&quot;http://drupal.org&quot;&gt;Drupal&lt;/a&gt; as part of &lt;a href=&quot;http://code.google.com/soc/2008/&quot;&gt;Google Summer of Code&lt;/a&gt;. One called &lt;strong&gt;memetracker&lt;/strong&gt; and the other called &lt;strong&gt;machinelearningapi&lt;/strong&gt;. The memetracker module will use algorithms in the machinelearningapi to intelligently filter and group content from designated content sources both internal and external. The module’s purpose is to find and display to a community in real time the most interesting conversations and memes within the community as they emerge.&lt;/p&gt;
  3898. &lt;p&gt;My project will emulate functionality of successful commercial memetrackers such as &lt;a href=&quot;http://techmeme.com&quot;&gt;Techmeme&lt;/a&gt;, &lt;a href=&quot;http://news.google.com&quot;&gt;Google News&lt;/a&gt;, &lt;a href=&quot;http://tailrank.com&quot;&gt;Tailrank&lt;/a&gt;, and &lt;a href=&quot;http://megite.com&quot;&gt;Megite&lt;/a&gt;. It will be an open-source implementation of &lt;a href=&quot;http://en.wikipedia.org/wiki/Memetracker&quot;&gt;memetracking technology&lt;/a&gt; that can be easily plugged into Drupal-based community sites.&lt;/p&gt;
  3899. &lt;p&gt;I wrote up my idea twice on groups.drupal.org, &lt;a href=&quot;http://groups.drupal.org/node/9730&quot;&gt;my initial proposal&lt;/a&gt; and &lt;a href=&quot;http://groups.drupal.org/node/10276&quot;&gt;my second proposal&lt;/a&gt;&lt;/p&gt;
  3900. &lt;h2 id=&quot;benefits-to-drupalopen-source-community&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#benefits-to-drupalopen-source-community&quot; aria-label=&quot;benefits to drupalopen source community permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Benefits to Drupal/Open Source Community:&lt;/h2&gt;
  3901. &lt;p&gt;The memetracker module will solve a common problem faced by many online communities. Perhaps the best way to explain the value of my module is to explain my experience with this problem and how the memetracker module will help solve this problem.&lt;/p&gt;
  3902. &lt;h3 id=&quot;whats-my-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-my-problem&quot; aria-label=&quot;whats my problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s my Problem?&lt;/h3&gt;
  3903. &lt;p&gt;For eight months now I’ve been building social learning websites for classes at &lt;a href=&quot;http://byu.edu&quot;&gt;Brigham Young University&lt;/a&gt; where I’m a graduate student. Working with a few professors, I build websites for their classes to be used as a learning tool by them and their students. Our goal is to understand what web2.0 tools / principles help most in education.&lt;/p&gt;
  3904. &lt;p&gt;Any online community, like the ones I create for school, generates lots of content and conversations. As a community grows, a problem that soon emerges is how to help individual members find the content/conversations they are most interested in. If there’s only a few members in the online community, it’s easy to follow every conversation. But if there’s 100s or 1000s of members, it soon becomes impossible to follow or find every interesting conversation. This dynamic sets an upper limit on the number of members for most online communities.&lt;/p&gt;
  3905. &lt;p&gt;In researching ways that online communities help participants find the most interesting content/conversations, I’ve found three patterns which help.&lt;/p&gt;
  3906. &lt;ol&gt;
  3907. &lt;li&gt;First is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Small-world_network&quot;&gt;small-world pattern&lt;/a&gt;. Via &lt;a href=&quot;http://drupal.org/project/og&quot;&gt;Organic Groups&lt;/a&gt;, you split conversations by topic. Members congregate around only the groups they are interested in.&lt;/li&gt;
  3908. &lt;li&gt;Second is the &lt;a href=&quot;http://www.russellbeattie.com/blog/nearly-a-million-users-and-no-spam-or-trolls&quot;&gt;Twitter pattern&lt;/a&gt;. Using &lt;a href=&quot;http://drupal.org/project/buddylist2&quot;&gt;buddylist&lt;/a&gt; or &lt;a href=&quot;http://drupal.org/project/user_relationships&quot;&gt;user_relationships&lt;/a&gt;, members follow friends or people who’s ideas they find interesting.&lt;/li&gt;
  3909. &lt;li&gt;The third pattern is for members to read the most interesting memes as they are somehow determined by the community (this is where my module will help out).&lt;/li&gt;
  3910. &lt;/ol&gt;
  3911. &lt;p&gt;Drupal sites normally implement the third pattern by having human editors manually promote the most interesting content to the front page. But I’ve found this solution to be inadequate. Human editors miss many interesting pieces of content, are prone to bias, and the solution is labor intensive. Also, promoting content to the front page doesn’t group the content by conversation or meme, an important usability improvement.&lt;/p&gt;
  3912. &lt;p&gt;A much better solution for finding the most interesting memes are tools called memetrackers like Techmeme, Google News, Tailrank, Megite, and others. These memetrackers automatically find the most interesting content bubbling up in the blogosphere. Using these memetrackers, individual news readers can find in minutes the best content from 1000s of sources.&lt;/p&gt;
  3913. &lt;p&gt;As the principle tech memetracker, Techmeme plays a hugely influential role in the tech community. Techmeme is the place to find conversation about the biggest tech memes of the day.&lt;/p&gt;
  3914. &lt;p&gt;But at the moment there are only commercial memetrackers such as Techmeme. There are no free or open-source implementations and certainly nothing that can be easily plugged into Drupal.&lt;/p&gt;
  3915. &lt;p&gt;My proposal then is to write a memetracker module that will fulfill the same role as Techmeme does to the tech community for any community for which it is installed. My module will intelligently filter and group community generated content to display to the community in real time the most interesting conversations and memes as they emerge.&lt;/p&gt;
  3916. &lt;h3 id=&quot;potential-users-of-my-module-can-be-placed-in-a-few-classes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#potential-users-of-my-module-can-be-placed-in-a-few-classes&quot; aria-label=&quot;potential users of my module can be placed in a few classes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Potential users of my module can be placed in a few classes:&lt;/h3&gt;
  3917. &lt;ol&gt;
  3918. &lt;li&gt;Those building community sites using Drupal. They face the same problem I related in my story earlier — how to help their users sift through new content and to find interesting conversations to follow and join in.&lt;/li&gt;
  3919. &lt;li&gt;Those who want to build sites that support an existing online community. They would use &lt;a href=&quot;http://drupal.org/project/feedapi&quot;&gt;FeedAPI&lt;/a&gt; to pull content from any number of relevant sources and then use memetracker to display interesting content and conversations from that community.&lt;/li&gt;
  3920. &lt;li&gt;Users who use Memetracker as a personal news aggregator. They’d add news sources they are interested in and memetracker would learn their interests and filter and display only the news they are interested in.&lt;/li&gt;
  3921. &lt;li&gt;Organizations who use Memetracker as an internal news gathering application pulling together content created by employees internally and outside news that’s of interest to the company.&lt;/li&gt;
  3922. &lt;li&gt;Those who want to create a sitemap-like page for their site. Memetracker would create a page that showed all content ever created on the site and group by meme and order by popularity.&lt;/li&gt;
  3923. &lt;li&gt;Organizations who want to create a branded news site. &lt;a href=&quot;http://www.utahtechcouncil.org/&quot;&gt;Utah Tech Council&lt;/a&gt; could put up a memetracker aggregating local newspapers and blogs that discuss Utah technology news. The &lt;a href=&quot;http://www.savethedolphins.org/&quot;&gt;Save the Dolphins Foundation&lt;/a&gt; could aggregate dolphin news from different news sources. Memetracker would help these organizations by drawing repeat visitors to view the aggregated content. It would be an advantage to Drupal as more sites would use Drupal to use the memetracking functionality.&lt;/li&gt;
  3924. &lt;/ol&gt;
  3925. &lt;p&gt;The memetracker module will be especially useful to open source communities. Open source projects rely entirely on internet communication technologies to coordinate their efforts. Many commentators have linked the explosion of the open source to the opening of the Internet to the general population. Memetracking and aggregation sites in general are another step in the evolution of communication technologies on the internet. My memetracker module will allow any open source community, large or small, to put up a simple Drupal site and start aggregating developer blogs, forums, mailing lists, etc. into a centralized place.&lt;/p&gt;
  3926. &lt;h3 id=&quot;another-analogy-memetracker--smart-aggregator&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#another-analogy-memetracker--smart-aggregator&quot; aria-label=&quot;another analogy memetracker  smart aggregator permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Another analogy: memetracker = smart aggregator:&lt;/h3&gt;
  3927. &lt;p&gt;An aggregator is software like &lt;a href=&quot;http://drupal.org/planet&quot;&gt;Drupal Planet&lt;/a&gt; or &lt;a href=&quot;http://www.planetplanet.org/&quot;&gt;PlanetPlanet&lt;/a&gt; that aggregates related content from many sources to display in a central location. But current aggregators are dumb. The dumb aggregator knows no better than to pull in new content and order it chronologically.&lt;/p&gt;
  3928. &lt;p&gt;A memetracker is a smart aggregator. It also knows how to pull in new content as a dumb aggregator but it’s much smarter about how it displays the content. It can analyze the text of the content and know which authors are talking about the same topic and then group them together. But not only will the smart aggregator group similar topics but it will also learn what topics and authors are most interesting to members of the community and display those first. No more will you have to scroll through a long list of content skipping over content you’re not interested in but instead, new content will be nicely organized by meme and interestingness in a neat compact form.&lt;/p&gt;
  3929. &lt;h2 id=&quot;project-details&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#project-details&quot; aria-label=&quot;project details permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Project Details:&lt;/h2&gt;
  3930. &lt;p&gt;To help you understand how the memetracker will work, I’ll walk through the steps the memetracker will take from first aggregating new content to finally outputting a view to the user.&lt;/p&gt;
  3931. &lt;h3 id=&quot;high-level-overview&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#high-level-overview&quot; aria-label=&quot;high level overview permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;High level overview:&lt;/h3&gt;
  3932. &lt;p&gt;The memetracker will assemble content from two sources (internal content through Drupal and external content through FeedAPI). It will then analyze the content to identify active memes. Then, using what the memetracker has learned from the click history, the memetracker will decide which memes to display and which to discard and which order to place the memes on the page (i.e. the most interesting memes will be at the top). UI code will be written to display the memes in an easy-to-browse fashion.&lt;/p&gt;
  3933. &lt;h3 id=&quot;detailed-overview&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#detailed-overview&quot; aria-label=&quot;detailed overview permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Detailed Overview:&lt;/h3&gt;
  3934. &lt;p&gt;A particular memetracker is tracking 100 sources (30 are blogs on the Drupal installation and 70 are various blogs and other news sources you are aggregating with FeedAPI). In the past two days, the 100 sources have created 300 pieces of content. The first pass through the 300 pieces of content will be to find memes. First it will check for interlinking between content — this indicates they are discussing the same meme. Second it will perform textual analysis on the titles, bodies, and tags of content to determine how “close” text is to each other (cluster analysis).&lt;/p&gt;
  3935. &lt;p&gt;In my example, say the algorithm identifies 10 meme clusters in the 300 pieces of content. 80 of the 300 pieces of content are part of the 10 meme clusters leaving 220 individual memes, not associated with any other content.&lt;/p&gt;
  3936. &lt;p&gt;You’ve set the memetracker to only display ~50 memes at a time as the memetracker is tracking a smaller community. This means the memetracker has to discard 250 links from the display page. It does this filtering by various means.&lt;/p&gt;
  3937. &lt;ol&gt;
  3938. &lt;li&gt;The memetracker is biased toward keeping meme clusters (remember the goal is to display the most interesting content — if two people thought a meme worth writing about, odds are that meme is more interesting to the general community than a meme that only one person talked about) So the memetracker will weight meme clusters higher.&lt;/li&gt;
  3939. &lt;li&gt;It will use a form of authority ranking for the different sources. If one blogger consistently writes interesting content that many people click on to read, then the memetracker will rank any new content by that blogger higher than new content by a less interesting blogger.&lt;/li&gt;
  3940. &lt;li&gt;You’ll filter out topics not interesting to the community. Baysian logic is a possible way to do this. Baysian logic is often used for spam filtering. So just as spam filters learn that emails with “XXX” or “Hot chicks” probably are spam. If the community consistently clicks to read content about Drupal and not Plone, a new article about Drupal will be displayed and the Plone article won’t.&lt;/li&gt;
  3941. &lt;li&gt;The meme tracker will use click momentum. By this I mean it’ll take a measure of how many times the content has been clicked on in the last while. If an article is being clicked on a lot, that suggests the article is more interesting to the community and should be moved up on the page.&lt;/li&gt;
  3942. &lt;li&gt;I will implement a hook that will let other modules set simple rules to affect the filtering and ordering of memes. For example, if content from one source must always be displayed, say blog entries from the CEO (regardless of how interesting the CEO’s blog actually is), you could set a rule that content from this source will always be kept and not filtered out.&lt;/li&gt;
  3943. &lt;/ol&gt;
  3944. &lt;p&gt;So once the memetracker has grouped and filtered content down to the proper level. It’ll pass data to the UI code to be rendered and pushed out to the browser.&lt;/p&gt;
  3945. &lt;h3 id=&quot;viewing-memes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#viewing-memes&quot; aria-label=&quot;viewing memes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Viewing Memes:&lt;/h3&gt;
  3946. &lt;p&gt;There will be two ways (initially) to view memes. First via meme browsing pages that admins define or via custom views of data exposed by memetracker.&lt;/p&gt;
  3947. &lt;p&gt;Admins will be able to define meme browsing pages in a process similar to creating a new panel page. When creating a new meme browsing page, you will define the page url, what sources to include (different Drupal content types, external sources from FeedAPI), and a number of settings for the page such as how long to keep old memes before refreshing and the number of memes to display at a time.&lt;/p&gt;
  3948. &lt;p&gt;Individual meme browsing pages will look similar to Techmeme with main articles, discussion, and related content:&lt;/p&gt;
  3949. &lt;p&gt;Screenshot from &lt;a href=&quot;http://techmeme.com&quot;&gt;Techmeme&lt;/a&gt; — My memetracker UI will look similar.&lt;a href=&quot;http://techmeme.com&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://techmeme.com&quot;&gt;2&lt;/a&gt;&lt;/p&gt;
  3950. &lt;p&gt;&lt;span
  3951.      class=&quot;gatsby-resp-image-wrapper&quot;
  3952.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  3953.    &gt;
  3954.      &lt;a
  3955.    class=&quot;gatsby-resp-image-link&quot;
  3956.    href=&quot;/static/4033c4c01766a62eead7f82593d763a8/23296/techmeme.png&quot;
  3957.    style=&quot;display: block&quot;
  3958.    target=&quot;_blank&quot;
  3959.    rel=&quot;noopener&quot;
  3960.  &gt;
  3961.    &lt;span
  3962.    class=&quot;gatsby-resp-image-background-image&quot;
  3963.    style=&quot;padding-bottom: 58.78378378378378%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAC0klEQVR42l2S+1JSYRTFzxP0MD1DM71D//QU9XfTbbpMpmWlFSIGCCKilE0oBILipUzFC6WCwAHOAQ7QRUmuvzYw00z9sWbv/X0z37f2WkupnO6hVZYpVFd70MorMq+gV6I0WrG/aHV2adPHv32sX9mmg4GSzCyyvmli58BGZM3E6icz2/vWXr+1a2U3buPz9jjZgpvyDze64UQvOSmUXWjGlMAlvZvz1gd5MIuilXwks+OcZBwcJR1SXSTTTlJZl8xODo5cfD12cZicIZnxCmbJ5OeIHznIF7ycnS/ys+aj3vYL0zxKrbFGxrCgym/fz/xUTxf4UVvkrBEgX1pgYOgeg08eMjM3xbMXT5mwjxGO+lj4OM/Ong9YlbWXaRKUB3MoHXbIG2/ZFxYJdZY9YRQ7FGaJab7su5iwmXhjHxWMSD/Ca/MQnrdW3vvcRDfcwtDHqbBsdAL9B9tsUTBm5Dczsf0xDr5NsBe3yEpWDg6tJNJuMjk3iZQTNe+RlZ0cpyZFArvcTYo0Nk5UG8Z3T//BFjHKv7ykdTuq7iKrv6P600+zE6HRDovDIc6bIeqtpR66faMV7t1159/NLuS+3V1ZE4adYs+ddkcV5Kk3VZqtnGijyXn+P3TP+7UPTeaiQO+dwylKSgvyNekmnvCwFZ+SOiPR8EkUFmSNEEY1RKkSolgJyrxEqRqkVo8Im1XR3ot37RnrkobtlEMYqyjxwzmi66NsbJolg68kc2OSPzOhyGtu3r7BrTs3xeUBnj4f4uGjB1isJqY9Fr4dL7Ky8YiLly5wbeAKo57rYtAJim684yg9iqo5RGibCG4XkSeJi9MjLwd4Mny/V03jwzwevMP8hylsk/JpTPKbtnD77mWem67ieX+NeiOFUqpGxYx5csWAOOYXR/3k9IDgowQ3LAlYRitFxKwliuVlCXVQ5gDprE+kCFM736Tdjol+X0SGAn8A+Mo75Kszv8oAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  3964.  &gt;&lt;/span&gt;
  3965.  &lt;img
  3966.        class=&quot;gatsby-resp-image-image&quot;
  3967.        alt=&quot;techmeme example&quot;
  3968.        title=&quot;&quot;
  3969.        src=&quot;/static/4033c4c01766a62eead7f82593d763a8/fcda8/techmeme.png&quot;
  3970.        srcset=&quot;/static/4033c4c01766a62eead7f82593d763a8/12f09/techmeme.png 148w,
  3971. /static/4033c4c01766a62eead7f82593d763a8/e4a3f/techmeme.png 295w,
  3972. /static/4033c4c01766a62eead7f82593d763a8/fcda8/techmeme.png 590w,
  3973. /static/4033c4c01766a62eead7f82593d763a8/23296/techmeme.png 675w&quot;
  3974.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  3975.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  3976.        loading=&quot;lazy&quot;
  3977.        decoding=&quot;async&quot;
  3978.      /&gt;
  3979.  &lt;/a&gt;
  3980.    &lt;/span&gt;&lt;/p&gt;
  3981. &lt;h3 id=&quot;how-is-memetracker-different-from-other-content-recommendation-engines-on-drupal&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-is-memetracker-different-from-other-content-recommendation-engines-on-drupal&quot; aria-label=&quot;how is memetracker different from other content recommendation engines on drupal permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How is memetracker different from other content recommendation engines on Drupal?&lt;/h3&gt;
  3982. &lt;p&gt;There is some overlap in functionality but a large difference is in purpose. &lt;a href=&quot;http://http//www.civicactions.com/blog/similar_content_module_wrapup&quot;&gt;Other content recommendation engines for Drupal&lt;/a&gt; recommend similar or related content in the context of a single node. Memetracker also recommends content but en masse. It focuses on conversations — what are people saying now about all the current hot topics. Not what did someone say about the topic of the current node six months or two years ago.&lt;/p&gt;
  3983. &lt;h3 id=&quot;how-will-the-memetracker-learn-to-filter-and-group-memes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-will-the-memetracker-learn-to-filter-and-group-memes&quot; aria-label=&quot;how will the memetracker learn to filter and group memes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How will the memetracker learn to filter and group memes?&lt;/h3&gt;
  3984. &lt;p&gt;The SoC application template asks what aspects of my proposal depend on further research or experiments. The machine learning portion of my proposal, much more than any other part fits this criteria. Machine learning is actively researched and many algorithms are now well understood. However, deciding on the correct algorithms that will fit the constraints of a web application (fast response times, low resource usage) will take considerable research and experimentation. But while the specifics are still unknown, the general direction I’ll take is clear.&lt;/p&gt;
  3985. &lt;p&gt;The general machine learning technique I’ll use is called &lt;a href=&quot;http://en.wikipedia.org/wiki/Reinforcement_learning&quot;&gt;reinforcement learning&lt;/a&gt;. Reinforcement learning is that the algorithm learns by making a guess and then gets feedback. If the guess is good, that “state” of the algorithm is reinforced, if the guess is bad, that “state” is weakened. The algorithm gradually learns what states are most appropriate to a given situation. So in the case of the memetracker, it will guess what memes are interesting to the community and what order to place the memes on the page. Then based on feedback from the community (i.e. if links are clicked on or not clicked on) the memetracker will learn gradually how to select and display the most interesting content.&lt;/p&gt;
  3986. &lt;p&gt;There are two major machine learning problems to be solved. Filtering out uninteresting content and clustering or grouping content into memes.&lt;/p&gt;
  3987. &lt;p&gt;When filtering, the machine learning algorithm basically has to answer the question, will this piece of content on this topic written by this author be of sufficient interest to the general community to include on the Meme Browsing page? There are a number of algorithms that I’ve looked at to answer this question including &lt;a href=&quot;http://en.wikipedia.org/wiki/Naive_Bayes_classifier&quot;&gt;naïve bayes&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Backpropagation&quot;&gt;backpropegation&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Support_vector_machine&quot;&gt;support vector machines&lt;/a&gt;. Each will filter adequately for the memetrackers needs, the question to answer is which will perform best.&lt;/p&gt;
  3988. &lt;p&gt;The second machine learning problem, clustering or grouping content into memes is more straight forward to solve. I’ll use a technique called &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_clustering#Agglomerative_hierarchical_clustering&quot;&gt;agglomerative clustering&lt;/a&gt;. This algorithm starts with each piece of content as part of its own meme. It then determines if individual memes are actually part of a larger meme. To do this you set a “closeness” threshold. If two individual memes are closer than the threshold, the two memes are joined together into a single meme. The algorithm loops through the content joining small memes into larger memes until no two memes are closer than the “closeness” threshold.&lt;/p&gt;
  3989. &lt;p&gt;Using the above two techniques plus reinforcement learning will create a memetracking system that adapts itself to the needs of the community it supports.&lt;/p&gt;
  3990. &lt;p&gt;In implementing these algorithms, I’ll have the support of the excellent machine learning faculty in the Computer Science department at Brigham Young University. I’ve talked to one professor extensively about my proposal and he (and most likely one of the other professors and several graduate students) is willing to mentor me as I write the machine learning code.&lt;/p&gt;
  3991. &lt;h2 id=&quot;deliverables&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deliverables&quot; aria-label=&quot;deliverables permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deliverables:&lt;/h2&gt;
  3992. &lt;p&gt;These will be my deliverables at the end of the summer:&lt;/p&gt;
  3993. &lt;h3 id=&quot;php-library-of-machine-learning-algorithms&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#php-library-of-machine-learning-algorithms&quot; aria-label=&quot;php library of machine learning algorithms permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PHP library of Machine learning algorithms:&lt;/h3&gt;
  3994. &lt;p&gt;I will write the machine learning algorithms as a PHP library. The library won’t be coupled to Drupal so will be portable to other open source PHP projects.&lt;/p&gt;
  3995. &lt;h3 id=&quot;machine_learningapi-module&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#machine_learningapi-module&quot; aria-label=&quot;machine_learningapi module permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Machine_learningAPI module:&lt;/h3&gt;
  3996. &lt;p&gt;This module will provide a wrapper for the machine learning algorithm library.&lt;/p&gt;
  3997. &lt;h3 id=&quot;memetracker-module&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#memetracker-module&quot; aria-label=&quot;memetracker module permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Memetracker module:&lt;/h3&gt;
  3998. &lt;p&gt;This module will have several major components:&lt;/p&gt;
  3999. &lt;ul&gt;
  4000. &lt;li&gt;Meme browsing UI — this will be the primary view for browsing memes. It will be refreshed each cron run with new content.&lt;/li&gt;
  4001. &lt;li&gt;Panels-like meme browsing page creator — You will be able to create any number of memebrowsing pages. When you create a new memebrowsing page, you set how long memes stay active, you set how many memes to show, and can weight the display / ranking of memes in a variety of ways.&lt;/li&gt;
  4002. &lt;li&gt;Two hooks:
  4003. &lt;ul&gt;
  4004. &lt;li&gt;The first hook will allow other modules to modify how content is ranked. I gave an example in the project details section of how a company could modify the score of their CEO’s blog. Another potential use case is an ecommerce store might analyze content for text that mentioned their products and rank those higher.&lt;/li&gt;
  4005. &lt;li&gt;The second hook will allow other modules to add functionality to meme browsing pages. Modules would define little ajax buttons to be added next to memes. There could be for example a send article to friend button, a save to delicious button, a bookmark button, a digg button, and other buttons that let you interact with the content.&lt;/li&gt;
  4006. &lt;/ul&gt;
  4007. &lt;/li&gt;
  4008. &lt;/ul&gt;
  4009. &lt;h3 id=&quot;set-of-apis&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#set-of-apis&quot; aria-label=&quot;set of apis permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Set of APIs&lt;/h3&gt;
  4010. &lt;p&gt;To expose metadata about memes.&lt;/p&gt;
  4011. &lt;h3 id=&quot;views-integration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#views-integration&quot; aria-label=&quot;views integration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Views integration:&lt;/h3&gt;
  4012. &lt;p&gt;(&lt;a href=&quot;http://groups.drupal.org/node/10276#comment-33064&quot;&gt;Catch and Bill gave some suggestions on how to do this&lt;/a&gt;)&lt;/p&gt;
  4013. &lt;h3 id=&quot;documentation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#documentation&quot; aria-label=&quot;documentation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Documentation:&lt;/h3&gt;
  4014. &lt;p&gt;I will write documentation for developers explaining how to use the two hooks and documentation for website operators explaining how to configure and set up a memetracker on their site.&lt;/p&gt;
  4015. &lt;h3 id=&quot;tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tests&quot; aria-label=&quot;tests permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tests:&lt;/h3&gt;
  4016. &lt;p&gt;I will write a complete set of tests for the memetracker and machinelearningapi modules&lt;/p&gt;
  4017. &lt;h2 id=&quot;project-schedule&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#project-schedule&quot; aria-label=&quot;project schedule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Project Schedule:&lt;/h2&gt;
  4018. &lt;p&gt;I’m done with classes by the end of April and plan to start working on GsoC immediately. In the first 2-3 weeks of May, I will write a very rough version of the UI and machine learning code.&lt;/p&gt;
  4019. &lt;p&gt;In the spirit of release early, release often, I will install memetracker on a public facing website. I will then put together many many memetracker pages to track different communities of bloggers and other online communities. I’ll create memetrackers for econ bloggers / liberal bloggers / conservative bloggers / edubloggers / content from the Drupal community / content on the Joomla community / Ubuntu bloggers / and many more.&lt;/p&gt;
  4020. &lt;p&gt;My goal is to get lots of attention from these different communities so as many people start regularly using the memetrackers. Achieving high traffic is key as it will enable me to rapidly test my algorithms and iterate through 100s of variations of the machine learning algorithms. Also, building memetrackers for many types of online communities will ensure my algorithms will work well over a wide variety of content and community types.&lt;/p&gt;
  4021. &lt;p&gt;I’ll be working mostly on improving the machine learning algorithms through the latter part of May and all of June. By the end of June I hope to have gotten the machine learning code to a very mature state.&lt;/p&gt;
  4022. &lt;p&gt;From there I will turn my efforts to bug fixing, filling out test coverage, documentation, and improvements on the admin UI and meme browsing UI.&lt;/p&gt;
  4023. &lt;h2 id=&quot;risk-of-failure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#risk-of-failure&quot; aria-label=&quot;risk of failure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Risk of failure:&lt;/h2&gt;
  4024. &lt;p&gt;Low. Writing a working memetracker is not difficult. The devil, as they say, is in the details. Building a great memetracker is a very difficult task. I won’t have built a great memetracker by the end of the summer. Instead, my plan is to lay the foundation and build many of the necessary pieces so that with these pieces and a great deal of refining, eventually great memetrackers can be built. But I fully expect to have an adequate memetracker working at the end of the summer that will meet my needs and many others.&lt;/p&gt;
  4025. &lt;p&gt;If writing this module does prove more difficult than I anticipated, I will limit the scope by cutting first the second hook, and then the views integration. Both of these are very nice features but not essential to creating a working memetracker.&lt;/p&gt;
  4026. &lt;h2 id=&quot;biography&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#biography&quot; aria-label=&quot;biography permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Biography:&lt;/h2&gt;
  4027. &lt;p&gt;Hello Drupliers. My name is Kyle Mathews and I’m passionate about social software. I love to create software/web sites that help people connect, learn, and work together. I’m a grad student in Information Systems at Brigham Young University working as a research assistant to several faculty members. We are studying how and where social software can be used in education.&lt;/p&gt;
  4028. &lt;p&gt;For my major, I’ve taken classes on programming, database, systems analysis, and project management. I’ve studied Java and Python at school and learned PHP while working with Drupal. I use open source full time. I’ve run Linux (Ubuntu) on my laptop full-time for the past two-years. Open source fascinates me both as a user and as a researcher of online communities and organizational behavior.&lt;/p&gt;
  4029. &lt;p&gt;Some other experience. I wrote a web application in Java last summer for &lt;a href=&quot;http://novell.com&quot;&gt;Novell&lt;/a&gt;. The application queried a number of large databases and assembled and displayed information for a variety of reports used by a marketing team. I was the only developer working on the project and it took most of the summer to write working part-time.&lt;/p&gt;
  4030. &lt;p&gt;A bit about how how I became involved with the Drupal community and the path that led me to now apply for Google Summer of Code.&lt;/p&gt;
  4031. &lt;p&gt;I first used Drupal a year and a half ago. I debated for several months whether I liked Drupal or Joomla better before settling on Drupal. Drupal’s clean architecture was the deciding factor. I built my first production website last year using the Ubercart e-commerce module to sell t-shirts for a company some friends and I started.&lt;/p&gt;
  4032. &lt;p&gt;My involvement and understanding in Drupal started to advance last summer when I started working as a research assistant at BYU. Since starting that job, I’ve built a number of classroom websites using Drupal (&lt;a href=&quot;http://isyscore.byu.edu/drupal/&quot;&gt;isyscore&lt;/a&gt;, &lt;a href=&quot;http://groups.drupal.org/node/8610&quot;&gt;web analytics site&lt;/a&gt;, &lt;a href=&quot;http://island.byu.edu&quot;&gt;g.d.o. like site for all Information Systems students&lt;/a&gt;) wearing down my copy of “Pro Drupal Development” in the process. I’ve learned a considerable bit about Drupal in the past year and a half, became very involved in the community, and am writing a module (&lt;a href=&quot;http://drupal.org/project/writing_assignment&quot;&gt;writing_assignment&lt;/a&gt; — still a work in progress btw). I’ve loved most everything about Drupal but wish Drupal could do memetracking, an important component for building the perfect social learning website. This itches. So, in the best open-source fashion, I’m applying to Google Summer of Code to scratch my itch.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to use web analytics on social learning or elearning websites]]></title><description><![CDATA[My current job is researching the best use of web2.0 technologies and principles in the classroom. I and the other researchers use web…]]></description><link>https://bricolage.io/how-use-web-analytics-social-learning-or-elearning-websites/</link><guid isPermaLink="false">https://bricolage.io/how-use-web-analytics-social-learning-or-elearning-websites/</guid><pubDate>Thu, 27 Mar 2008 16:27:15 GMT</pubDate><content:encoded>&lt;p&gt;My current job is researching the best use of web2.0 technologies and principles in the classroom. I and the other researchers use web analytics extensively in evaluating the effectiveness of websites we build. This post is the first in a two-part series about why and how to use web analytics for your social learning website.&lt;/p&gt;
  4033. &lt;p&gt;This first part explains a bit about what web analytics is and why you should use it.&lt;/p&gt;
  4034. &lt;h3 id=&quot;why-web-analytics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-web-analytics&quot; aria-label=&quot;why web analytics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why web analytics&lt;/h3&gt;
  4035. &lt;p&gt;All websites have a reason for existence. Depending on the site the reason could be to make money, provide leads, provide support, teach students, etc. Using web analytics helps you achieve your site’s purpose in two ways:&lt;/p&gt;
  4036. &lt;ul&gt;
  4037. &lt;li&gt;Using web analytics, you can measure the experience and behavior of visitors to your website. Using what is known as KPI (Key Performance Indicators) you can evaluate if your site is meeting your goals for visitors to the website—or not.&lt;/li&gt;
  4038. &lt;li&gt;Using these KPIs you can identify areas where your site is failing to meet its goals and where it’s doing well&lt;/li&gt;
  4039. &lt;/ul&gt;
  4040. &lt;p&gt;From these insights, you make decisions on what to do to improve the website. Then you evaluate the success of your changes by measuring changes in the experiences and behavior of visitors to your site, again using your KPIs (I’ll write more about KPIs in Part II).&lt;/p&gt;
  4041. &lt;p&gt;In short, web analytics exists to power the generation of actionable insights.&lt;/p&gt;
  4042. &lt;h3 id=&quot;web-analytics-seeks-to-measure-three-things&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#web-analytics-seeks-to-measure-three-things&quot; aria-label=&quot;web analytics seeks to measure three things permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Web analytics seeks to measure three things&lt;/h3&gt;
  4043. &lt;ul&gt;
  4044. &lt;li&gt;Behavior?—What visitors do on the website — how often do they visit, what pages do they visit most, how long do they stay on different pages?&lt;/li&gt;
  4045. &lt;li&gt;Outcomes—all websites have desired outcomes. The exact desired outcome varies site-to-site depending on its goals. Some sites want visitors to sign up as members. That’s one outcome. An e-commerce site’s desired outcome is a purchase. A support site’s desired outcome is for the visitor to find the answer to the question they had.&lt;/li&gt;
  4046. &lt;li&gt;Experience—answer why the visitor did what they did.
  4047. &lt;ul&gt;
  4048. &lt;li&gt;Why did the customer add an item to his shopping cart, go through all the steps of the checkout process and then leave the site? Did they find the same item for cheaper on another site? Was the shipping price too high?&lt;/li&gt;
  4049. &lt;li&gt;Similar questions can be asked about a social learning site. Why doesn’t one student ever visit the site? Why does another student visit twice a day. Why does a student do what they do?&lt;/li&gt;
  4050. &lt;li&gt;&lt;a href=&quot;http://www.kaushik.net/avinash/2006/05/got-surveys-recommendations-from-the-trenches.html&quot;&gt;Surveys&lt;/a&gt; and &lt;a href=&quot;http://www.kaushik.net/avinash/2006/05/experimentation-and-testing-a-primer.html&quot;&gt;testing and experimentation&lt;/a&gt; are some of the best ways to understand visitor’s experience.&lt;/li&gt;
  4051. &lt;/ul&gt;
  4052. &lt;/li&gt;
  4053. &lt;/ul&gt;
  4054. &lt;p&gt;In my mind, the third thing is most important. It’s nice to know that a student spent an hour looking at online learning content but we’d really love to know why they did it. Did the student spend the hour because they were studying for a test? Were they finishing an assignment? Is the material helpful? What material is most helpful? Do they enjoy learning with the material?&lt;/p&gt;
  4055. &lt;p&gt;So behavior and outcomes give you the raw data about what’s happening but experience helps you understand visitors in a more holistic manner. Understanding experience gets you into the mind of visitors to your site. Why they do what they do.&lt;/p&gt;
  4056. &lt;h3 id=&quot;recap&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#recap&quot; aria-label=&quot;recap permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Recap&lt;/h3&gt;
  4057. &lt;p&gt;Web analytics help you improve your site in the following manner.&lt;/p&gt;
  4058. &lt;ol&gt;
  4059. &lt;li&gt;Web Analytics provides you with information to understand what visitors do on your site and why.&lt;/li&gt;
  4060. &lt;li&gt;Using this information, you identify weakness you can correct.&lt;/li&gt;
  4061. &lt;li&gt;You experiment with potential improvements and test your changes using your web analytic data.&lt;/li&gt;
  4062. &lt;li&gt;Repeat starting at step 1&lt;/li&gt;
  4063. &lt;/ol&gt;
  4064. &lt;p&gt;Part I explained what web analytics is and why it is valuable. Part II will explain step-by-step how to use web analytics on a social learning site. I will explain the process I’m going through to implement web analytics on a new social learning website I’m building for &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Six principles for making new things]]></title><description><![CDATA[I love it when someone writes what I’m thinking about writing. Saves me time. Paul Graham posted a new essay today entitled ”Six Principles…]]></description><link>https://bricolage.io/six-principles-for-making-new-things/</link><guid isPermaLink="false">https://bricolage.io/six-principles-for-making-new-things/</guid><pubDate>Tue, 19 Feb 2008 01:51:40 GMT</pubDate><content:encoded>&lt;p&gt;I love it when someone writes what I’m thinking about writing. Saves me time.&lt;/p&gt;
  4065. &lt;p&gt;Paul Graham posted a new essay today entitled ”&lt;a href=&quot;http://www.paulgraham.com/newthings.html&quot;&gt;Six Principles for Making New Things&lt;/a&gt;.”&lt;/p&gt;
  4066. &lt;p&gt;Here’s the juicy bit:&lt;/p&gt;
  4067. &lt;blockquote&gt;
  4068. &lt;p&gt;I like to find (a) simple solutions (b) to overlooked problems (c) that actually need to be solved, and (d) deliver them as informally as possible, (e) starting with a very crude version 1, then (f) iterating rapidly.&lt;/p&gt;
  4069. &lt;/blockquote&gt;
  4070. &lt;p&gt;&lt;a href=&quot;http://www.paulgraham.com/newthings.html&quot;&gt;Read the rest.&lt;/a&gt;&lt;/p&gt;
  4071. &lt;p&gt;To add a few thoughts.&lt;/p&gt;
  4072. &lt;p&gt;When I think of overlooked problems I think of a bell curve. Most people/companies/countries are average: thinking average thoughts and doing things in an average way. Their average thoughts/actions lead to average results. If you want exceptional results, you have to act and think in ways that are exceptional. Average=dead, the &lt;a href=&quot;http://www.edgeperspectives.com/&quot;&gt;edge is where the action&lt;/a&gt; is at.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Power Law Graphs from classroom community website]]></title><description><![CDATA[Researchers have shown that the distribution of many natural and social phenomenons follow what’s called the power law. Power laws are known…]]></description><link>https://bricolage.io/power-law-graphs-from-classroom-community-website/</link><guid isPermaLink="false">https://bricolage.io/power-law-graphs-from-classroom-community-website/</guid><pubDate>Fri, 15 Feb 2008 18:18:04 GMT</pubDate><content:encoded>&lt;p&gt;Researchers have shown that the distribution of many natural and social phenomenons follow what’s called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Power_law&quot;&gt;power law&lt;/a&gt;. Power laws are known by other names such as the 20-80 rule (80% of wealth is controlled by 20% of the population), the long tail, Winner-Take-All, etc.&lt;/p&gt;
  4073. &lt;p&gt;Here is an example power law graph from Wikipedia:&lt;/p&gt;
  4074. &lt;p&gt;&lt;span
  4075.      class=&quot;gatsby-resp-image-wrapper&quot;
  4076.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; &quot;
  4077.    &gt;
  4078.      &lt;a
  4079.    class=&quot;gatsby-resp-image-link&quot;
  4080.    href=&quot;/static/fb55737061a2c733f09ac1019211e3aa/5a46d/300px-Long_tail.svg.png&quot;
  4081.    style=&quot;display: block&quot;
  4082.    target=&quot;_blank&quot;
  4083.    rel=&quot;noopener&quot;
  4084.  &gt;
  4085.    &lt;span
  4086.    class=&quot;gatsby-resp-image-background-image&quot;
  4087.    style=&quot;padding-bottom: 52.02702702702703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJ0lEQVR42mOYvME7cP5+fwEGaoH5uzwKVu33koByGSk2cOlxp/JFO2JUQOz//6lg4Irz9o1LD8aZgdj19fVMFBu4+pJd1+arkV4QF1LBwA037GbsfhiUCWKf+Z/GSrGBWx5azDz81ucELAz//zdm3b/fngXk2v///zOSHFEb7lh03//v+f/gi6CpnZ2dvERGDiPEcgbG+noGoMVwzMiw445176P/Hv9v/Hf/+/iHx8MPb/36n74IDXz2LMX4woVixWPHeoX+/1/FBnQtzMX4wZLTpjW7X9h+2vXW9ubNd5aPP7yz/PDshe3Lx4/trj9+bHv6/n2HQzduOO+8etVl9YULrvPOnnWbePKkW9uRI27VBw64F+3e7ZG1aZNn4rp1HvGrVnloAQBmfpqVkHRu0wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  4088.  &gt;&lt;/span&gt;
  4089.  &lt;img
  4090.        class=&quot;gatsby-resp-image-image&quot;
  4091.        alt=&quot;Power Law&quot;
  4092.        title=&quot;&quot;
  4093.        src=&quot;/static/fb55737061a2c733f09ac1019211e3aa/5a46d/300px-Long_tail.svg.png&quot;
  4094.        srcset=&quot;/static/fb55737061a2c733f09ac1019211e3aa/12f09/300px-Long_tail.svg.png 148w,
  4095. /static/fb55737061a2c733f09ac1019211e3aa/e4a3f/300px-Long_tail.svg.png 295w,
  4096. /static/fb55737061a2c733f09ac1019211e3aa/5a46d/300px-Long_tail.svg.png 300w&quot;
  4097.        sizes=&quot;(max-width: 300px) 100vw, 300px&quot;
  4098.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  4099.        loading=&quot;lazy&quot;
  4100.        decoding=&quot;async&quot;
  4101.      /&gt;
  4102.  &lt;/a&gt;
  4103.    &lt;/span&gt;&lt;/p&gt;
  4104. &lt;p&gt;&lt;a href=&quot;http://www.shirky.com/writings/powerlaw_weblog.html&quot;&gt;Many&lt;/a&gt; &lt;a href=&quot;http://www.kottke.org/03/02/weblogs-and-power-laws&quot;&gt;have&lt;/a&gt; &lt;a href=&quot;http://ross.typepad.com/blog/2006/04/power_law_of_pa.html&quot;&gt;written&lt;/a&gt; that almost all measures of web site usage follow the same pattern whether that be page views, in-bound links, etc.&lt;/p&gt;
  4105. &lt;p&gt;This past semester I built an &lt;a href=&quot;http://isyscore.byu.edu/drupal&quot;&gt;e-learning site&lt;/a&gt; for two sections of an upper-level university course at Brigham Young University. Now that the semester is finished, we’ve started to analyze the data we’ve collected on how students used the site.&lt;/p&gt;
  4106. &lt;p&gt;And what did I notice when I started to graph the data? Why the power law of course.&lt;/p&gt;
  4107. &lt;p&gt;So onto the graphs I made.&lt;/p&gt;
  4108. &lt;p&gt;First is a graph of the number of comments each student made on the class website throughout the semester. This is a good measure of their engagement with the online community. You can see that some students left as many as 40-60 comments throughout the semester and others left as little as 1 or two:&lt;span
  4109.      class=&quot;gatsby-resp-image-wrapper&quot;
  4110.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  4111.    &gt;
  4112.      &lt;a
  4113.    class=&quot;gatsby-resp-image-link&quot;
  4114.    href=&quot;/static/5c01461644bd6f3db405ae08a6b1ff8c/aec65/num_comments_per_student.png&quot;
  4115.    style=&quot;display: block&quot;
  4116.    target=&quot;_blank&quot;
  4117.    rel=&quot;noopener&quot;
  4118.  &gt;
  4119.    &lt;span
  4120.    class=&quot;gatsby-resp-image-background-image&quot;
  4121.    style=&quot;padding-bottom: 99.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZElEQVR42mNgGDKgvr6eq7KyUhTKZaTUPPbi4mKxrq4uZRDn////FBvIEB8fL9He3q5ELQPZIiIipJqbm6nmQqbo6GhJYDiqUMtAZpCB1HQhS0JCgmptba09NMaZyDYJ5pqioiLDlpaWPBA7NDSUmVIDmbKzs40aGhryqebC3Nxcw8bGRqq5kDU9PV2rurp6S1ZWFg9FhsJcmJmZKQt04deqqqpeoGv5YF4n2WCogSzAnKJQU1PzFhgx/4GxfRwYppagsEVXC7IEG8ZwIdCr8sBI+Qh05X9gnv7X1NT0v7S0dFtZWVkiMH3KggqPVatWMRMdy3FxcdIVFRWny8vLbwFdeAUYnteBhj0Bij2sq6s7VlJSsgBoaU1GRkZ2fn5+XGJiog0w7dqCcFJSkh3QhwIoWQ9UZKWlpbECw4wNhu3t7VlAYsCSiBtosCCoRCooKJAE0VFRUYIwDAx/QaAPWIZGSQ0AtLO275jbQLYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  4122.  &gt;&lt;/span&gt;
  4123.  &lt;img
  4124.        class=&quot;gatsby-resp-image-image&quot;
  4125.        alt=&quot;Number of comments made by each student&quot;
  4126.        title=&quot;&quot;
  4127.        src=&quot;/static/5c01461644bd6f3db405ae08a6b1ff8c/fcda8/num_comments_per_student.png&quot;
  4128.        srcset=&quot;/static/5c01461644bd6f3db405ae08a6b1ff8c/12f09/num_comments_per_student.png 148w,
  4129. /static/5c01461644bd6f3db405ae08a6b1ff8c/e4a3f/num_comments_per_student.png 295w,
  4130. /static/5c01461644bd6f3db405ae08a6b1ff8c/fcda8/num_comments_per_student.png 590w,
  4131. /static/5c01461644bd6f3db405ae08a6b1ff8c/aec65/num_comments_per_student.png 687w&quot;
  4132.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  4133.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  4134.        loading=&quot;lazy&quot;
  4135.        decoding=&quot;async&quot;
  4136.      /&gt;
  4137.  &lt;/a&gt;
  4138.    &lt;/span&gt;&lt;/p&gt;
  4139. &lt;p&gt;Another graph which follows the power law. This time a graph of the number of visits to the class website per student. Again we see a wide disparity between students. One student visited the site over 400 times! Which in a four month semester means they visited the site on average 3 times a day! And on the other end, a number of students only visited the site 5-10 times the entire semester.&lt;/p&gt;
  4140. &lt;p&gt;&lt;span
  4141.      class=&quot;gatsby-resp-image-wrapper&quot;
  4142.      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
  4143.    &gt;
  4144.      &lt;a
  4145.    class=&quot;gatsby-resp-image-link&quot;
  4146.    href=&quot;/static/329ba603a82de673f4019c69d28847a0/aec65/num_visits_to_site_per_student.png&quot;
  4147.    style=&quot;display: block&quot;
  4148.    target=&quot;_blank&quot;
  4149.    rel=&quot;noopener&quot;
  4150.  &gt;
  4151.    &lt;span
  4152.    class=&quot;gatsby-resp-image-background-image&quot;
  4153.    style=&quot;padding-bottom: 99.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABXklEQVR42mNgGDLAw8ODPTo6mg/KZaTYwKSkJN6srCwJahnIZ2FhIZSRkSFGLQMZQQYmJyeLD1oD+SwtLcWA4ShFtUjx8fGRA7pQD8Sur69nooqB8fHxBtQwEOQ9jsDAQP24uLhAkEBoaCgz2ab9//8fHF6xsbGGiYmJeVQzMCYmRgfowukUexlqIKe3t7cSMJbfFRcXh8AMXbVqFTMIwywlyYUuLi5y6enpn8vLy78EBAQEEUo+IH2goIEGDyOGgaBYzszM/FhZWfk/Ly/vB5B9BZgV5wAtSQfS7sAgUczNzRVNS0sTAeV7oBYmfLHMbG9vL5OSknIaqOkGsJC4BjTnQXZ29gug2EOgBdcTEhJOAy3ZD0yr24D0UmAENgPlMoAWBXt6eurKy8tzIBsKso3R2NiYFegFNhAGuoQVZBFIDJg+OYB8LqBFPCDXAfkCUNdKgrIrUD0PPhcPLgAAEu6IsHbBhisAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  4154.  &gt;&lt;/span&gt;
  4155.  &lt;img
  4156.        class=&quot;gatsby-resp-image-image&quot;
  4157.        alt=&quot;Number of visits to the site made by each student&quot;
  4158.        title=&quot;&quot;
  4159.        src=&quot;/static/329ba603a82de673f4019c69d28847a0/fcda8/num_visits_to_site_per_student.png&quot;
  4160.        srcset=&quot;/static/329ba603a82de673f4019c69d28847a0/12f09/num_visits_to_site_per_student.png 148w,
  4161. /static/329ba603a82de673f4019c69d28847a0/e4a3f/num_visits_to_site_per_student.png 295w,
  4162. /static/329ba603a82de673f4019c69d28847a0/fcda8/num_visits_to_site_per_student.png 590w,
  4163. /static/329ba603a82de673f4019c69d28847a0/aec65/num_visits_to_site_per_student.png 687w&quot;
  4164.        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
  4165.        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
  4166.        loading=&quot;lazy&quot;
  4167.        decoding=&quot;async&quot;
  4168.      /&gt;
  4169.  &lt;/a&gt;
  4170.    &lt;/span&gt;&lt;/p&gt;
  4171. &lt;h3 id=&quot;why-the-power-law&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-the-power-law&quot; aria-label=&quot;why the power law permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why the Power Law?&lt;/h3&gt;
  4172. &lt;p&gt;So why does this happen? Why do some students participate on the class website so much more then other students? I’m not sure I know the answer to that. Why do some people write blogs, participate in Wikipedia, upload their photos to flickr, etc. and many others don’t?&lt;/p&gt;
  4173. &lt;p&gt;Do some students just not see &lt;a href=&quot;/why-i-blog-part-1/&quot;&gt;the value of blogging&lt;/a&gt;? Are some students more comfortable interacting online for whatever reason? Or on another tact, does it matter if some students participate more then others? After all, in any community, there’s always a core group which cares much more then others about the success of the community (read about the &lt;a href=&quot;http://ross.typepad.com/blog/2006/04/power_law_of_pa.html&quot;&gt;power law of participation&lt;/a&gt;). What type of participation in an online learning community meets the learning goals for a classroom?&lt;/p&gt;
  4174. &lt;p&gt;There’s a host of other ideas rumbling around in my head about power laws, the three types of networks (political, social, creative) and how all this relates to creating effective online learning/collaborative environments. But that will all have to wait for another day. In the meantime, here’s some links.&lt;/p&gt;
  4175. &lt;h4 id=&quot;extra-credit-reading&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#extra-credit-reading&quot; aria-label=&quot;extra credit reading permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extra Credit Reading:&lt;/h4&gt;
  4176. &lt;p&gt;Read these two articles by Ross Mayfield, &lt;a href=&quot;http://radio.weblogs.com/0114726/2003/02/12.html#a284&quot;&gt;first this one&lt;/a&gt;, &lt;a href=&quot;http://radio.weblogs.com/0114726/2003/02/10.html#a281&quot;&gt;then this one&lt;/a&gt;.&lt;/p&gt;
  4177. &lt;p&gt;Then two by Clay Shirky, &lt;a href=&quot;http://www.shirky.com/writings/powerlaw_weblog.html&quot;&gt;“Power Laws, Weblogs, and Inequality&lt;/a&gt;” and ”&lt;a href=&quot;http://shirky.com/writings/group_politics.html&quot;&gt;Social Software and the Politics of Groups&lt;/a&gt;.”&lt;/p&gt;
  4178. &lt;p&gt;And one more on &lt;a href=&quot;http://many.corante.com/archives/2003/12/22/think_group.php&quot;&gt;building vibrant communities&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[New elearning website]]></title><description><![CDATA[I’ve been putting some final touches on a website I built for a class running at BYU this semester on web analytics. You can visit the site…]]></description><link>https://bricolage.io/new-elearning-website/</link><guid isPermaLink="false">https://bricolage.io/new-elearning-website/</guid><pubDate>Sat, 02 Feb 2008 17:58:14 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been putting some final touches on a website I built for a class running at BYU this semester on web analytics. You can visit the site &lt;a href=&quot;http://ebiz2.byu.edu/analytics&quot;&gt;here&lt;/a&gt;. I did a &lt;a href=&quot;http://groups.drupal.org/node/8610&quot;&gt;write-up about the site&lt;/a&gt; for Drupal’s education working group. I discuss the design principles that guided my construction of the site.&lt;/p&gt;
  4179. &lt;p&gt;A bit from the write-up:&lt;/p&gt;
  4180. &lt;blockquote&gt;
  4181. &lt;p&gt;We recently created a &lt;a href=&quot;http://ebiz2.byu.edu/analytics&quot;&gt;community learning space&lt;/a&gt; for a web analytics class at &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt;. We directed students to create individual blogs on commercial blogging platforms such as blogspot, wordpress, and elsewhere. We are then using &lt;a href=&quot;http://drupal.org/project/feedapi&quot;&gt;FeedAPI&lt;/a&gt; to aggregate the student blogs and comments (&lt;a href=&quot;http://ebiz2.byu.edu/analytics/list-of-feeds&quot;&gt;see list of student feeds&lt;/a&gt;) into the community site. In addition, we’re aggregating blogs from prominent web analytic experts (&lt;a href=&quot;http://ebiz2.byu.edu/analytics/expert-feeds&quot;&gt;see list of expert feeds&lt;/a&gt;). A wiki and spot for announcements round out the list of features.&lt;/p&gt;
  4182. &lt;/blockquote&gt;
  4183. &lt;p&gt;&lt;a href=&quot;http://groups.drupal.org/node/8610&quot;&gt;Link to the write-up&lt;/a&gt;&lt;br&gt;
  4184. &lt;a href=&quot;http://ebiz2.byu.edu/analytics&quot;&gt;Link to the web site&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A dozen papers on enterprise2.0]]></title><description><![CDATA[A great list of articles/papers on enterprise2.0 from Jim McGee.]]></description><link>https://bricolage.io/a-dozen-papers-on-enterprise20-2/</link><guid isPermaLink="false">https://bricolage.io/a-dozen-papers-on-enterprise20-2/</guid><pubDate>Thu, 24 Jan 2008 01:09:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.mcgeesmusings.net/2007/12/12/a-dozen-papers-you-should-read-in-the-world-of-enterprise-20/&quot;&gt;A great list of articles/papers on enterprise2.0 from Jim McGee.&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[10 Ways to Grow your Network]]></title><description><![CDATA[From Jack Ricchiuto: Get to know the strengths and passions of people in your first and second circles. Make your strengths and passions…]]></description><link>https://bricolage.io/10-ways-to-grow-your-network/</link><guid isPermaLink="false">https://bricolage.io/10-ways-to-grow-your-network/</guid><pubDate>Thu, 24 Jan 2008 00:50:26 GMT</pubDate><content:encoded>&lt;p&gt;From &lt;a href=&quot;http://www.designinglife.com&quot;&gt;Jack Ricchiuto:&lt;/a&gt;&lt;/p&gt;
  4185. &lt;ol&gt;
  4186. &lt;li&gt;Get to know the strengths and passions of people in your first and second circles.&lt;/li&gt;
  4187. &lt;li&gt;Make your strengths and passions more known to your 1st two circles.&lt;/li&gt;
  4188. &lt;li&gt;Discover who in your 1st two circles would benefit from introductions.&lt;/li&gt;
  4189. &lt;li&gt;Make high quality introductions at the best levels possible.&lt;/li&gt;
  4190. &lt;li&gt;Engage your 2nd circle to introduce you to people in your 3rd circle.&lt;/li&gt;
  4191. &lt;li&gt;Look for new opportunities to learn with and from your first two circles.&lt;/li&gt;
  4192. &lt;li&gt;Create new opportunities to collaborate with your 1st two circles.&lt;/li&gt;
  4193. &lt;li&gt;Increase your asset, positional, and generative value in your networks.&lt;/li&gt;
  4194. &lt;li&gt;Help other people increase their value in their networks.&lt;/li&gt;
  4195. &lt;li&gt;Built trust and help others build trust through promise making and keeping.&lt;/li&gt;
  4196. &lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Enterprise 2.0 Case Studies]]></title><description><![CDATA[Some links to Enterprise 2.0 case studies: A collection of case studies from 2007 at Portals and KM Case study on installation of wiki…]]></description><link>https://bricolage.io/enterprise-20-case-studies/</link><guid isPermaLink="false">https://bricolage.io/enterprise-20-case-studies/</guid><pubDate>Wed, 16 Jan 2008 22:08:31 GMT</pubDate><content:encoded>&lt;p&gt;Some links to Enterprise 2.0 case studies:&lt;/p&gt;
  4197. &lt;p&gt;A collection of case studies from 2007 at &lt;a href=&quot;http://billives.typepad.com/portals_and_km/2008/01/enterprise-20-s.html&quot;&gt;Portals and KM&lt;/a&gt;&lt;/p&gt;
  4198. &lt;p&gt;&lt;a href=&quot;http://www.socialtext.com/node/80&quot;&gt;Case study on installation of wiki software at DrKW&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What I've been up to lately]]></title><description><![CDATA[I’ve gotten involved in a number of new projects in the past 6-7 months so thought I’d update y’all in what I’m doing. School: After a…]]></description><link>https://bricolage.io/what-ive-been-up-to-lately/</link><guid isPermaLink="false">https://bricolage.io/what-ive-been-up-to-lately/</guid><pubDate>Wed, 02 Jan 2008 01:56:46 GMT</pubDate><content:encoded>&lt;p&gt;I’ve gotten involved in a number of new projects in the past 6-7 months so thought I’d update y’all in what I’m doing.&lt;/p&gt;
  4199. &lt;h3 id=&quot;school&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#school&quot; aria-label=&quot;school permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;School:&lt;/h3&gt;
  4200. &lt;p&gt;After a lovely summer break with no school and my time spent vacationing and working at a number of jobs, I came back to &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt; for my first semester in the &lt;a href=&quot;http://isys.byu.edu&quot;&gt;Masters of Information Systems program&lt;/a&gt;. But, as my classes this past semester were pretty boring, I won’t mention school anymore here.&lt;/p&gt;
  4201. &lt;h3 id=&quot;e-commerce-websites&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#e-commerce-websites&quot; aria-label=&quot;e commerce websites permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;E-commerce websites:&lt;/h3&gt;
  4202. &lt;p&gt;I’ve built two e-commerce sites over the past six months using &lt;a href=&quot;http://ubercart.org&quot;&gt;Ubercart&lt;/a&gt; (a fantastic open source shopping cart — if you’re in the market for that sort of thing). Ubercart is a module (cf. plugin/extension) for &lt;a href=&quot;http://drupal.org&quot; title=&quot;drupal&quot;&gt;Drupal&lt;/a&gt;, an open source &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_management_system&quot;&gt;content management system&lt;/a&gt;, another technology I’ve been working with extensively.&lt;/p&gt;
  4203. &lt;p&gt;This past June, with two friends, I started a t-shirt company running out of our apartment. As the lone techie, I built our website at &lt;a href=&quot;http://coolcamisa.com&quot;&gt;coolcamisa.com&lt;/a&gt;. By our expectations, the company has been a rousing success (i.e., we didn’t lose money)! We paid back our start-up costs by September (2 1/2 months from launch) and have netted some two grand since then. Not bad for our little apartment-based bootstrapped business. I’ve learned tons about starting a business, legal stuff (we organized as an LLC), pricing, marketing, website development, etc.&lt;/p&gt;
  4204. &lt;p&gt;My second e-commerce site I started just recently. A good friend of mine, Nicole Sheahan, released her first CD in December (She’s an excellent singer btw, &lt;a href=&quot;http://nicolesheahan.com/product/invisible-facts&quot;&gt;so go buy her cd&lt;/a&gt;). I’ve been helping her set up a website to sell / market her music. The site is still a work in progress but it’s amazing to me how fast it has come together. I’ve been working with open source software for awhile but I’m still impressed that I can singlehandedly put together a fully functional ecommerce store in under 10 hours for no cost other then my labor. That’s the power of a community.&lt;/p&gt;
  4205. &lt;h3 id=&quot;other-drupal-web-sites&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#other-drupal-web-sites&quot; aria-label=&quot;other drupal web sites permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Other (Drupal) web sites:&lt;/h3&gt;
  4206. &lt;p&gt;With a friend, I’ve been volunteering to build a website for the Utah Valley Ministerial Association. The &lt;a href=&quot;http://utahvalleyinterfaith.org&quot;&gt;website&lt;/a&gt; will have news and events from churches in Utah County and serve as an online directory of churches in Utah County and surrounding communities. The site is not yet fully operational but it’s soon in coming. Drupal’s ”&lt;a href=&quot;http://drupal.org/project/views&quot;&gt;Views&lt;/a&gt;” module was the real workhorse here slicing and dicing the church listings for display in a number of different ways. As you can see on the website, the different “views” of the data enable a user to find churches by city, denomination, or language.&lt;/p&gt;
  4207. &lt;h4 id=&quot;family-history-site&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#family-history-site&quot; aria-label=&quot;family history site permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Family History Site&lt;/h4&gt;
  4208. &lt;p&gt;Because of my Mormon heritage, the genealogy of my ancestors is very well done. Most of my ancestoral lines are traced back to the 17-18th centuries. About two years ago, my siblings/parents and I decided that while it’s great to have names, dates, and places from our ancestors, what is really interesting is to read the stories and letters they wrote and view pictures of them and where they lived. These stories/letters/pictures/etc. flesh out the skeletal data we see on the normal family history tree.&lt;/p&gt;
  4209. &lt;p&gt;But while current genealogical software does very well at organizing, storing, and sharing genealogical data, it does a poor job at handling other types of information. Documents and pictures tend to get lost in attics of aunts/uncles/grandparents. If you don’t have them, they’re hard to get hold of and you have them, they’re hard to share with relatives.&lt;/p&gt;
  4210. &lt;p&gt;We decided the best solution to this problem would be to create a website. Our first answer was a &lt;a href=&quot;http://familyhistory.mathews2000.com/&quot;&gt;wiki&lt;/a&gt; &lt;a href=&quot;http://bunker.mathews2000.com/&quot;&gt;website&lt;/a&gt;. The wiki software made it easy for our widely distributed family to work together on gathering information. But after some time we grew dissatisfied with the limitations of our wiki software and decided to migrate our site to one based on Drupal. That migration is still in progress but we’re excited as Drupal will give us much more control over how information is stored and displayed (albeit with a great deal more complexity).&lt;/p&gt;
  4211. &lt;h3 id=&quot;a-new-job&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-new-job&quot; aria-label=&quot;a new job permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A New Job&lt;/h3&gt;
  4212. &lt;p&gt;In June, I started working as an research assistant at &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt; in the &lt;a href=&quot;http://ebusiness.byu.edu/&quot;&gt;Kevin &amp;#x26; Debra Rollin’s Center for eBusiness&lt;/a&gt;.&lt;/p&gt;
  4213. &lt;p&gt;I’m working with a professor and a pH.D student studying how web2.0 technologies can be used in the classroom to help students become more active learners.&lt;/p&gt;
  4214. &lt;p&gt;So far I can say this is the best job I’ve ever had. What I’m doing and learning just fascinates me.&lt;/p&gt;
  4215. &lt;p&gt;Our main research thrust this past semester was creating a community site for a class to use at BYU — &lt;a href=&quot;http://isyscore.byu.edu/drupal&quot;&gt;http://isyscore.byu.edu/drupal&lt;/a&gt;.&lt;/p&gt;
  4216. &lt;p&gt;We have learned a lot from the experience — and it’s given us mountains of data to sift through — more on that in the future hopefully. Building the site showed me again the power Drupal gives a website developer (even if they really don’t know what they’re doing) to create sophisticated sites.&lt;/p&gt;
  4217. &lt;p&gt;My other big project for my research job is creating a new module for Drupal called &lt;a href=&quot;http://drupal.org/project/writing_assignment&quot;&gt;writing_assignment&lt;/a&gt;. This module will make it easy for teachers to give students writing assignments on a Drupal website. It will also facilitate easy peer-review and peer-grading of those assignments. This is my first Drupal module plus my first extensive project in PHP so I have faced quite the learning curve. You can read more about my module &lt;a href=&quot;http://groups.drupal.org/node/7401&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I really liked these insights]]></title><description><![CDATA[From the Economist: At some point in the decade after he moved from the farm in Nebraska where he grew up to the innovation hub that is the…]]></description><link>https://bricolage.io/i-really-liked-these-insights/</link><guid isPermaLink="false">https://bricolage.io/i-really-liked-these-insights/</guid><pubDate>Mon, 31 Dec 2007 21:25:54 GMT</pubDate><content:encoded>&lt;p&gt;From the &lt;a href=&quot;http://www.economist.com/business/displaystory.cfm?story_id=10328123&quot;&gt;Economist:&lt;/a&gt;&lt;/p&gt;
  4218. &lt;blockquote&gt;
  4219. &lt;p&gt;At some point in the decade after he moved from the farm in Nebraska where he grew up to the innovation hub that is the San Francisco Bay Area, Evan Williams accidentally stumbled upon three insights:&lt;/p&gt;
  4220. &lt;ol&gt;
  4221. &lt;li&gt;that genuinely new ideas are, well, accidentally stumbled upon rather than sought out&lt;/li&gt;
  4222. &lt;li&gt;second, that new ideas are by definition hard to explain to others, because words can express only what is already known&lt;/li&gt;
  4223. &lt;li&gt;and third, that good ideas seem obvious in retrospect.&lt;/li&gt;
  4224. &lt;/ol&gt;
  4225. &lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Why I blog—Part 2]]></title><description><![CDATA[A year ago in just my second blog post, I explained why I write a blog. My answer then (and now) is I keep a blog as an intellectual journal…]]></description><link>https://bricolage.io/why-i-blog-part-2/</link><guid isPermaLink="false">https://bricolage.io/why-i-blog-part-2/</guid><pubDate>Fri, 26 Oct 2007 04:57:56 GMT</pubDate><content:encoded>&lt;p&gt;A year ago in just &lt;a href=&quot;/why-i-blog-part-1/&quot;&gt;my second blog post&lt;/a&gt;, I explained why I write a blog. My answer then (and now) is I keep a blog as an intellectual journal of sorts. Blogging is my way of pulling together into a coherent form all the stray thoughts rolling around in my mind. Writing helps me sift the good thoughts from all the bad and fit them all together in a logical pattern.&lt;/p&gt;
  4226. &lt;p&gt;Keeping an intellectual journal is the main reason for writing my blog. My secondary reason is pure economics. Blogging is a loss-leader of sorts. Through this blog I market myself and my ideas to people who I hope to do business with eventually.&lt;/p&gt;
  4227. &lt;p&gt;Along those lines I read a &lt;a href=&quot;http://www.economist.com/blogs/freeexchange/2007/10/comment_is_free.cfm&quot;&gt;blog post today from The Economist&lt;/a&gt; website. The author was commenting on a &lt;a href=&quot;http://files.ssds.ucdavis.edu/chsc/Discover_Your_Inner_Economist.mp4&quot;&gt;recent podcast on the economics of blogging by Tyler Cowen&lt;/a&gt; (of &lt;a href=&quot;http://www.marginalrevolution.com/&quot;&gt;Marginal Revolution&lt;/a&gt; fame).&lt;/p&gt;
  4228. &lt;blockquote&gt;
  4229. &lt;p&gt;While the direct economic return to authoring a blog may not appear to justify the effort, the prospect of actively demonstrating one’s skillset for an interested public, many members of which work in talent-hungry organisations that pay real salaries, is an attractive one. Why waste time submitting CVs, when you could cultivate an audience of potential employers intimately familiar with your talents?&lt;/p&gt;
  4230. &lt;/blockquote&gt;
  4231. &lt;blockquote&gt;
  4232. &lt;p&gt;Interestingly, this effect could generate a filtering effect on the blogosphere quite opposed to the market for lemon model &lt;a href=&quot;http://rodrik.typepad.com/dani_rodriks_weblog/2007/10/is-the-econ-blo.html&quot;&gt;proposed&lt;/a&gt; by Dani Rodrik. If blog writers generally have employment in mind, we should expect those with strong resumés but lackluster ideas to abstain from extensive blogging, while those whose critical and analytical skills run ahead of the experience and education categories on their CVs should embrace blogging as a means to signal their exceptional fitness. We would expect those with most to gain from blogging to blog more.&lt;/p&gt;
  4233. &lt;/blockquote&gt;
  4234. &lt;p&gt;I’ve always found school boring and homework a less then optimal use of my time. So my grades reflect that. “Good students” use grades as a signaling mechanism. A student with good grades is telling potential employers, “I’m reasonably intelligent and can tolerate boredom” — which is what’s really required at school and most jobs.&lt;/p&gt;
  4235. &lt;p&gt;As my grades aren’t going to impress anyone, I compensate by blogging. I use this blog to “show off”, so to speak, my critical and analytic skills, my ideas, and my passion for social software, learning, and collaboration to potential employers.&lt;/p&gt;
  4236. &lt;p&gt;But for now this is all theory—whether this works or not is still a bit up in the air… but in the meantime it’s better then homework… and since I’m done writing, back now to accounting homework I guess :&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Two's Company, Three's a crowd: Why better social software is needed to support (small) group interactions]]></title><description><![CDATA[For my research job at BYU, I’m reading quite a bit about social software, which is, as defined by Clay Shirky, software that supports group…]]></description><link>https://bricolage.io/twos-company-threes-a-crowd-why-better-social-software-needed-support-small-group-in/</link><guid isPermaLink="false">https://bricolage.io/twos-company-threes-a-crowd-why-better-social-software-needed-support-small-group-in/</guid><pubDate>Thu, 09 Aug 2007 16:39:34 GMT</pubDate><content:encoded>&lt;p&gt;For my research job at &lt;a href=&quot;http://byu.edu&quot;&gt;BYU&lt;/a&gt;, I’m reading quite a bit about social software, which is, &lt;a href=&quot;http://www.shirky.com/&quot;&gt;as defined by Clay Shirky&lt;/a&gt;, software that supports group interactions. One article I read recently by Clay entitled, ”&lt;a href=&quot;http://shirky.com/writings/community_scale.html&quot;&gt;Communities, Audiences, and Scale&lt;/a&gt;“is especially good and provided much of the inspiration for this post. The gist of the article is that audiences scale and communities don’t. And understanding this principle I think is extra ordinarily important for designers of social software.&lt;/p&gt;
  4237. &lt;p&gt;So what is the difference between audiences and communities? Audiences primarily consume content, communities primarily communicate with one another. TVs have audiences — they have large numbers of people that watch their content. But there is very little communication between individual watchers of TV and between the watchers and the makers of TV content. On the other hand, a small group of men who gather to play cards on Friday nights is a community — because they actively communicate with one another. Communities communicate with one another, audiences don’t.&lt;/p&gt;
  4238. &lt;p&gt;In addition, a group is a group and a community is a community because of the connections that form between its members. Two best friends have very strong connections. A high school basketball team has connections from running lines and sitting on the bus together for long road trips.&lt;/p&gt;
  4239. &lt;p&gt;But connections get weaker and weaker as a group or community adds more members. Connections are created by communication. With two people, all communications happens between the two people. So the connections made are very strong. Add another person and the number of connections that need to be maintained increases from 1 to 3. Add another person making 4 in the group and the number of connections increases from 3 to 6. Add another member and the connections become 10 (&lt;a href=&quot;http://shirky.com/writings/community_scale.html#2&quot;&gt;read Clay for more of the math&lt;/a&gt;). Obviously as the group grows larger and larger, the bonds weaken between individual members of the group.&lt;/p&gt;
  4240. &lt;p&gt;This idea is encapsulated in several common English expressions like “two’s company, three’s a crowd”. Amongst young people, a person who tries to hang out with a couple feels like and is sometimes referred to as a ”&lt;a href=&quot;http://www.goenglish.com/ThirdWheel.asp&quot;&gt;third wheel&lt;/a&gt;”. It’s possible to have 2-3 best friends but no more. The “gang” you hung out with in high school probably had 4-7 people but no more. Older people tend to have fewer friends then younger adults but with closer bonds. Clay Shirky references the research of primatologist Robin Dunbar who argues that, “humans are adapted for social group sizes of around 150 or less, a size that shows up in a number of traditional societies, as well as in present day groups such as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Hutterite&quot;&gt;Hutterite religious communities&lt;/a&gt;.”&lt;/p&gt;
  4241. &lt;p&gt;This contradicts a fundamental assumption of most designers of social software that “more users is always a good thing.” Different types of groups can maintain their identity to different sizes but at some scale all online communities start to lose the dense interconnections that make the community a community.&lt;/p&gt;
  4242. &lt;p&gt;The line where an audience begins and a community ends can get rather murky with online social software. Consider for example the weblog. If three girlfriends use blogs to discuss their lives, this is obviously a community. On the other hand, a popular blogger such as &lt;a href=&quot;http://sethgodin.typepad.com/&quot;&gt;Seth Goodin&lt;/a&gt; is not supporting a community on its blog but is operating a broadcast media platform much as CNN or Fox News.&lt;/p&gt;
  4243. &lt;p&gt;I’m experiencing a good example of this murkiness. &lt;a href=&quot;http://en.wikipedia.org/wiki/Electronic_mailing_list&quot;&gt;A Mailing list&lt;/a&gt; is an example of social software often used to support online communities. I am a student at BYU majoring in Information Systems. The ISys department at BYU provides a mailing list for the use of the 200+ students who are in the ISys major. The mailing list is quite popular — I’d say it sees an average of 10-20 emails a day during the school year&lt;/p&gt;
  4244. &lt;p&gt;But the funny thing I’ve observed in the year or so I’ve been on the list is that even though everyone has equal rights to email the list, I see the same 10-15 names over and over. The rest of the ISys students don’t communicate via the mailing list but rather are audience members. So it seems the mailing list, as a community-building device, can’t scale past a certain number of people.&lt;/p&gt;
  4245. &lt;p&gt;So why does it matter if our social software isn’t so social at times, or that not everyone can/will participate on a mass mailing list? We should care because we are social creatures. In our increasingly rushed and splintered world, technology can help fulfill our need for friends and community.&lt;/p&gt;
  4246. &lt;p&gt;&lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel Spolsky&lt;/a&gt;, in a post entitled ”&lt;a href=&quot;http://www.joelonsoftware.com/articles/BuildingCommunitieswithSo.html&quot;&gt;Building Communities with Software&lt;/a&gt;” speaks movingly of our need as humans for community and how social software can fulfill that need. He ends his post with this message, “Creating community, in any case, is a noble goal, because it’s sorely missing for so many of us. Let’s keep plugging away at it.”&lt;/p&gt;
  4247. &lt;p&gt;Social software done right can create a community for all its participants. I feel strongly about the need for excellent social software, in our schools, workplaces, and other organizations. Social software can help us learn, work, and live with greater effectiveness and joy.&lt;/p&gt;
  4248. &lt;p&gt;In my next few posts I’ll continue to explore the fundamental problems and opportunities with social software.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A new focus for my blog]]></title><description><![CDATA[This summer I’ve been hired on part-time by the eBusiness center at BYU to do research into social software. Specifically, I and the…]]></description><link>https://bricolage.io/a-new-focus-my-blog/</link><guid isPermaLink="false">https://bricolage.io/a-new-focus-my-blog/</guid><pubDate>Wed, 01 Aug 2007 00:30:56 GMT</pubDate><content:encoded>&lt;p&gt;This summer I’ve been hired on part-time by the eBusiness center at BYU to do research into &lt;a href=&quot;http://en.wikipedia.org/wiki/Social_software&quot;&gt;social software&lt;/a&gt;. Specifically, I and the professor I’m working with &lt;a href=&quot;http://www.clintrogersonline.com/blog/&quot;&gt;Dr. Clint Rogers&lt;/a&gt;, are interested in how social software can be used to support learning — an approach commonly referred to as ”&lt;a href=&quot;http://en.wikipedia.org/wiki/E-learning#E-Learning_2.0&quot;&gt;elearning2.0&lt;/a&gt;“.&lt;/p&gt;
  4249. &lt;p&gt;So for the rest of this summer (and hopefully on into the fall) I plan to use this blog as a sounding board as I reason through different ideas and questions I have about about social software.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The stories activists tell and believe]]></title><description><![CDATA[From John Gardner, former secretary of health, education, and welfare under Lyndon B. Johnson. He pinpoints what’s wrong with virtually…]]></description><link>https://bricolage.io/the-stories-activists-tell-and-believe/</link><guid isPermaLink="false">https://bricolage.io/the-stories-activists-tell-and-believe/</guid><pubDate>Sat, 14 Jul 2007 04:22:38 GMT</pubDate><content:encoded>&lt;p&gt;From John Gardner, former secretary of health, education, and welfare under Lyndon B. Johnson. He pinpoints what’s wrong with virtually every activist group.&lt;/p&gt;
  4250. &lt;blockquote&gt;
  4251. &lt;p&gt;The possibility of coherent community action is diminished today by the deep mutual suspicions and antagonisms among various groups in our national life.&lt;/p&gt;
  4252. &lt;p&gt;As these antagonisms become more intense, the pathology is much the same… . The ingredients are, first, a deep conviction on the part of the group as to its own limitless virtue or the overriding sanctity of its cause; second, grave doubts concerning the moral integrity of all others; third, a chronically aggrieved feeling that power has fallen into the hands of the unworthy (that is, the hands of others)… .&lt;/p&gt;
  4253. &lt;p&gt;Political extremism involves two prime ingredients: An excessively simple diagnosis of the world’s ills and a conviction that there are identifiable villains back of it all… . Blind belief in one’s cause and a low view of the morality of other Americans—these seem mild failings. But they are the soil in which ranker weeds take root … terrorism, and the deep, destructive cleavages that paralyze society.&lt;/p&gt;
  4254. &lt;/blockquote&gt;
  4255. &lt;p&gt;&lt;a href=&quot;/writing-and-the-power-of-stories/&quot;&gt;Stories are powerful&lt;/a&gt;; for truth and for error.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Purple Cow Erratum]]></title><description><![CDATA[I’ve been reading “Purple Cow” by Seth Godin lately and am loving it. I read one of the case studies in the book today and found it quite…]]></description><link>https://bricolage.io/purple-cow-erratum/</link><guid isPermaLink="false">https://bricolage.io/purple-cow-erratum/</guid><pubDate>Mon, 02 Jul 2007 18:55:15 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been reading &lt;a href=&quot;http://www.amazon.com/Purple-Cow-Transform-Business-Remarkable/dp/159184021X&quot;&gt;“Purple Cow”&lt;/a&gt; by &lt;a href=&quot;http://sethgodin.typepad.com/&quot;&gt;Seth Godin&lt;/a&gt; lately and am loving it. I read one of the case studies in the book today and found it quite funny in light of the &lt;a href=&quot;http://www.bloomberg.com/apps/news?pid=20601087&amp;#x26;sid=aKtbJPOEkO.U&quot;&gt;500,000 iPhones Apple sold last Friday&lt;/a&gt;.&lt;/p&gt;
  4256. &lt;p&gt;He wrote:&lt;/p&gt;
  4257. &lt;blockquote&gt;
  4258. &lt;h3 id=&quot;case-study-motorola-and-nokia&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#case-study-motorola-and-nokia&quot; aria-label=&quot;case study motorola and nokia permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Case Study: Motorola and Nokia&lt;/h3&gt;
  4259. &lt;p&gt;Guess what? Cell phones are now boring. Just about everyone who needs a phone now has one. Most people who want a phone have one, too. The companies that built that revolution now have a problem: What next?What do they have to put into a phone to get people to notice it? Is it possible to make a remarkable phone anymore?&lt;/p&gt;
  4260. &lt;/blockquote&gt;
  4261. &lt;p&gt;It’s obvious now that Apple has figured out how to make a remarkable phone with its iPhone, a purple cow worthy phone, while Nokia and Motorola have not.&lt;/p&gt;
  4262. &lt;p&gt;Perhaps it’s time for Seth to update his case study?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Get a Wiki: Why Your Organization needs a Wiki]]></title><description><![CDATA[Everyone can participate Wikis flatten rigid hierachies and ease the flow of information. Bright ideas can come from anywhere within your…]]></description><link>https://bricolage.io/get-a-wiki-why-your-organization-needs-a-wiki/</link><guid isPermaLink="false">https://bricolage.io/get-a-wiki-why-your-organization-needs-a-wiki/</guid><pubDate>Sat, 05 May 2007 20:03:57 GMT</pubDate><content:encoded>&lt;h3 id=&quot;everyone-can-participate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#everyone-can-participate&quot; aria-label=&quot;everyone can participate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Everyone can participate&lt;/h3&gt;
  4263. &lt;p&gt;Wikis flatten rigid hierachies and ease the flow of information. Bright ideas can come from anywhere within your organization. Wikis let everyone participate and help the best ideas to emerge. Wikis make it easy for large number of people to collaborate.&lt;/p&gt;
  4264. &lt;h3 id=&quot;a-wikipedia-for-your-organization&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-wikipedia-for-your-organization&quot; aria-label=&quot;a wikipedia for your organization permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Wikipedia for your organization&lt;/h3&gt;
  4265. &lt;p&gt;Just like Wikipedia documents the world’s information, your new wiki will become the repository for your organization’s knowledge. How easy is it to find information on your intranet? Change that with a wiki. Everything from legal documents, to meeting notes, to project collaboration, to pictures from your last party can and should be stored on your wiki. A wiki is a great place to store all the “stuff” your organization generates in a simple, easy, findable manner. Free information from the grips of the inbox.&lt;/p&gt;
  4266. &lt;h3 id=&quot;low-cost&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#low-cost&quot; aria-label=&quot;low cost permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Low cost&lt;/h3&gt;
  4267. &lt;p&gt;While there are plenty of commercial wiki companies that’d love to sell you a wiki — and provide great value, there’s no excuse for not jumping into the wiki world with the large number of great free open-source wikis available. Enthusiastic wiki-lovers the world over have banded together to create enterprise-ready wiki software. My favorite is &lt;a href=&quot;http://www.twiki.org&quot;&gt;TWiki&lt;/a&gt; but don’t stop looking there. The &lt;a href=&quot;http://www.wikimatrix.org/&quot;&gt;WikiMatrix&lt;/a&gt; is an easy way to learn about the many wikis available.&lt;/p&gt;
  4268. &lt;p&gt;Thousands of organizations are using wikis. Read customer success stories from organizations using &lt;a href=&quot;http://twiki.org/cgi-bin/view/Main/TWikiSuccessStories&quot;&gt;TWiki&lt;/a&gt;, &lt;a href=&quot;http://www.socialtext.com/customerstories&quot;&gt;Socialtext&lt;/a&gt;, and &lt;a href=&quot;http://www.atlassian.com/software/confluence/casestudies/default.jsp&quot;&gt;Confluence&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ubuntu Tutorial: How to launch a GUI from cron in Ubuntu]]></title><description><![CDATA[On Sunday, I spent a good half-hour with Google learning how to launch a GUI application in Ubuntu using cron. I wanted to write a brief…]]></description><link>https://bricolage.io/ubuntu-tutorial-how-to-launch-an-gui-from-cron-i/</link><guid isPermaLink="false">https://bricolage.io/ubuntu-tutorial-how-to-launch-an-gui-from-cron-i/</guid><pubDate>Wed, 02 May 2007 04:07:15 GMT</pubDate><content:encoded>&lt;p&gt;On Sunday, I spent a good half-hour with Google learning how to launch a GUI application in Ubuntu using cron. I wanted to write a brief post here explaining the process so as to help another weary Googler more quickly on their way.&lt;/p&gt;
  4269. &lt;p&gt;My situation is this: I use a nifty little flashcard-like study program called &lt;a href=&quot;http://mnemosyne-proj.sourceforge.net/&quot;&gt;Mnemosyne&lt;/a&gt;. I use it to study foreign languages and for school. Ideally I should run it daily — but I often forget, which slows my learning. So I decided to create a cron job which would run the program every day at 7 AM.&lt;/p&gt;
  4270. &lt;p&gt;Using the &lt;a href=&quot;http://en.wikipedia.org/wiki/Crontab&quot;&gt;normal crontab syntax&lt;/a&gt; I made this entry:&lt;/p&gt;
  4271. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; * * * mnemosyne&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  4272. &lt;p&gt;This, I thought, would run mnemosyne once a day at 7 AM. Unfortunately I was wrong. After much searching around I found the &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=185993&quot;&gt;solution on the Ubuntu forums&lt;/a&gt; (always a great resource). My problem was that because cron doesn’t run in the X session (The program that controls all GUIs in Linux), when you try to run a GUI program, cron doesn’t know where to start it. To tell cron where to start the GUI, I changed my crontab entry as follows:&lt;/p&gt;
  4273. &lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; * * * &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;DISPLAY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;:0 &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; /usr/bin/mnemosyne&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  4274. &lt;p&gt;And finally success!&lt;/p&gt;
  4275. &lt;p&gt;The &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=185993&quot;&gt;post on the Ubuntu Forums&lt;/a&gt; I found explains all this and more and gives a number of examples.&lt;/p&gt;
  4276. &lt;p&gt;Also, for those wanting a more general tutorial on crontab syntax, &lt;a href=&quot;http://en.wikipedia.org/wiki/Crontab&quot;&gt;see the crontab article on wikipedia.&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SEO (Search Engine Optimization) Basics]]></title><description><![CDATA[A website’s goal is to convert as many visitors as possible The number of conversions depend on two factors: number of visitors % of total…]]></description><link>https://bricolage.io/seo-search-engine-optimization-basics/</link><guid isPermaLink="false">https://bricolage.io/seo-search-engine-optimization-basics/</guid><pubDate>Thu, 19 Apr 2007 22:00:37 GMT</pubDate><content:encoded>&lt;p&gt;A website’s goal is to convert as many visitors as possible&lt;/p&gt;
  4277. &lt;p&gt;The number of conversions depend on two factors:&lt;/p&gt;
  4278. &lt;ol&gt;
  4279. &lt;li&gt;number of visitors&lt;/li&gt;
  4280. &lt;li&gt;% of total visitors the website converts&lt;/li&gt;
  4281. &lt;/ol&gt;
  4282. &lt;p&gt;SEO practitioners optimize web pages so the pages show up high in search engine rankings. This drives more traffic to the page which increases the number of conversions. How high a web page shows up in a search engine ranking page (SERP) is &lt;a href=&quot;http://www.seomoz.org/blog/if-your-page-ranks-well-youd-better-be-messing-with-it&quot; title=&quot;SEO ranking factors&quot;&gt;based on three factors:&lt;/a&gt;&lt;/p&gt;
  4283. &lt;ol&gt;
  4284. &lt;li&gt;Strength of the domain (measured by links, trust, age, and possibly some usage factors)&lt;/li&gt;
  4285. &lt;li&gt;Internal and external links to the page&lt;/li&gt;
  4286. &lt;li&gt;Keyword in the title tag&lt;/li&gt;
  4287. &lt;/ol&gt;
  4288. &lt;p&gt;Other pages I found helpful to understand SEO:&lt;/p&gt;
  4289. &lt;ul&gt;
  4290. &lt;li&gt;&lt;a href=&quot;http://www.seomoz.org/blog/if-your-page-ranks-well-youd-better-be-messing-with-it&quot;&gt;If Your Page Ranks Well, You’d Better Be Messing With It&lt;/a&gt;&lt;/li&gt;
  4291. &lt;li&gt;&lt;a href=&quot;http://www.stuntdubl.com/2006/10/04/website-questions/&quot;&gt;18 Questions Your CEO Forgot to Ask When Building Your Website&lt;/a&gt;&lt;/li&gt;
  4292. &lt;li&gt;&lt;a href=&quot;http://blog.outer-court.com/archive/2007-01-07-n13.html&quot;&gt;The Basics of Search Engine Optimization&lt;/a&gt;&lt;/li&gt;
  4293. &lt;li&gt;&lt;a href=&quot;http://www.bruceclay.com/ppc/keywordshowto.htm&quot;&gt;How to Build a Keyword List&lt;/a&gt;&lt;/li&gt;
  4294. &lt;li&gt;&lt;a href=&quot;http://www.vaughns-1-pagers.com/internet/google-ranking-factors.htm&quot;&gt;Google Ranking Factors - SEO Checklist&lt;/a&gt;&lt;/li&gt;
  4295. &lt;li&gt;&lt;a href=&quot;http://www.seomoz.org/article/beginners-guide-to-search-engine-optimization&quot;&gt;Beginner’s Guide to Search Engine Optimization&lt;/a&gt;&lt;/li&gt;
  4296. &lt;li&gt;&lt;a href=&quot;http://www.sugarrae.com/blog/before-you-launch-that-local-small-business-website/&quot; title=&quot;Permanent Link to Before You Launch that Local Small Business Website&quot;&gt;Before You Launch that Local Small Business Website — SEO basics for small companies&lt;/a&gt;&lt;/li&gt;
  4297. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Enterprise 2.0 — A Summary Post]]></title><description><![CDATA[I have long been fascinated by the new technologies, blogs, wikis, and so forth, that collectively make up what is known as enterprise2.0. I…]]></description><link>https://bricolage.io/enterprise-20-my-attempt-to-summarize/</link><guid isPermaLink="false">https://bricolage.io/enterprise-20-my-attempt-to-summarize/</guid><pubDate>Wed, 14 Mar 2007 13:53:48 GMT</pubDate><content:encoded>&lt;p&gt;I have long been fascinated by the new technologies, blogs, wikis, and so forth, that collectively make up what is known as enterprise2.0. I am fascinated by their promise to revolutionize, as email, how we work and how we communicate and I want to be part of developing these technologies. This post is a compilation of many of the things I’ve read about enterprise 2.0. It is an attempt to make the case for why four technologies, wikis, blogs, Content Resource Management (CRM), and web-based project management tools, should be used in the enterprise (and every other organization for that manner).&lt;/p&gt;
  4298. &lt;p&gt;Organizations want good collaboration and management tools. What are the properties of an idea collaboration/management tool?&lt;/p&gt;
  4299. &lt;ul&gt;
  4300. &lt;li&gt;the tool is as simple as possible, but not too simple&lt;/li&gt;
  4301. &lt;li&gt;inexpensive&lt;/li&gt;
  4302. &lt;li&gt;easy setup/maintenance&lt;/li&gt;
  4303. &lt;li&gt;all can contribute&lt;/li&gt;
  4304. &lt;li&gt;works with existing tools&lt;/li&gt;
  4305. &lt;li&gt;just works&lt;/li&gt;
  4306. &lt;/ul&gt;
  4307. &lt;p&gt;Business analysts are recognizing these needs are unfulfilled by today’s groupware tools. Developers and companies around the globe have created new collaboration tools to solve these problems. Examples of these tools include: wikis, blogs, lightweight project management tools, and online calendaring software. These tools and the philosophy behind them have come to be known collectively under the name of Enterprise 2.0. These tools have come to the attention of academics and large companies such as IBM and Microsoft who are implementing many of these ideas into their software. IBM’s Lotus Notes supports the creation of blogs and wikis. Microsoft’s new Sharepoint 2007 includes a tightly-integrated wiki.&lt;/p&gt;
  4308. &lt;p&gt;The vast user base of already installed Enterprise 2.0 software tools show the great potential of social software within the enterprise. Enterprise 2.0 tools promise to provide more flexible and efficient collaboration within organizations.&lt;/p&gt;
  4309. &lt;p&gt;Andrew McAfee, professor at Harvard Business School &lt;a href=&quot;http://blog.hbs.edu/faculty/amcafee/index.php/faculty_amcafee_v3/enterprise_20_version_20/&quot;&gt;defines Enterprise 2.0&lt;/a&gt; as follows&lt;/p&gt;
  4310. &lt;blockquote&gt;
  4311. &lt;p&gt;Enterprise 2.0 is the use of emergent social software platforms within companies, or between companies and their partners or customers.&lt;/p&gt;
  4312. &lt;/blockquote&gt;
  4313. &lt;p&gt;‘Freeform’ in this case means that the software is most or all of the following:&lt;/p&gt;
  4314. &lt;ul&gt;
  4315. &lt;li&gt;Optional&lt;/li&gt;
  4316. &lt;li&gt;Free of up-front workflow&lt;/li&gt;
  4317. &lt;li&gt;Egalitarian, or indifferent to formal organizational identities&lt;/li&gt;
  4318. &lt;li&gt;Accepting of many types of data&lt;/li&gt;
  4319. &lt;/ul&gt;
  4320. &lt;p&gt;Or as put more simply by &lt;a href=&quot;http://ross.typepad.com/&quot;&gt;Ross Mayfield of Socialtext&lt;/a&gt;: ”&lt;a href=&quot;http://many.corante.com/archives/2005/05/25/fear_greed_and_social_software.php&quot;&gt;Social Software adapts to its environment&lt;/a&gt;, instead of requiring its environment to adapt to software”&lt;/p&gt;
  4321. &lt;p&gt;What this means is social software is not a one-size fits all type of software. It does not try to rigidly fit a company and its processes into the preconceived notions of the software’s creators.&lt;/p&gt;
  4322. &lt;p&gt;Corporations for years have tried to install industrial-strength collaboration tools &lt;a href=&quot;http://news.zdnet.com/2100-3513_22-6087566.html&quot;&gt;but employees don’t use them&lt;/a&gt;. This is the natural result of software attempting to impose processes. People don’t like to change behavior to fit software.&lt;/p&gt;
  4323. &lt;p&gt;Better are collaboration tools that allow emergence. ”&lt;a href=&quot;http://blog.hbs.edu/faculty/amcafee/index.php/faculty_amcafee_v3/enterprise_20_version_20/&quot;&gt;Emergent means that the software is freeform&lt;/a&gt;, and that it contains mechanisms to let the patterns and structure inherent in people’s interactions become visible over time.” Or in other words, emergent software merely discovers the way employees think and act in particular environment. Only then are business processed defined. The practice defines the process.(find link) This means employees are much more likely to actually use the tools IT rolls out as they can use the tools in a way that feels natural.&lt;/p&gt;
  4324. &lt;p&gt;A college in California applied the principle of emergence to the construction of new sidewalks between buildings. Instead of building the sidewalks right away, they let students walk on the new grass for a semester. At the end of the semester, it was evident by the tramped grass where most students wanted to walk. So the sidewalks were built where the grass was tramped.&lt;/p&gt;
  4325. &lt;p&gt;Software based collaboration tools let people collaborate anywhere and at anytime. Collaboration on ideas isn’t restricted to one meeting room or one office. People can collaborate between meetings, after hours, or anytime an idea occurs to them.&lt;/p&gt;
  4326. &lt;p&gt;Software collaboration tools make finding help easier. When searching for an answer, it is better to ask as many people as possible because you don’t know in advance who has the answer, a technique called ”&lt;a href=&quot;http://hbswk.hbs.edu/item/5544.html&quot;&gt;broadcast search&lt;/a&gt;”. Collaboration tools such as wikis or blogs let you ask everyone in the organization. &lt;a href=&quot;http://blog.hbs.edu/faculty/amcafee/index.php/faculty_amcafee_v3/comments/tear_down_these_walls/&quot;&gt;The British Parliament in the 18th century offered the equivalent of about $12 million&lt;/a&gt; to anyone who could devise a method to ‘find longitude.’ “The prize was eventually won, not by a famed astronomer or scientist of the day, but by the self-taught Yorkshire clockmaker John Harrison.” Another example, &lt;a href=&quot;http://www.socialtext.com/node/113&quot;&gt;a sales manager at the commercial wiki company Socialtext&lt;/a&gt; was asked by a prospective customer for a comparison between forums and wikis. Not knowing much about the topic, he created a wiki page on the companies wiki and broadcast throughout the company that he needed help. “Within four hours, five team members, including engineers, had contributed to the wiki page with numerous revisions. I had basically a final version that I simply exported as a Word doc, tweaked with final formatting, and emailed to the customer.” He reflects that he could of asked one or two people in marketing for help but the result wouldn’t of been nearly as good as the result from the wiki.&lt;/p&gt;
  4327. &lt;p&gt;Software collaboration software creates a “group memory”. All content created with collaboration tools is achieved and easily searchable. No more will valuable ideas and plans be lost in an email inbox or the Intranet. This creates a quick ramp-up time for new employees and provides a convenient record of all past projects discussions.&lt;/p&gt;
  4328. &lt;p&gt;Results from early adapters of “Enterprise 2.0” tools are starting to return. Business Week reported in November of 2005 that “research firm Garner Group predicts that wikis will become mainstream collaboration tools in at least 50% of companies by 2009…At DrKW, [CIO JP] Rangaswami says that among the earliest and most aggressive adopters, e-mail volume on related projects is down 75%; meeting times have been whacked in half.”&lt;/p&gt;
  4329. &lt;p&gt;&lt;a href=&quot;http://www.socialtext.com/customers/case-studies/drkw&quot;&gt;In an extensive case study written about wiki adoption at DrKW&lt;/a&gt;, reporting on meetings they wrote, “The teleconference used to be one and a half hours long [before the wiki], with much time wasted on bringing people up to speed on the week’s events. Now team members update themselves on the wiki, and that part of the teleconference takes five to ten minutes.”&lt;/p&gt;
  4330. &lt;p&gt;Employees of DrKW also find the wiki useful to plan presentations. They report that now with a wiki, “one person co-ordinated [planning the presentation], setting up an agenda page and individual pages for each of the main slides so that everyone - asynchronously, in their own time and in parallel - could write the presentation. Within about three of four hours, a presentation evolved that would have taken days and been a much more frustrating process had it been through email and PowerPoint attachments.”&lt;/p&gt;
  4331. &lt;p&gt;&lt;a href=&quot;http://billives.typepad.com/portals_and_km/2006/06/making_wikis_wo.html&quot;&gt;Employees at Novell also find that wikis ease collaboration&lt;/a&gt;. When someone finds an article on a discussion within the company, they link the article as a comment to a wiki page on the topic. This is accessible to enterprise search and those who are “tracking” this page are notified immediately of the addition to the wiki page. When someone finds the page, they have all the context available to understand the complete discussion. Novell finds wikis reduce redundancy in research and dialog and makes collaboration much more efficient.&lt;/p&gt;
  4332. &lt;p&gt;Both DrKW and Novell and many others find that the tools of “Enterprise 2.0” make collaboration more flexible and efficient. Below is a closer look at the software that makes up “Enterprise 2.0”:&lt;/p&gt;
  4333. &lt;h4 id=&quot;internal-blogs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#internal-blogs&quot; aria-label=&quot;internal blogs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Internal Blogs&lt;/h4&gt;
  4334. &lt;p&gt;Most now are familiar with blogs. These easy-to-use communication device are widely used on the Internet by from everyone from politicians, to family groups, to newspapers. As of 14 March 2007, Technorati, an online blog search engine, &lt;a href=&quot;http://technorati.com/about/&quot;&gt;is tracking 71.2 million blogs&lt;/a&gt;. Blogs as a collaboration tool are widely used on the Internet but are also starting to gain traction as a tool for internal communication within organizations.&lt;/p&gt;
  4335. &lt;p&gt;&lt;a href=&quot;http://www.globalprblogweek.com/2005/09/19/dutto-internal-blogs/&quot;&gt;Matías Dutto, a management consultant specializing in social technologies&lt;/a&gt;, wrote the following reasons for supporting internal blogging:&lt;/p&gt;
  4336. &lt;ul&gt;
  4337. &lt;li&gt;It improves participation spirit, collaboration, and the capabilities of team learning. It is ideal to run projects and to work with heterogeneous teams. It is also useful to promote dialogue and find lateral ideas outside the team.&lt;/li&gt;
  4338. &lt;li&gt;It allows integrating conversations with a shared vision. It is an excellent means for the leaders to communicate.&lt;/li&gt;
  4339. &lt;li&gt;It is the space where interpretations and different points of view come up so that the any member of the organization can discuss and debate them.&lt;/li&gt;
  4340. &lt;li&gt;It is an excellent means for the employees to achieve an integrated vision of the company by joining in conversations.&lt;/li&gt;
  4341. &lt;li&gt;It implies an open communication platform that allows new ways relating and coordinating actions among the organizational members and between the latter and the network of external relationships.&lt;/li&gt;
  4342. &lt;li&gt;It becomes the written memory of the organization. Furthermore, writing conveys emotional stability which eventually promotes the process of organizational development.&lt;/li&gt;
  4343. &lt;li&gt;They speed up the transference and transformation of knowledge to make ideas flow easily and take learning into action.&lt;/li&gt;
  4344. &lt;/ul&gt;
  4345. &lt;p&gt;Enterprise quality blogging software includes:&lt;/p&gt;
  4346. &lt;ul&gt;
  4347. &lt;li&gt;&lt;a href=&quot;http://www.drupal.org&quot;&gt;Drupal&lt;/a&gt; (open source)&lt;/li&gt;
  4348. &lt;li&gt;&lt;a href=&quot;http://www.userland.com/&quot;&gt;Manila&lt;/a&gt; (paid)&lt;/li&gt;
  4349. &lt;li&gt;&lt;a href=&quot;http://www.21publish.com/&quot;&gt;21Publish&lt;/a&gt; (paid)&lt;/li&gt;
  4350. &lt;li&gt;&lt;a href=&quot;http://www.typepad.com/&quot;&gt;Typepad&lt;/a&gt; (paid)&lt;/li&gt;
  4351. &lt;li&gt;&lt;a href=&quot;http://www.sixapart.com/movabletype/&quot;&gt;Moveable Type&lt;/a&gt; (paid)&lt;/li&gt;
  4352. &lt;li&gt;&lt;a href=&quot;http://www.knownow.com/&quot;&gt;KnowHow&lt;/a&gt; (paid/open source) — enterprise version of WordPress&lt;/li&gt;
  4353. &lt;/ul&gt;
  4354. &lt;h4 id=&quot;wikis&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wikis&quot; aria-label=&quot;wikis permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wikis&lt;/h4&gt;
  4355. &lt;p&gt;The most famous example of the wiki is Wikipedia. &lt;a href=&quot;http://en.wikipedia.org/wiki/Wiki&quot;&gt;Wikipedia defines a wiki as&lt;/a&gt; “a website that allows the visitors themselves to easily add, remove, and otherwise edit and change available content, typically without the need for registration. This ease of interaction and operation makes a wiki an effective tool for mass collaborative authoring.”&lt;/p&gt;
  4356. &lt;p&gt;Enterprise quality wiki software includes:&lt;/p&gt;
  4357. &lt;ul&gt;
  4358. &lt;li&gt;&lt;a href=&quot;http://www.socialtext.com/&quot;&gt;SocialText&lt;/a&gt; (paid/open source)&lt;/li&gt;
  4359. &lt;li&gt;&lt;a href=&quot;http://www.twiki.org&quot;&gt;Twiki&lt;/a&gt; (open source)&lt;/li&gt;
  4360. &lt;li&gt;&lt;a href=&quot;http://www.atlassian.com/software/confluence/&quot;&gt;Confluence&lt;/a&gt; (paid)&lt;/li&gt;
  4361. &lt;li&gt;Also, &lt;a href=&quot;http://www.wikimatrix.org/&quot;&gt;WikiMatrix&lt;/a&gt; provides a tool for comparing between 100s of other wiki engines.&lt;/li&gt;
  4362. &lt;/ul&gt;
  4363. &lt;h4 id=&quot;customer-relationship-management-crm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#customer-relationship-management-crm&quot; aria-label=&quot;customer relationship management crm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Customer Relationship Management (CRM)&lt;/h4&gt;
  4364. &lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Customer_Relationship_Management&quot;&gt;Wikipedia defines CRMs as follows&lt;/a&gt;:&lt;/p&gt;
  4365. &lt;blockquote&gt;
  4366. &lt;p&gt;Customer relationship management software is defined as business management and automation of the front-office divisions of an organization. CRM software is essentially meant to address the needs of Marketing, Sales &amp;#x26; Distribution and Customer Service and Support divisions within an organization and allow the three to share data on prospects, customers, partners, competitors and employees.&lt;/p&gt;
  4367. &lt;/blockquote&gt;
  4368. &lt;p&gt;Enterprise quality CRM software includes:&lt;/p&gt;
  4369. &lt;ul&gt;
  4370. &lt;li&gt;&lt;a href=&quot;http://www.sugarcrm.com/crm/&quot;&gt;SugarCRM&lt;/a&gt;(paid and open source)&lt;/li&gt;
  4371. &lt;li&gt;&lt;a href=&quot;http://www.vtiger.com/&quot;&gt;vTiger&lt;/a&gt; (paid and open source)&lt;/li&gt;
  4372. &lt;li&gt;&lt;a href=&quot;http://www.salesforce.com/&quot;&gt;Salesforce&lt;/a&gt; (paid)&lt;/li&gt;
  4373. &lt;/ul&gt;
  4374. &lt;h4 id=&quot;lightweight-project-management&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lightweight-project-management&quot; aria-label=&quot;lightweight project management permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lightweight Project Management:&lt;/h4&gt;
  4375. &lt;p&gt;A rebellion against all 1000lb project management software. Most software of this class are web based, inexpensive, and integrates well with existing tools.&lt;/p&gt;
  4376. &lt;p&gt;Enterprise quality lightweight project management software include:&lt;/p&gt;
  4377. &lt;ul&gt;
  4378. &lt;li&gt;&lt;a href=&quot;http://www.basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt; (paid)&lt;/li&gt;
  4379. &lt;li&gt;&lt;a href=&quot;http://www.activecollab.com/&quot;&gt;activeCollab&lt;/a&gt; (open source)&lt;/li&gt;
  4380. &lt;li&gt;&lt;a href=&quot;http://www.centraldesktop.com/&quot;&gt;Central Desktop&lt;/a&gt; (paid)&lt;/li&gt;
  4381. &lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Writing and The Power of Stories]]></title><description><![CDATA[I’ve been thinking lately about stories. The stories we tell others, the stories we tell ourselves, and the stories we find in books and on…]]></description><link>https://bricolage.io/writing-and-the-power-of-stories/</link><guid isPermaLink="false">https://bricolage.io/writing-and-the-power-of-stories/</guid><pubDate>Sat, 24 Feb 2007 22:47:21 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been thinking lately about stories. The stories we tell others, the stories we tell ourselves, and the stories we find in books and on TV. There is a great power in stories. Stories change how we think and view the world. Marketers know this — every advertisement is a story. A particularly famous example of this is &lt;a href=&quot;http://en.wikipedia.org/wiki/Jared_Fogle&quot; title=&quot;Jared the Subway Guy&quot;&gt;Jared the Subway guy&lt;/a&gt;. His story of how he lost weight from eating subways powerfully sells the idea that Subway’s food is healthy.&lt;/p&gt;
  4382. &lt;p&gt;Earlier I was looking at the website for the &lt;a href=&quot;http://www.python.org/&quot; title=&quot;Python&quot;&gt;Python programming language&lt;/a&gt;. One might think a website devoted to a programming language, a technical and geeky subject, wouldn’t have any stories. But no, programming languages have stories too apparently, there are some 33 ”&lt;a href=&quot;http://www.python.org/about/success&quot;&gt;success stories&lt;/a&gt;” written by users of Python.&lt;/p&gt;
  4383. &lt;p&gt;Oftentimes, while reading or listening, we only remember the stories the speech or book. Jesus Christ was a master at teaching with stories, or parables (a story with a moral) as they are called in the Bible. In his seminal book, ”&lt;a href=&quot;http://en.wikipedia.org/wiki/Jesus_the_Christ_(book_by_James_E._Talmage)&quot; title=&quot;Jesus the Christ -- from Wikipedia&quot;&gt;Jesus the Christ&lt;/a&gt;“, &lt;a href=&quot;http://en.wikipedia.org/wiki/James_E._Talmage&quot; title=&quot;James Talmage&quot;&gt;James Talmage&lt;/a&gt; wrote:&lt;/p&gt;
  4384. &lt;blockquote&gt;
  4385. &lt;p&gt;[A] simple story will live, even in minds which for the time being are incapable of comprehending any meaning beyond that of the commonplace story itself. Many a peasant who heard the little incident of the sower and the four kinds of soil, of the tares sown by an enemy at night, of the seed that grew through the planter had temporarily forgotten it, would be reminded by the recurring circumstances of his daily work… and then, when time and experience, including suffering perhaps, had prepared them for deeper thought, they would find the living kernel of gospel truth within the husk of the simple tale.&lt;/p&gt;
  4386. &lt;/blockquote&gt;
  4387. &lt;p&gt;As social animals, we love to tell stories. We turn every event in our life into a story. A friend meeting another friend, the first word of of their mouths is, “I’ve got to tell you what happened last night”. We have this strong impulse inside us to turn our lives into a story.&lt;/p&gt;
  4388. &lt;p&gt;This blog post started to form when I was thinking about journal writing. I was trying to understand what compels me to write in my journal and why is the experience of writing so powerful. While thinking, I had the insight that it’s because of stories.&lt;/p&gt;
  4389. &lt;p&gt;When I write in my journal I find my story and myself. I weave the threads of my life, past, present, and future, into a coherent story. I create a plot line, a protagonist (me hopefully), antagonists, and an destiny. I decide why what happened, happened, I decide what needs to happen and if my story is in need of a plot or character shift.&lt;/p&gt;
  4390. &lt;p&gt;“Know yourself”, the Philosopher shouts. I write to know myself. I write as a historian, to know my past. I write as a journalist, to know my present. And I must write as a prophet, write my most powerful stories, to know my future.&lt;/p&gt;
  4391. &lt;p&gt;What if my life doesn’t have a story? Then my life is meaningless, without root or branch. I am not stable but pushed about by every fad or fashion. So in short, writing a journal helps me discover my story. And knowing my story gives me purpose and direction.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Take Risks to Open Options]]></title><description><![CDATA[I was reading a blog post earlier by Ross Mayfield. He was asked what were his best decision and worst mistake as an entrepreneur. All his…]]></description><link>https://bricolage.io/take-risks-open-options/</link><guid isPermaLink="false">https://bricolage.io/take-risks-open-options/</guid><pubDate>Thu, 15 Feb 2007 06:20:32 GMT</pubDate><content:encoded>&lt;p&gt;I was reading a &lt;a href=&quot;http://ross.typepad.com/blog/2007/02/entrepreneur_hi.html&quot;&gt;blog post&lt;/a&gt; earlier by &lt;a href=&quot;http://ross.typepad.com/blog/&quot;&gt;Ross Mayfield.&lt;/a&gt; He was asked what were his &lt;a href=&quot;http://ross.typepad.com/blog/2007/02/entrepreneur_hi.html&quot;&gt;best decision and worst mistake as an entrepreneur.&lt;/a&gt;&lt;/p&gt;
  4392. &lt;p&gt;All his answers were good but I was especially struck by what he calls his biggest mistake:&lt;/p&gt;
  4393. &lt;blockquote&gt;
  4394. &lt;p&gt;&lt;strong&gt;Biggest Mistake — Not taking bigger risks earlier&lt;/strong&gt;&lt;/p&gt;
  4395. &lt;p&gt;Maybe because in hindsight all risks are clear, but I always find myself regretting not taking bigger risks earlier. For example, open sourcing the Socialtext code was something we waited on until the company had strong footing. Partially because we thought there would be cannibalization, partially because we were understaffed to really engage with the community. But I believe if we bought this bullet earlier in the history of the company we would be reaping better rewards. As a planning exercise, now I always try to ask two questions: “How could we take more risk?” and “What risk can we take that creates the greatest amount of options?” I find there is always a way to do a little more, in particular by getting past instinct to control prevalent in so many entrepreneurs.&lt;/p&gt;
  4396. &lt;/blockquote&gt;
  4397. &lt;p&gt;I was so struck because I’m in the middle of taking a big risk.&lt;/p&gt;
  4398. &lt;p&gt;I am passionate about web development. I want to build web applications that enable people to connect, collaborate, and get more done in their lives. But at my current and soon to be past job, I’m not learning how to build these beautiful web applications.&lt;/p&gt;
  4399. &lt;p&gt;So I decided to quit and employee myself. I decided that as no one is going to pay me to learn how to do web development, I’ll just have to pay myself.&lt;/p&gt;
  4400. &lt;p&gt;And now my mom, older sister, and I are going into business together. In a few months, we’ll unveil &lt;a href=&quot;http://www.los-detalles.com&quot;&gt;Los-Detalles.com&lt;/a&gt;, the newest and greatest baby card announcement e-retailer. And in the months leading up the our launch, I will be learning web development.&lt;/p&gt;
  4401. &lt;p&gt;&lt;a href=&quot;http://www.en.wikipedia.org/wiki/Ross_Mayfield&quot;&gt;Ross Mayfield&lt;/a&gt; learned it was a mistake to not take risks but that taking (calculated) risks opens up options where caution and control can never go. I’m trying to learn this same lesson. By taking this risk, the options &lt;em&gt;I&lt;/em&gt; want to have will open to me.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A Good Test]]></title><description><![CDATA[I recently finished up a semester at BYU. The end of another semester
  4402. brings with it that joyful tradition, finals. Going through six finals…]]></description><link>https://bricolage.io/a-good-test/</link><guid isPermaLink="false">https://bricolage.io/a-good-test/</guid><pubDate>Sun, 31 Dec 2006 06:37:26 GMT</pubDate><content:encoded>&lt;p&gt;I recently finished up a semester at &lt;a href=&quot;http://www.byu.edu&quot; title=&quot;BYU&quot;&gt;BYU&lt;/a&gt;. The end of another semester
  4403. brings with it that joyful tradition, finals. Going through six finals gave me
  4404. cause to think quite a bit about tests; what are they for and why are they
  4405. useful?&lt;/p&gt;
  4406. &lt;p&gt;I came up with three ways to measure the quality of a test:&lt;/p&gt;
  4407. &lt;ol&gt;
  4408. &lt;li&gt;Does it measure something valuable?&lt;/li&gt;
  4409. &lt;li&gt;Is the test both reliable and valid?&lt;/li&gt;
  4410. &lt;li&gt;Does it provide the correct incentives?&lt;/li&gt;
  4411. &lt;/ol&gt;
  4412. &lt;p&gt;&lt;strong&gt;Does it measure something valuable?&lt;/strong&gt;  This depends on the context of the
  4413. test — a juggling test is valuable for a circus school, a gum chewing test is
  4414. valuable to aspiring gum gurus, etc. The important questions is, does the test
  4415. measure one’s understanding of or skill in the valuable part(s) of a subject
  4416. matter.&lt;/p&gt;
  4417. &lt;p&gt;&lt;strong&gt;Is the test both reliable and valid?&lt;/strong&gt;  Reliable means the test is
  4418. consistently administered and graded for all test takers. Valid means the test
  4419. measures what it intends to. A juggling test which asks a student to hold two
  4420. balls but not throw them would be a reliable test — all test takers could be
  4421. measured easily the same — but wouldn’t be valid as being able to hold two
  4422. balls doesn’t show that one can in fact juggle balls. A professor can prepare
  4423. a test that measures all students fairly but wouldn’t test the students on
  4424. anything valuable (as defined above).&lt;/p&gt;
  4425. &lt;p&gt;&lt;strong&gt;Does it provide the correct incentives?&lt;/strong&gt;  I haven’t worked this measure out
  4426. satisfactorily in my mind yet but it’s something like the following. People’s
  4427. behavior is shaped by incentives. Because tests are a major part of a class
  4428. grade and most students care about grades, tests motivate students to study
  4429. more then they would without the incentive. So far this is fine and dandy.
  4430. I for one appreciate tests for this very reason as I know I’ve studied more,
  4431. and learned more, over the years because of tests.&lt;/p&gt;
  4432. &lt;p&gt;&lt;strong&gt;So why can this go wrong?&lt;/strong&gt;  Students go to school to learn, presumably.
  4433. There is of course the old yarn that education is the only thing that Americans
  4434. pay for and hope to be cheated. Many students it seems care more about the
  4435. grade then for learning. Because learning is hard, there is a strong incentive
  4436. for students to try to ‘game’ the test. Some types of tests can be passed by
  4437. cramming the night before the tests. Tests that only require you to memorize
  4438. material don’t promote true learning. So this poorer sort of test would provide
  4439. the wrong incentive to students in that it pushes them toward the poorer sort
  4440. of learning. A good test would push students toward the richer, and harder,
  4441. sort of learning.&lt;/p&gt;
  4442. &lt;p&gt;Now what types of tests provide the correct or wrong incentives I’m not quite
  4443. sure. As I said, I haven’t completely worked this measure out. I’m not even
  4444. sure if it is a correct measure. If at some point I can work up more interest
  4445. in this topic to clarify my thinking, I’ll write another post. Or someone else
  4446. can save me the work and write it themselves (or link to a page in the comments
  4447. section).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ubuntu 6.10—Edgy Eft—thoughts on upgrading from Dapper]]></title><description><![CDATA[Updated my dapper installation on my laptop to Edgy a while ago. It went well. I jotted down my impressions and installation steps: faster…]]></description><link>https://bricolage.io/ubuntu-610-edgy-eft-thoughts-upgrading-dapper/</link><guid isPermaLink="false">https://bricolage.io/ubuntu-610-edgy-eft-thoughts-upgrading-dapper/</guid><pubDate>Sat, 11 Nov 2006 03:42:01 GMT</pubDate><content:encoded>&lt;p&gt;Updated my dapper installation on my laptop to Edgy a while ago. It went well. I jotted down my impressions and installation steps:&lt;/p&gt;
  4448. &lt;ul&gt;
  4449. &lt;li&gt;faster boot - 56 seconds from shutting down computer restart and logging in—probably 5-10 secs faster then with Dapper.&lt;/li&gt;
  4450. &lt;li&gt;added tomboy notes / sticky notes / system monitor - adjusted to have CPU/memory/network / battery monitor / force quit /&lt;/li&gt;
  4451. &lt;li&gt;wow, only 109 MB of ram used upon boot up. Huge difference — Dapper was always around 150 MB upon boot up&lt;/li&gt;
  4452. &lt;/ul&gt;
  4453. &lt;h2 id=&quot;programs-installed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#programs-installed&quot; aria-label=&quot;programs installed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Programs Installed&lt;/h2&gt;
  4454. &lt;ul&gt;
  4455. &lt;li&gt;Adobe Acrobat 7.0&lt;/li&gt;
  4456. &lt;li&gt;Agave - color scheme creator&lt;/li&gt;
  4457. &lt;li&gt;Alien - converts RPMs to DEBs&lt;/li&gt;
  4458. &lt;li&gt;Amarok - best music player for Linux&lt;/li&gt;
  4459. &lt;li&gt;Beagle - desktop search&lt;/li&gt;
  4460. &lt;li&gt;Ethereal - now called wireshark — network sniffer&lt;/li&gt;
  4461. &lt;li&gt;Inkscape - vector drawing program&lt;/li&gt;
  4462. &lt;li&gt;Java SDK 5&lt;/li&gt;
  4463. &lt;li&gt;K3B - best Linux CD burning software&lt;/li&gt;
  4464. &lt;li&gt;LyX - WYSIWYM (What You See Is What You Mean) editor. GUI for LATEX&lt;/li&gt;
  4465. &lt;li&gt;Scribus - excellent DTP (desktop publisher for Linux)&lt;/li&gt;
  4466. &lt;li&gt;VLC - Plays anything you throw at it.&lt;/li&gt;
  4467. &lt;li&gt;Webilder - downloads backgrounds from flickr and rotates them&lt;/li&gt;
  4468. &lt;li&gt;Wine - (Wine Is Not an Emulator)&lt;/li&gt;
  4469. &lt;li&gt;GFTP&lt;/li&gt;
  4470. &lt;li&gt;Bluefish&lt;/li&gt;
  4471. &lt;/ul&gt;
  4472. &lt;p&gt;Firefox 2.0 is very cool - tab restore, search suggest/memory for google, individual tab delete. Seems to have eliminated memory leak — used to be that after a few hours of using firefox memory usage would be over 250 MBs now (depending on how many tabs are open) is much less ~ 100 MBs&lt;/p&gt;
  4473. &lt;p&gt;So I like it. As some have commented &lt;a href=&quot;http://www.linux.com/article.pl?sid=06/10/26/1552208&quot;&gt;Edgy isn’t so edgy&lt;/a&gt; (Also a comment about the &lt;a href=&quot;http://www.netsplit.com/blog/articles/2006/10/27/not-that-edgy&quot;&gt;lack of ‘edginess’ from an Ubuntu developer&lt;/a&gt;). It seems the changes from Hoary to Dapper were more dramatic. Changes were mostly subtle, tweaks here and there, improvements to programs etc. Linux and Ubuntu are at a stage of maturity that dramatic improvement are hard to pull off. A math analogy, if you add 1 to 1 that is a 100% improvement. If you add 1 to 2 that is a 50% improvement. If you continue that on upward, adding 1 to 100 is only a 1% improvement. Linux is still making good progress just it is not as obvious now due to the substantial work already completed.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The fall of the civilization of Rome—and the fragility of our own]]></title><description><![CDATA[Tyler Cowen over at Marginal Revolution pointed me recently to a fascinating and very well-written book entitled ”The Fall of Rome and the…]]></description><link>https://bricolage.io/the-fall-civilization-rome-and-fragility-our-own/</link><guid isPermaLink="false">https://bricolage.io/the-fall-civilization-rome-and-fragility-our-own/</guid><pubDate>Fri, 01 Sep 2006 15:52:04 GMT</pubDate><content:encoded>&lt;p&gt;Tyler Cowen over at &lt;a href=&quot;http://www.marginalrevolution.com/marginalrevolution/2006/08/the_dark_ages_w.html&quot;&gt;Marginal Revolution&lt;/a&gt; pointed me recently to a fascinating and very well-written book entitled ”&lt;a href=&quot;http://www.amazon.com/Fall-Rome-End-Civilization/dp/0192807285/sr=8-1/qid=1157041617/ref=sr_1_1/102-2703149-8576135?ie=UTF8&quot;&gt;The Fall of Rome and the End of Civilization&lt;/a&gt;” . I don’t intend to review the book per se (but here are two good reviews, &lt;a href=&quot;http://www.chicagoboyz.net/archives/004376.html&quot;&gt;1&lt;/a&gt; and &lt;a href=&quot;http://www.telegraph.co.uk/arts/main.jhtml?xml=/arts/2005/06/19/bohea19.xml&amp;#x26;sSheet=/arts/2005/06/19/botop.html&quot;&gt;2&lt;/a&gt;) but instead comment on some interesting points the author made.&lt;/p&gt;
  4474. &lt;p&gt;First was the level of economic sophistication the Romans reached. Archaeologists evacuating Roman-era sites are consistently overwhelmed by the vast quantity and quality of the pottery they find. Not only is the quantity impressive but there is strong evidence for the existence of large ‘industrial’ producers of pottery that dominating the trade. Pottery from one large producer of tableware in southern France active around 100 A.D. has been found throughout the western Roman empire, past the Hadrian wall into Scotland, and as far east as present-day Moscow.&lt;/p&gt;
  4475. &lt;p&gt;On another site on the left bank of the Tiber in Rome, there stands a hill some 150 feet high. It is made up entirely of broken oil amphorae from southern Spain. It is estimated that the hill has the remains of some 53 million amphorae, in which around six billion liters (1.56 billion gallons or around 2500 Olympic-sized swimming pools) of oil were transported. Obviously, the Romans could move impressive quantities over long distances!&lt;/p&gt;
  4476. &lt;p&gt;With the beginning of the barbarian invasions, the economic complexity ended. The confusion broke continent-wide trade routes and millions were thrust into the dark ages. The author contrasts the remains of two sites, one a tiny farmstead on a difficult upland spot in Italy occupied from 200 BC to 100 A.D., and the other a sixth and seventh-century rural palace of the Anglo-Saxon kings of Northumbria. On the Roman farmstead, evacuation produced an impressive range of pottery vessels: huge storage jars, kitchen wares, some locally produced others imported from the West coast of Italy, amphorae from the same area, and finally, glossy tablewares imported from another pottery in Italy near Naples. Contrast this with the pottery found in post-Roman England as the author, Ward-Perkins describes it, “The vessels were hand-shaped, out of poorly processed clay, and were only lightly fired (so they are very friable).”&lt;/p&gt;
  4477. &lt;p&gt;It’s shocking in a way to see how fragile economies are. Within the span of the lifetime of a Roman born around 400 A.D. much of the prosperity, peace, and security they enjoyed at birth was lost and stayed at pre-Roman levels for nearly 1000 years. Skills as mundane as creating fine pottery or stone buildings were lost in Britain for hundreds of years. The majority of people alive have never seen a real dip in prosperity. In American since the end of WW2, we have seen extremely steady upward growth, the most incredible period of economic growth in history. Virtually everyone alive is richer materially then there parents were and whose parents were richer then there parents were and expects there children to become even richer still.&lt;/p&gt;
  4478. &lt;p&gt;Though the US has the strongest, most diverse, most steady economy in the world, one wanders all the same if it could fall. It was by no means inevitable that we’ve reached this point. Nor is it a sure thing that we will continue to enjoy our present prosperity.&lt;/p&gt;
  4479. &lt;p&gt;I don’t know what the future will bring but I do know I enjoyed my book. It made me think.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Why I blog—Part 1]]></title><description><![CDATA[I’d been thinking about blogging for a long time but what finally pushed me over the edge was this post. The author, Scott McLemee, wrote…]]></description><link>https://bricolage.io/why-i-blog-part-1/</link><guid isPermaLink="false">https://bricolage.io/why-i-blog-part-1/</guid><pubDate>Sat, 12 Aug 2006 22:52:44 GMT</pubDate><content:encoded>&lt;p&gt;I’d been thinking about blogging for a long time but what finally pushed me over the edge was this &lt;a href=&quot;http://www.insidehighered.com/views/2005/11/22/mclemee&quot;&gt;post&lt;/a&gt;. The author, Scott McLemee, wrote about what he’s learned from a pamphlet by C. Wright Mill “On Intellectual Craftsmanship”. Here’s the key quote,&lt;/p&gt;
  4480. &lt;blockquote&gt;
  4481. &lt;p&gt;What Mills calls “intellectual craftsmanship” involves more than the ability to produce work that can pass peer review. “Scholarship is a choice of how to live,” he writes, “as well as a choice of career.” It is (if I may be excused for borrowing another &lt;a href=&quot;http://www.hnn.us/blogs/entries/18349.html&quot;&gt;old Greek word&lt;/a&gt;) an &lt;em&gt;ethos.&lt;/em&gt; That is, a structure of habits that sustains and embodies a quality of mind, a tendency of character.&lt;/p&gt;
  4482. &lt;p&gt;“Whether he knows it or not,” Mills goes on to say, “the intellectual workman forms his own self as he works towards the perfection of his craft.” The notion of having a “career” is subordinate to—even a side-effect of—this process of inner shaping. “To realize his own potentialities, and any opportunities that come his way,” the scholar “constructs a character which has its core the qualities of the good workman.”&lt;/p&gt;
  4483. &lt;p&gt;For Mills, there is a kind of bench where all of this crafting takes place. He calls it “the file.” I’m not sure this is the happiest of expressions. It’s simple enough, but Mills uses it in his own sense.”&lt;/p&gt;
  4484. &lt;/blockquote&gt;
  4485. &lt;p&gt;Mills suggests that aspiring young intellectuals keep what he calls, “the file,” or the term I like, “intellectual journal.” Here are collected reading notes, stray ideas, and complications or successes in research. It serves as a journal as you analyze and sort through ideas. Mill writes that the process of collecting and sifting through your notes and ideas leads to more systematic thinking as well as more directed and thorough learning.&lt;/p&gt;
  4486. &lt;p&gt;Starting my junior and senior years of high school, I came to love writing. Not that it is entertaining or easy — it’s about the hardest thing to do intellectually — but for the powerful and beneficial effect it has on my thinking. I find that when I write about an idea I’ve had or a book I’ve read, the writing serves to clarify my thinking and make explicit my reasoning.&lt;/p&gt;
  4487. &lt;p&gt;My experience with the effects of writing fits with Mill’s main assertion, that the keeping of the file or intellectual journal is critical to the “[construction of] a character which has its core the qualities of the good workman.” My writing refined and shaped my intellectual charecter.&lt;/p&gt;
  4488. &lt;p&gt;A critical realization I’ve come to over the past several years is the importance of my habits. My life is directed more by what I choose to do every day then any so-called life changing decisions. I like to think of habits as bricks. A single brick is really quite insignificant but from thousands of bricks mortared together come sturdy houses and soaring cathedrals. And from habits we build, one brick at a time, our lives. My life, whether it will be useful and great or broken and poor, depends a great deal on my habits.&lt;/p&gt;
  4489. &lt;p&gt;The great disconnect in most people’s lives is between what they know they should do and what they actually do. Witness the vast number of people enslaved by addictions: alcohol, drugs, gambling, food, and so forth. What they lack is internal discipline or the character to live what they know is right. For whatever reason they have never built the character that allows their mind to rule their body. Instead, their bodies enslave their minds.&lt;/p&gt;
  4490. &lt;p&gt;So how does this bring us back to Mill’s file? For many years, there has been a disconnect between what I want to be intellectually, and what I actually do, my habits. I feel far too often I don’t think as I should. I don’t analysis, probe, collect, sift, sort, synthesize. In other words, as much as I want to, I don’t have the character of an intellectual workman.&lt;/p&gt;
  4491. &lt;p&gt;My hope is this blog will provide the motivation and discipline to write so as to help me develop the habits of the mind of an intellectual craftsman.&lt;/p&gt;
  4492. &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Other people seem to be thinking along the same lines: &lt;a href=&quot;http://savageminds.org/2006/08/14/c-wright-mills-on-blogging/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://www.aaronsw.com/weblog/about&quot;&gt;here&lt;/a&gt;. Also, &lt;a href=&quot;http://ddl.uwinnipeg.ca/res_des/files/readings/cwmills-intel_craft.pdf&quot;&gt;here&lt;/a&gt; is a link to a PDF of Mill’s orginal essay, “On Intellectual Craftsmanship”.&lt;a href=&quot;http://savageminds.org/2006/08/14/c-wright-mills-on-blogging/&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[First Post]]></title><description><![CDATA[A small confession on my part, I love reading blogs. I’ve been reading blogs for quite a while now, five years I’d suppose. It has been my…]]></description><link>https://bricolage.io/first-post/</link><guid isPermaLink="false">https://bricolage.io/first-post/</guid><pubDate>Sat, 22 Jul 2006 22:39:53 GMT</pubDate><content:encoded>&lt;p&gt;A small confession on my part, I love reading blogs. I’ve been reading blogs for quite a while now, five years I’d suppose. It has been my privilege during this time to read the discussions and thoughts of hundreds of different intelligent and opinionated blog authors from all around the earth. I’m in college now, this fall will be my Junior year. Everyday I listen to lecture and read from textbooks and most don’t hold a candle to my daily dose of blog news and analysis. The blog is the greatest conversational tool ever invented because seconds after I click publish for this post, it can be read across the world by thousands. Granted, this blog, along with most of the other &lt;a href=&quot;http://www.blogherald.com/2005/10/10/the-blog-herald-blog-count-october-2005/&quot;&gt;100 million&lt;/a&gt; blogs in existence, won’t be read much. But that’s all right. Conversation is fun, even it’s just with a few of your buds. I’m just happy to join the party.&lt;/p&gt;</content:encoded></item></channel></rss>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//bricolage.io/rss.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda