<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Daniel Cousineau on Medium]]></title>
        <description><![CDATA[Stories by Daniel Cousineau on Medium]]></description>
        <link>https://medium.com/@dcousineau?source=rss-33ae8345351f------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*z8cGh4lydchIIobIV09uRQ.jpeg</url>
            <title>Stories by Daniel Cousineau on Medium</title>
            <link>https://medium.com/@dcousineau?source=rss-33ae8345351f------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 05:35:47 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@dcousineau/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Advanced Redux Entity Normalization]]></title>
            <link>https://medium.com/@dcousineau/advanced-redux-entity-normalization-f5f1fe2aefc5?source=rss-33ae8345351f------2</link>
            <guid isPermaLink="false">https://medium.com/p/f5f1fe2aefc5</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[redux]]></category>
            <dc:creator><![CDATA[Daniel Cousineau]]></dc:creator>
            <pubDate>Thu, 16 Mar 2017 22:06:36 GMT</pubDate>
            <atom:updated>2017-03-16T22:06:36.208Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<p>One of the earliest problems a developer hits when dealing with Redux store organization is arrays of entities are difficult and inefficient to work with (both computationally and developer experience-wise). The <a href="http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html#designing-a-normalized-state">official Redux documentation</a> provides a very good primer on what the best way to normalize a store looks like. An astute reader will also note similarities in shape to other solutions like the <a href="https://github.com/paularmstrong/normalizr">normalizr</a> library.</p><p>While it may feel counter-intuitive to structure data like this, we must remember that <a href="http://stackoverflow.com/a/5525820/20265">Javascript doesn’t <em>actually</em> guarantee order of keys in an object</a>. In addition, insertions, replacements, and removals (especially in the context of maintaining immutability, which in Javascript requires cloning) is significantly more efficient with Objects than Arrays.</p><p>This is all fairly standard for initiated Redux users. Where the documentation doesn’t explore is the problems when 2 independent views of the same, de-duplicated entity must exist at the same time and independent meta-request information like fetching status, pagination status, must be tracked independently.</p><p>At <a href="https://grovo.com/">Grovo</a> we have been using an abstract structure we’ve taken to calling <strong>Key Windows</strong>.</p><p>The concept is fairly simple, and in a way if we’re thinking of normalization as SQL tables, we could think of this as a <a href="https://en.wikipedia.org/wiki/View_%28SQL%29"><em>‘view’</em></a>. For a given entity type there are multiple possible lenses to view the data: a paginated table, a type-ahead dropdown, a detail view, a special widget. We consider these lenses a <em>‘window’ </em>into the raw de-duplicated universe of entities.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7dd8075275bdf3a2421ef908226e72c5/href">https://medium.com/media/7dd8075275bdf3a2421ef908226e72c5/href</a></iframe><p>The actual structure is extremely simple and an extension of the official documentations suggestion, merely replacing the allIds with an arbitrary number of meta-information containers and a keyWindows top-level tracking all currently present windows.</p><p>Where the power comes in is the recognition that there is a very strong attachment between key windows (“what am I looking at”) and API requests. It makes sense to begin to attach all sorts of meta-information about requests and views of data inside the key window data structure like fetching status and pagination.</p><p>Starting with a trivial example: I’m viewing a paginated list of Users, but our UX calls for a little widget that shows a list of “managers” at the top. Because the managers potentially are not currently in the page, we cannot simply replace the byId portion of the store lest we accidentally wipe out our managers, and we cannot simply show all users in byId in the table lest we show incorrect information. Our store would then look something like the following:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ce458fa6bdde23ed38a16436b1a57bec/href">https://medium.com/media/ce458fa6bdde23ed38a16436b1a57bec/href</a></iframe><p>This structure gives us a number of benefits:</p><ul><li>We can track request/fetching status of the browse users table and the managers widget independently</li><li>We can track the pagination status of the browseUsers independently as well, potentially allowing a single view to have multiple paginated data sets</li><li>Maintenance of the byId key on the store is a simple concat of new entities on request complete</li><li>The ids array in each key window is a simple replace on request complete</li><li>The ids array continues to maintain any intrinsic ordering received from the API endpoints</li></ul><h4>Implementation Notes</h4><p>We have found that fully adopting this structure required a few changes to our actions/action creators, namely we now need the entity responsible for dispatching a given action also needs to explicitly declare a key window name. In the above example, fetchUsers({query}) might soon become fetchUsers({query}, &#39;browseUsers&#39;). However “explicitly declare” can also mean that something like fetchManagers() can always use &#39;allManagers&#39; internally. Simply put the <em>action payload</em> needs an explicit window name.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/896ba9e67f2b6660464ecd19a22c5dcd/href">https://medium.com/media/896ba9e67f2b6660464ecd19a22c5dcd/href</a></iframe><p>Because the keyWindow property on the action is both common and explicit even on the subsequent ‘receive’ action(s), it in effect tags an entire request lifecycle and simplifies our reducer allowing two supposedly distinct fetch initiation actions to share a common implementation.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4f812f5f5fd6018c62d89b8e0fc0ebc7/href">https://medium.com/media/4f812f5f5fd6018c62d89b8e0fc0ebc7/href</a></iframe><p>One addition item to note, this relies on your side effect system emitting the receiveEntities() action to namespace the entities behind their entity name (see lines 24 and 30) above, however you can always still do a simpler receieveUsers() action. I personally have just become a fan of a singular receive action for multiple fetch initiators.</p><h4>Further Improvements</h4><p>There are of course ways we can build on this concept:</p><ol><li>Tracking and handling errors can now use the the key windows to isolate and provide granular error reporting and recovery</li><li>Tracking the unique list of key window names seems like overkill, but allows for you to deterministically loop through all key windows and allow for garbage collection via a releaseKeyWindow() type action</li><li>Since key window names can be anything, they can be another entity’s ID to provide some semblance of foreign key type relationship for quicker lookups</li></ol><h4>A Word on Naming</h4><p>We internally called this concept “key windows” after a period of debate that was longer than I care to admit. We initially called them views (like SQL views) but found the word <em>view</em> is used quite often in frontend work (who knew) and caused lots of communication problems and unclear messages. My problem with <em>key windows</em> is it doesn’t fully explain what it is in the name itself, but I’m not sure if anything better exists. I’m open to suggestions!</p><p>Naming really is the worst problem in computer science…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f5f1fe2aefc5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tackling D3 and React]]></title>
            <link>https://medium.com/@dcousineau/tackling-d3-and-react-part-1-a11c3696931c?source=rss-33ae8345351f------2</link>
            <guid isPermaLink="false">https://medium.com/p/a11c3696931c</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[3d]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Daniel Cousineau]]></dc:creator>
            <pubDate>Fri, 14 Aug 2015 22:21:10 GMT</pubDate>
            <atom:updated>2017-03-15T21:13:14.142Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UELfjF4WgGy5TGJOd-aMhA.png" /></figure><p>Recently a project built entirely in React required the rendering of a fairly non-standard graph. Naturally D3 is my go-to, however unfortunately resources are sparse and one of the few good articles on the subject (<a href="https://medium.com/@sxywu/on-d3-react-and-a-little-bit-of-flux-88a226f328f3"><em>On D3, React, and a little bit of Flux</em> by Shirley Wu</a>) was a little feature-rich for my tastes, especially because I’m not particularly strong in D3 and my graph was NOT as complex as the visualizations Shirley was tackling.</p><p>With a bit of learning from her post, slamming my forehead against a wall for a day, and a particularly late flight to LAX, I hit an aha moment that helped with my approach.</p><p><strong>NOTE: this article assumes you’re fairly competent with React, but not necessarily super competent with D3.</strong></p><p>React was a solid re-shift in how I approached UIs. While I had already been pursuing a “application first, DOM as representation of application” approach to my web development, React was a feet first polar-bear dip to my previous ginger toe-dipping.</p><p>The problem is on the surface level D3 felt like the <em>old way</em> and here I am in React trying to do things the <em>new way</em> and not seeing the connection, until I realized something:</p><blockquote>D3 is not an SVG drawing lib*, D3 is a set of utils to generate data for SVGs</blockquote><p>I was approaching learning D3 like I approached Raphaël.js, when instead I realized I needed to treat it closer to a lodash. D3 gave me things like scale calculators and SVG path syntax generators, the actual SVG elements I can lay out myself (<em>hint</em>, React is pretty good at those).</p><p>React and D3 exist in 2 separate spheres: React handles the actual elements (how many lines need to be plotted), D3 handles the properties (what does the line actually look like).</p><p>Along these separations, <strong>we want React to handle the actual SVG elements.</strong></p><p>To start, lets begin with our chart:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d243b08da3c9e8280131d8603c505a77/href">https://medium.com/media/d243b08da3c9e8280131d8603c505a77/href</a></iframe><p>We build our component to accept a width and height and of course our input data. For now we’ll keep to a simple <em>array</em> of <em>objects</em> with the keys <em>x</em> and <em>y</em>. Finally, simply enough we drop an SVG tag.</p><p>An empty graph is pretty boring, so lets add a line. If you’re up on your basic SVG knowledge, a line is simply a <em>path</em> with a stroke:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ec8ef1e537c2932cc581b0e468643fb2/href">https://medium.com/media/ec8ef1e537c2932cc581b0e468643fb2/href</a></iframe><p>Which we can theoretically compose into our chart:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/719d970fedf423f718b16e13026f643c/href">https://medium.com/media/719d970fedf423f718b16e13026f643c/href</a></iframe><p>Now the problem is this line isn’t actually drawing anything yet, so lets go back and update our Line component to draw.</p><p>This is where D3 enters into the responsibilities picture. In order for the line to have shape, we need to set the <em>d</em> property of the <em>path</em> element. Luckily D3 provides a utility to generate this property: <em>d3.svg.line()</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4ec7ae5289e8bbc63587ec1bf35753db/href">https://medium.com/media/4ec7ae5289e8bbc63587ec1bf35753db/href</a></iframe><p>The full documentation is beyond the scope of this blog post, however the utility is fairly simple: <em>d3.svg.line()</em> generates a function which, when given an array of data, maps the data into an SVG path specification.</p><p>A critical aspect, however, is transforming the data according to the scale of the graph. Namely, I can’t just plot the raw data, I need to calculate a pixel positioning (do we have margins, etc). Above you’ll notice I’ve put in a placeholder function call for <em>scaleX </em>and<em> scaleY</em>. But how do we get this information?</p><p>Yet again, D3 provides a utility <em>d3.scale</em> which does something similar (produces a function where you can pass in a value and have it transformed into an x/y coordinate according to the scale configured). But there’s a problem: <strong>scale is inherently tied to the chart, <em>not </em>the line.</strong> So lets drop into the Chart and build out the scale:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/21ce4cde71fa6694b70f686194dc9f71/href">https://medium.com/media/21ce4cde71fa6694b70f686194dc9f71/href</a></iframe><p>This is fairly rote D3 ripped straight from newbie tutorials, make the scale perfectly fit the data set and perfectly fit the width and height of the SVG.</p><p>Now here is where you might be tempted to just pass in the X and Y scales as props into the Line, maybe like:</p><pre>&lt;Line data={this.props.data} xScale={this.getXScale()} yScale={this.getYScale()} /&gt;</pre><p>But this would get old <em>very</em> fast as you added more lines, etc.</p><p>Switching mental contexts (wait for it) back to React, we have this fun feature called… context! If you’ve used almost any Flux framework or react-router, you’re probably already familiar with context. You may not be familiar with the method <em>getChildContext()</em> which you can define on a component to inject next context into all of its children. Convenient!</p><p>So lets do exactly that, lets have the Chart define the X and Y scale as a <em>context</em> related specifically to this chart:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/62e275f35374c235d3d9fc7ea82d5d10/href">https://medium.com/media/62e275f35374c235d3d9fc7ea82d5d10/href</a></iframe><p><strong>NOTE: You MUST provide the <em>childContextTypes</em> otherwise React will yell at you very loudly!</strong></p><p>Now that we’ve made the X and Y scale available, lets update our line to simply use the context:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/63956483d6f8f09880dcc773717d6aa9/href">https://medium.com/media/63956483d6f8f09880dcc773717d6aa9/href</a></iframe><p>Congratulations, you’ve taken your first step to drawing a line on an SVG canvas!</p><p>With a tiny bit of syntactic sugar and sample data generation, you can now watch your simple chart at work:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fdcousineau%2Fembed%2FMwRRYr%3Fheight%3D600%26slug-hash%3DMwRRYr%26default-tab%3Dresult%26host%3Dhttp%253A%252F%252Fcodepen.io&amp;url=http%3A%2F%2Fcodepen.io%2Fdcousineau%2Fpen%2FMwRRYr&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F335421.MwRRYr.small.f62c2f34-741e-4d05-99cf-63926ad837c3.png&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/7f8b1fa35a5fb7c85e6f422f8c299bc1/href">https://medium.com/media/7f8b1fa35a5fb7c85e6f422f8c299bc1/href</a></iframe><p>While this is great, we need more complex charts than this. Or at least I did, particularly in plotting points on top of multiple lines (some linear, some interpolated).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a11c3696931c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Conference Is Over: Long Live The Conference]]></title>
            <link>https://medium.com/@dcousineau/the-conference-is-over-long-live-the-conference-3b051c94aa56?source=rss-33ae8345351f------2</link>
            <guid isPermaLink="false">https://medium.com/p/3b051c94aa56</guid>
            <dc:creator><![CDATA[Daniel Cousineau]]></dc:creator>
            <pubDate>Tue, 11 Nov 2014 16:54:52 GMT</pubDate>
            <atom:updated>2015-06-02T15:55:57.771Z</atom:updated>
            <content:encoded><![CDATA[<p>As a frequent tech conference attendee, speaker, and co-organizer if there’s one thing that is true it’s that the conference doesn’t end after 5pm. Afterparties and how you structure your post-conference activities can make or break the experience.</p><p>Recently an age-old cycle re-emerged in the PHP community. The classic tales of “beer as currency” and the problems that can sometimes arise was recently written about by <a href="http://www.pablogodel.com/2014/11/11/lets-stop-creating-alcoholics-in-php/">Pablo Godel</a>. And the one refrain I heard from the discussion that ensued on Twitter is that there is a lot of discussion about the <em>problem</em> but little advice on solutions.</p><h3>Jordi Boggiano on Twitter: &quot;@dcousineau @pgodel Pablo&#39;s post is a good call to action but it&#39;s lacking advice to organizers so if you complete that it&#39;d be good.&quot;</h3><p>Good reminder by @pgodel on drinking culture in PHP/tech http://www.pablogodel.com/2014/11/11/lets-stop-creating-alcoholics-in-php/ ... and why I&#39;m proud of how we structure @lonestarphp events</p><p>For those of you that aren’t familiar with me, <a href="https://untappd.com/user/dcousineau">I love beer</a>. <a href="https://untappd.com/user/enygmadae">So</a> <a href="https://untappd.com/user/jasrags">do</a> <a href="https://untappd.com/user/jakefolio">my</a> <a href="https://untappd.com/user/Omnicolor">co-organizers</a>. And I also love the tech community and <a href="https://twitter.com/dcousineau/status/530493461708152833">conferences</a>. So naturally I enjoy being able to link up with old and new friends and share beers and comraderie.</p><p>However there are those in the community that for a multitude of reasons don’t drink, and I really want to have fun with them too and as an organizer I want to be inclusive and inviting to them.</p><h3>Decisions Are Like Water</h3><p>The decisions we make as humans are like water: they <em>tend</em> to follow the path of least resistance. If the only social activity of your conference is an open bar in a big empty room with a sponsor slideshow in the corner, the <em>easiest</em> decision to make is to drink. And for most of us that’s not an issue, but for those of us that don’t drink it can feel exclusionary due to the <em>difficulty</em> of finding non-alcoholic alternatives, and it can be <strong>dangerous</strong> for the silent members of the community who struggle with alcohol.</p><p>At <a href="http://lonestarphp.com/">Lone Star PHP</a> we love both our beer and our friends and have made it an internal goal to try what we could to make our after parties and social events as inclusive non-drinkers and drinkers alike while keeping it <em>safe</em> for those who struggle. To do this we make having fun WITHOUT alcohol the <em>path of least resistance</em>.</p><ol><li><strong>Keep your social event on-site.</strong> While sometimes this is not possible due to venue restrictions, we keep our after party on-site and not in a bar. This helps out-of-towners feel less isolated as well since they don’t have to navigate an unfamiliar city and gives them the option to control their own schedule.</li><li><strong>Start the social immediately after the closing talk.</strong> “We’re going to give people time to drop their stuff off and give ourselves time to set up” was a great rationalization our first year of Lone Star at our current venue but it utterly destroyed our social event: the only attendees were the speakers and a handfull of locals. The rest? Left to go to bars, leaving the non-drinkers feeling isolated.</li><li><strong>Non-alcoholic drinks as a first class citizen.</strong> We actually prided ourselves on making sure that our open bar’s non-alcoholic options were top-tier and potentially more inviting than the alcoholic option. Jake, Chris, and I actually had a lot of fun selecting high-quality sodas and lemonades like <a href="http://reedsinc.com/product/virgils-root-beer/">Virgils</a>, <a href="http://en.wikipedia.org/wiki/Dublin_Dr_Pepper">Dublin Dr. Pepper</a>, <a href="http://en.wikipedia.org/wiki/Mexican_Coke">Mexican Coke</a>, and <a href="https://www.hubertslemonade.com/">Hubert’s Lemonade</a>. The bartenders were expressly told to use the crappy 2-liter bottles for cocktails, the <em>nice</em> stuff was on display and for non-drinkers only.</li><li><strong>Provide actual activities and games.</strong> We filled our main room with board games, an Xbox with a Kinect, and <a href="http://en.wikipedia.org/wiki/Cornhole">Cornhole</a> to provide <em>things to do</em>. The last thing we wanted was an empty ballroom whos only decoration are open-bar carts. What we wanted were as many <em>options</em> as possible so those who don’t drink can have fun with everyone else without feeling singled out or conspicuous.</li><li><strong>Keep the alcohol to the side/out of the activity spaces.</strong> This was, for us, dictated by the layout of our event space but it ended up working out really well. The bar carts were in the hallways outside of the main room so those playing boardgames and socialize could do so withotu the constant distraction of the bar carts. It was such a minor thing to make a quick trip to the hallway to grab a beer, but it helps those who struggle with alcohol to feel integrated without constant temptations.</li><li><strong>Provide food.</strong> You want to keep as many of your attendees at your afterparty for as long as possible. If there is no food they’re going to leave in groups to go eat, and usually that trip is to a local bar. While this is fine, again, the non-drinkers and out-of-towners aren’t inclined to leave and go to a strange bar. The more people that stay at the afterparty the more fun it is for everyone.</li><li><strong>Ensure the bar tenders are empowered and responsible enough to cut off excessive drinking</strong>. This is something that is hard to keep track of and is something we constantly struggle with. Some years there are 0 problems, and some years someone comes along and throws a wrench in everything. Sometimes the best you can do is just repeat it out-loud to yourself so you feel okay helping a friend by cutting them off.</li></ol><p>These aren’t hard-and-fast rules certainly. With the above #5 we actually had an exception in that we had Dean Brundage of <a href="http://www.newrepublicbrewing.com/">New Republic Brewing</a> move his tap station to the main room one year so he and his lovely wife could socialize with the rest of the party while serving his beer. It massively helped, however, that the person serving the beer was familiar with the tech community and could interact and socialize. Which was a mistake we made in a later year having one person manning the hombrew beer station who was unfamiliar with the community and caused some uncomfortable friction.</p><p>And sometimes you can’t follow #1 because of limitations with where your event is held and the costs of your event space. <a href="http://2014.empirejs.org/">EmpireJS</a> was held in New York City, an area famous for expensive venues, and had severe restrictions but still had an excellent after party in which they rented a boat for a cruise around the Statue of Liberty and the Brooklyn Bridge. An amazing experience for out-of-towners and fun whether you were drinking wine or grape juice.</p><h3>Conferences Can Still Have Their Beer And Drink It Too</h3><p>The goal is not to get rid of alcohol all together, or hide it away shamefully. The goal is to <strong>provide options</strong> and be active and responsible as organizers knowing the after-party is as important as the primary conference experience.</p><p>The homebrewers and beer aficionados among us (namely, the entire Lone Star PHP organizing team) can still sit around drink Omni’s creations and discuss our favorite beers, and the last thing we would want to do is get rid of that. But we also still want to hang out with our friends who just want a rootbeer and a round of Munchkin. Or a vodka-soda and Dance Revolution. Or a glass of wine and Cornhole.</p><p>And people will still have fun. And there will still be after-after-parties at a <a href="http://www.lionandcrownpub.com/">bar down the street</a>. Bottles of beer will be traded, homebrews will be tasted, and your attendees will be none the wiser to your plans and machinations.</p><h3>A Note On “Promoting” Drinking</h3><p>Before I close out, I want to spend a few sentences on the phrase “Promoting Drinking” in regards to conferences. Whether intentional through marketing materials or unintentional by lack of options, if your only afterparty is at a bar, or in an empty room with bar carts, <strong>you <em>are</em> promoting drinking</strong> purely by virtue of not promoting anything else.</p><p>As conference organizers we need to be aware that people read into everything we do, and <em>everything we don’t do,</em> and work hard to craft the whole experience. Conference experiences have been ruined more often in the evenings than they have during the day and we must be aware that our responsibilities start when the first plane touches down and don’t end at 5pm.</p><p>While it’s not our responsibility to nanny our attendees (they are adults after all) it <em>is</em> our responsibility to make sure <strong>good decisions are as easy as possible to make</strong>. And that means more effort on our parts providing a relaxed and inclusive atmosphere and letting gravity take its course.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3b051c94aa56" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>