<?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 Kat Marchán on Medium]]></title>
        <description><![CDATA[Stories by Kat Marchán on Medium]]></description>
        <link>https://medium.com/@maybekatz?source=rss-6a658354eb94------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*1GnpiwrJs6XPOLTsmnZkiQ.jpeg</url>
            <title>Stories by Kat Marchán on Medium</title>
            <link>https://medium.com/@maybekatz?source=rss-6a658354eb94------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 17 Oct 2026 07:12:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@maybekatz/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[Introducing npx: an npm package runner]]></title>
            <link>https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b?source=rss-6a658354eb94------2</link>
            <guid isPermaLink="false">https://medium.com/p/55f7d4bd282b</guid>
            <category><![CDATA[create-react-app]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[npx]]></category>
            <category><![CDATA[npm-scripts]]></category>
            <category><![CDATA[npm]]></category>
            <dc:creator><![CDATA[Kat Marchán]]></dc:creator>
            <pubDate>Tue, 11 Jul 2017 00:52:20 GMT</pubDate>
            <atom:updated>2017-08-10T01:27:59.514Z</atom:updated>
            <cc:license>http://creativecommons.org/publicdomain/zero/1.0/</cc:license>
            <content:encoded><![CDATA[<p><em>[You can also read this post in </em><a href="https://medium.com/devschacht/introducing-npx-an-npm-package-runner-a72a658cd9e6"><em>Russian</em></a><em>.]</em></p><p>Those of you upgrading npm to its latest version, <a href="https://github.com/npm/npm/releases/tag/v5.2.0">npm@5.2.0</a>, might notice that it installs a new binary alongside the usual npm: <a href="https://npm.im/npx">npx</a>.</p><p>npx is a tool intended to help round out the experience of using packages from the npm registry — the same way npm makes it super easy to install and manage dependencies hosted on the registry, npx makes it easy to use CLI tools and other executables hosted on the registry. It greatly simplifies a number of things that, until now, required a bit of ceremony to do with plain npm:</p><h3>Using locally-installed tools without npm run-script</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*A4HJT1FHQA_1_z3aMBc5mg.gif" /><figcaption>Installing cowsay as a local devDependency and running it with `$ npx cowsay`</figcaption></figure><p>For the past couple of years, the npm ecosystem has been moving more and more towards installing tools as project-local devDependencies, instead of requiring users to install them globally. This means that tools like <a href="https://npm.im/mocha">mocha</a>, <a href="https://npm.im/grunt-cli">grunt</a>, and <a href="https://npm.im/bower">bower</a>, which were once primarily installed globally on a system, can now have their versions managed on a per-project basis. It also means that all you need to do to get an npm-based project up and running is to make sure you have node+npm on your system, clone the git repo, and do npm it to run install and test. Since npm run-script adds local binaries to path, this works just fine!</p><p>The downside is that this gives you no fast/convenient way to invoke local binaries interactively. There’s several ways to do this, and they all have some annoyance to them: you can add those tools to your scripts, but then you need to remember to pass arguments through using --, you can do shell tricks like alias npmx=PATH=$(npm bin):$PATH, or you can just path manually to them with ./node_modules/.bin/mocha. These all work, but none are quite ideal.</p><p>npx gives you what I think is the best solution: $ npx mocha is all you need to do to use your <strong>local</strong> installation. If you go an extra step and configure the <a href="https://www.npmjs.com/package/npx#shell-auto-fallback">shell auto-fallback</a> (more on this below), then $ mocha inside a project directory will do the trick for you!</p><p>For bonus points, <a href="https://twitter.com/maybekatz/status/877444832494596096">npx has basically no overhead</a> if invoking an already-installed binary — it’s clever enough to load the code for the tool directly into the current running node process! This is about as fast as this sort of thing gets, and makes it a perfectly acceptable tool for scripting.</p><h3>Executing one-off commands</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*OlIRsvVO5aK7ja9HmwXz_Q.gif" /><figcaption>`$ npx create-react-app my-cool-new-app` installs a temporary create-react-app and calls it, without polluting global installs or requiring more than one step!</figcaption></figure><p>Have you ever run into a situation where you want to try some CLI tool, but it’s annoying to have to install a global just to run it once? npx is great for that, too. Calling npx &lt;command&gt; when &lt;command&gt; isn’t already in your $PATH will automatically install a package with that name from the npm registry for you, and invoke it. When it’s done, the installed package won’t be anywhere in your globals, so you won’t have to worry about pollution in the long-term.</p><p>This feature is ideal for things like generators, too. Tools like <a href="https://npm.im/yo">yeoman</a> or <a href="https://npm.im/create-react-app">create-react-app</a> only ever get called once in a blue moon. By the time you run them again, they’ll already be far out of date, so you end up having to run an install every time you want to use them anyway.</p><p>As a tool maintainer, I like this feature a lot because it means I can just put $ npx my-tool into the README.md instructions, instead of trying to get people over the hurdle of actually installing it. To be frank, saying “oh just copy-paste this one commands, it’s zero commitment” is more palatable to users who are unsure about whether to use a tool or not.</p><p>Here’s some other fun packages that you might want to try using with npx: <a href="https://npm.im/happy-birthday">happy-birthday</a>, <a href="https://npm.im/benny-hill">benny-hill</a>, <a href="https://npm.im/workin-hard">workin-hard</a>, <a href="https://npm.im/cowsay">cowsay</a>, <a href="https://npm.im/yo">yo</a>, <a href="https://npm.im/create-react-app">create-react-app</a>, <a href="https://npm.im/npm-check">npm-check</a>. There’s even <a href="https://github.com/js-n/awesome-npx">an entire </a><a href="https://github.com/js-n/awesome-npx">awesome-npx repo</a>! Go ahead! A command to get <a href="https://twitter.com/maybekatz/status/878926190064668672">a full-fledged local REST server running</a> is small enough to fit in a tweet.</p><h3>Run commands with different Node.js versions</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/460/1*lHJMhf7XzoLq9tuwNTuuhg.png" /><figcaption>`npx -p node@&lt;version&gt; node -v` can be used to do one-off runs of node versions.</figcaption></figure><p>As it turns out, there’s this cool package by <a href="https://medium.com/u/ced8d0ef47c">Aria Stewart</a> called <a href="https://npm.im/node">node</a> on the npm registry. This means that you can very easily try out node commands using different node versions, without having to use a version manager like <a href="http://nvm.sh/">nvm</a>, <a href="https://npm.im/nave">nave</a>, or <a href="https://npm.im/n">n</a>. All you need is a stock npm@5.2.0 installation!</p><p>The -p option for npx allows you to specify packages to install and add to the running $PATH, so it means you can do fun things such as: $ npx -p node@6 npm it to install and test your current npm package as if you were running node@6 globally. I use this all the time myself — and even recently had to use it a lot with one project, due to one of my testing libraries breaking under node@8. It’s been a real life-saver, and I’ve found it much easier to use for this sort of use-case than version managers, which I always somehow find a way to break or misconfigure.</p><h3>Developing npm run-scripts interactively</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/486/1*JqCC1irC-XxXAWiThpOUiw.gif" /><figcaption>`$ npx -p cowsay -p lolcatjs -c ‘echo “$npm_package_name@$npm_package_version” | cowsay | lolcatjs’` installs both cowsay and lolcatjs, and gives the script access to a slew of `$npm_` variables from run scripts.</figcaption></figure><p>A lot of npm users these days take advantage of the really cool <a href="https://docs.npmjs.com/misc/scripts">run-script feature</a>. Not only do they arrange your $PATH such that local binaries are accessible, but they also add a whole slew of environment variables that you can access in those scripts! You can see what these extra variables are with $ npm run env | grep npm_.</p><p>This can make it tricky to develop and test out run scripts — and it means that even with tricks like $(npm bin)/some-bin, you still won’t have access to those magical env vars while working interactively.</p><p>But wait! npx has yet another trick up its sleeve: when you use the -c option, the script written inside the string argument will have full access to the same env variables as a regular run script! You can even use pipes and multiple commands with a single npx invocation!</p><h3>Share gist-based scripts with friends and loved ones!</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/489/1*Hdk5w080acQjABK3CQWh4Q.gif" /></figure><p>It’s become pretty common to use <a href="https://gist.github.com">gist.github.com</a> to share all sorts of utility scripts, instead of setting up entire git repos, releasing new tools, etc.</p><p>With npx, you can take it a step further: since npx accepts any specifier that npm itself does, you can create a gist that people can invoke directly, with a single command!</p><p>Try it out yourself with <a href="https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32">https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32</a>!</p><p><em>Note: Stay safe out there! Always make sure to read through gists when executing them like this, much like you would when running </em><em>.sh scripts!</em></p><h3>Bonus Round: shell auto-fallback</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/752/1*MXY3EyWrnjdrv6gjDLgznw.png" /><figcaption>Putting the npx auto fallback in .zshrc means you can do `$ ember-cli@latest …` without referencing npx at all!</figcaption></figure><p>This awesome feature, added by <a href="https://medium.com/u/511c5e24334e">Félix Saparelli</a>, means that for many of these use cases, you never even need to call npx directly! The main difference between regular npx usage and the fallback is that the fallback doesn’t install new packages unless you use the pkg@version syntax: a safety net against potentially-dangerous typosquatting.</p><p>Setting up the auto-fallback is straightforward: look in the npx documentation for <a href="https://www.npmjs.com/package/npx#for-bash">the command to use for your current shell</a>, add it to .bashrc / .zshrc / .fishrc, then restart your shell (or use source or some other mechanism to refresh the shell).</p><p>Now, you can do things like $ standard@8 --version to try out different versions of things, and if you’re inside an npm project, $ mocha will automatically fall back to the locally-installed version of mocha, provided it’s not already installed globally.</p><h3>Do It Live!</h3><p>You can get npx <strong>now</strong> by installing <a href="https://github.com/npm/npm/releases/tag/v5.2.0">npm@5.2.0</a> or later — or, if you don’t want to use npm, you can install <a href="https://npm.im/npx">the standalone version of npx</a>! It’s totally compatible with other package managers, since any npm usage is only done for internal operations. Oh, and it’s available in <a href="https://github.com/zkat/npx/tree/latest/locales"><strong>10 different languages</strong></a>, thanks to <a href="https://github.com/zkat/npx/pulls?q=is%3Apr+is%3Aclosed+label%3Ai18n">contributions by a bunch of early adopters</a> from all over the world, with --help and all system messages translated and automatically available based on system locale! There’s also <a href="https://github.com/js-n/awesome-npx">an </a><a href="https://github.com/js-n/awesome-npx">awesome-npx repo</a> with examples of things that work great with npx!</p><p>Do you have a favorite feature? Have you already been using it? If you have something cool to show off that I didn’t list here, share it in the comments! I’d love to hear what other people are up to!</p><p><em>p.s. people keep asking this so I’m just gonna pop it in here: In these gifs, I’m using </em><a href="https://hyper.is/"><em>Hyper</em></a><em> with the </em><a href="https://www.npmjs.com/package/hyperterm-monokai"><em>monokai theme</em></a><em> running </em><a href="https://github.com/robbyrussell/oh-my-zsh"><em>oh-my-zsh</em></a><em>’s </em><a href="https://github.com/robbyrussell/oh-my-zsh/wiki/External-themes#spaceship"><em>spaceship theme</em></a><em>, plus the </em><a href="https://github.com/tonsky/FiraCode"><em>FiraCode font</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=55f7d4bd282b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Has Kylo Ren Gone Out of Style?]]></title>
            <link>https://medium.com/@maybekatz/has-kylo-ren-gone-out-of-style-506380f188dc?source=rss-6a658354eb94------2</link>
            <guid isPermaLink="false">https://medium.com/p/506380f188dc</guid>
            <category><![CDATA[star-wars]]></category>
            <category><![CDATA[parody]]></category>
            <category><![CDATA[fandom]]></category>
            <dc:creator><![CDATA[Kat Marchán]]></dc:creator>
            <pubDate>Sat, 14 Jan 2017 06:20:28 GMT</pubDate>
            <atom:updated>2017-01-14T06:20:28.342Z</atom:updated>
            <content:encoded><![CDATA[<p>No.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=506380f188dc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[On the Design of Women’s Spaces]]></title>
            <link>https://medium.com/@maybekatz/on-the-design-of-womens-spaces-72bf8f396dc0?source=rss-6a658354eb94------2</link>
            <guid isPermaLink="false">https://medium.com/p/72bf8f396dc0</guid>
            <category><![CDATA[diversity-and-inclusion]]></category>
            <category><![CDATA[transgender]]></category>
            <category><![CDATA[lgbtq]]></category>
            <category><![CDATA[nonbinary]]></category>
            <category><![CDATA[community]]></category>
            <dc:creator><![CDATA[Kat Marchán]]></dc:creator>
            <pubDate>Mon, 26 Sep 2016 17:21:19 GMT</pubDate>
            <atom:updated>2016-09-28T01:51:56.152Z</atom:updated>
            <cc:license>http://creativecommons.org/publicdomain/zero/1.0/</cc:license>
            <content:encoded><![CDATA[<p>First of all: I’m a non-binary woman. That means “woman” is a label that is significant to me, that I hold on to, and that I identify strongly with in a number of ways. I’m also a non-binary person, because “woman” doesn’t feel like the whole story of my current identity to me, and because I’ve found a lot of common ground with other non-binary folk about how we see ourselves and the world.</p><p>But not every non-binary person, regardless of their birth assignment, is comfortable using that “woman” label on themselves.</p><p>When I say “exclusion” below, I mean “fully exclusive” (meaning, no outsiders allowed), or “allies welcome” (meaning, ‘not for you’, but you won’t be turned away). It’s about who the group is <strong>for</strong>, and who <strong>gets a voice</strong>, not necessarily about who’s allowed in the door.</p><p>So let’s talk a bit about women’s spaces and the rules of exclusion they develop to create value for themselves, what they usually intend, and explore ways in which some spaces might become more inclusive of “enbies” and/or folks of various trans categories.</p><h3>A Hierarchy of Exclusivity</h3><p>Recently, while speaking with a group of non-binary folks, a discussion came up about how many of us are uncomfortable in “women’s spaces”. We talked about what these spaces usually intend, how they word things, and how they could align what they <strong>want </strong>with what they <strong>say</strong>, in order to get more of us to feel comfortable.</p><p>Feminism, for a long time, has carried the standard of addressing gendered oppression in our society. It has also historically been led largely by cis women (which I believe to be true, regardless of the fact of all the trans women that have been there for a very long time and adding incredible value to the discourse). These days, though, feminism has expanded beyond “women’s rights” and into the territory of the general fight for gender equality, as well as incorporating the concept of intersectionality from the womanist/woc parts of it. That’s important to note — because the issues that concern us are no longer discussed in terms of clear-cut gender identities.</p><p><a href="https://twitter.com/felltir">One of my friends</a> came up with a hierarchy for what “women’s spaces” want when they say “This space is for women”, and the rest of us hashed it out a bit more, and it looks something like this:</p><ol><li><strong>TERFSpace</strong>: When explicitly stated, this tends to be fairly rare in practice, but is worth mentioning because many people <strong>assume</strong> a space to actually be this, if things are worded wrong. Most of the time, though, it’s a result of naïveté on the part of organizers about trans and other identities. “TERF” stands for “trans exclusionary radical feminist”, and is a label applied to feminists who believe that only cis women are “really” women. These spaces do exist, but my experience has been that most women’s spaces actually care about welcoming and including trans women in their ranks. When looking out for them, one might look for mentions of “biological women”, “real women”, or “socialized women”, which are all dogwhistles for TERFs. Some “women’s colleges” might be the most prominent examples of this. Smith College existed in this space until recently, for example.</li><li><strong>JustUsGirls</strong>: You could see this as the next step after the above. Organizers have learned about trans folks, care about trans issues, and explicitly want to be inclusive. They still label their spaces as “women’s spaces”, they still <a href="https://femsplain.com/on-being-non-binary-in-female-spaces-12d5980e7f0c#.b7w5i07z1">regularly say things like “hi ladies”, “hey gals”, and such which are strongly identified with “woman”, but they make damn sure that their trans (binary) sisters feel welcome in that space</a>. I would say that the majority of “women’s spaces” I’ve ever been in fall into this category — not because they’re being exclusive of non-binary folks, but because they want a space like they’re used to having (and find camaraderie among other (though often femme) women), but don’t wanna be big jerks about it. There’s hints of non-binary inclusion in these, but they come with a caveat that the “woman” label <strong>must be a thing you use</strong>. You can usually spot these places by looking for things like “for women, including trans women” or “for women, or anyone who identifies as such in a significant way” or even “for women (or people who identify as such some or all of the time!)”. An example of this sort of space is the <a href="http://witchat.github.io/">Women in Tech Chat (aka “WITChat”)</a>, which accepts non-binary people who do not identify as women, but is fundamentally a space designed for connection under the “women” label — it’s not a space that will necessarily fulfill non-binary folks’ needs. Smith College also famously transitioned (pun intended) from a TERFSpace to this sort of space after updating <a href="https://www.smith.edu/studygroup/faq.php">their admission policy</a>.</li><li><strong>NoBoyzAllowed</strong>: Some spaces decide that “women” isn’t quite what they’re looking for (I’ll talk about this more below), and they decide that the rubric they <strong>really</strong> want is anyone except people who identify as men. This is a type of feminist space that achieves a large chunk of the sense of support and protection from men, but makes damn sure that folks who don’t lie on either side can join in — because they are still harmed by patriarchy in similar ways to binary women. A shorthand I’ve seen (and used) is to simply call these spaces as “not-men spaces”, or in longer (and clearer?) form: “women and non-binary individuals”. One example of this space might be the 🔒not-men channel in <a href="http://wealljs.org">WeAllJS</a>, or the same in <a href="http://lgbtq.technology">lgbtq.technology</a>, which are explicitly framed as spaces for anyone who does <strong>not</strong> identify as a man, and were created with non-binary folks in mind from the get-go. Additionally, <a href="https://www.brynmawr.edu/admissions/transgender-applicants">Bryn Mawr’s admissions policy</a>, although it’s a #2 on this scale if you’re <a href="http://nonbinary.org/wiki/Assigned_gender_at_birth#AMAB">AMAB</a>.</li><li><strong>NoCisGuys</strong>: Finally there can be spaces that decide that the rule should be “people who have lived gendered oppression in a significant way”, at least according to the concept that cis men tend to enjoy the most privilege (and perhaps inflict the most violence) in the gender spectrum. I don’t see a lot of these spaces explicitly described, but I’ve seen some #2 and #3 spaces be implicitly expected to be like this. This is a tricky one: trans men are men, even though they <strong>have</strong> very likely lived gendered oppression, and have a fantastic, unique perspective on sexism. Labeling spaces like this one wrong (specially using <strong>any</strong> wording that implies it’s a “women’s space”), turns into a rather uncomfortable case of possible trans exclusion. If this is the sort of space you want, <strong>don’t call it a women’s space anywhere</strong>. Sticking with the “women’s colleges” theme, <a href="https://www.mtholyoke.edu/policies/admission-transgender-students#q2">Mt Holyoke College’s admissions policy</a> works like this, though the wording could use some work.</li><li><strong>Whatever: </strong>mostly included for the sake of completion, this sort of space, whether it’s directed mainly at inviting women and non-binary people or otherwise, has no actual restrictions on attendance/speaking/participation, etc. They can still possibly be labeled “women’s spaces” or “for women and non-binary people”, but they often explicitly say “allies are welcome”.</li></ol><h3>Picking One and Making it Clear</h3><p>I believe all of the above, except #1, can be useful for different kinds of communities. There is nothing fundamentally wrong with wanting any of #2, #3, or #4. The problem comes, though, when you <strong>intend</strong> to do one, but you communicate another through your community rules, descriptions, and general messaging. This happens a lot! Usually when leadership doesn’t include folks who exist beyond the binary, or at least not far enough from “women” where it would matter.</p><p>So just make it clear: If you want a space that explicitly excludes nonbinary people who are not women, because you want to celebrate womanhood in particular, use “for women, or anyone who identifies as such in a significant way” — that’ll cover you for both trans women, and for non-binary women. I, for example, would feel welcome in a space labeled as such.</p><p>If what you <strong>want</strong> is a space away from patriarchy in general, then don’t call it a “women’s space”. Don’t call it a “women’s conference”. Don’t call it “Women in Technology”. Yes. I know that word carries a lot of weight for you. Yes, I know you’re not trying to be exclusionary here. Yes, I know it’s a convenient shorthand. But that’s not good enough. Don’t do it. You are actually making a lot of non-binary people who very explicitly aren’t comfortable with the term “woman” (even if they share literally all the concerns that the space was made for, including being femme (“feminine” but not necessarily “woman”), being <a href="http://nonbinary.org/wiki/Assigned_gender_at_birth#AFAB">AFAB</a>, etc). Words matter, and they’re particularly strong in the queer/trans/non-binary community. The blunt truth is this: <strong>you have to let go of the label</strong> for the sake of the group you’re trying to serve. It’s okay to say “women and non-binary people”. But you have to say <strong>both </strong>of those word. <strong>Every. Time.</strong> It’s not good enough to say “woman is a shorthand”. <strong>It’s not.</strong> I promise you that’s not how it reads to many, many non-binary people I know. That’s just a pill you’ll have to swallow.</p><p>And finally, the same thing applies to any space that you want as #4: For the love of everything that is good, don’t call that a women’s space. Trans men are not women. Don’t even say “used to be women”, because that is <strong>very much not the case for many trans men</strong>. Use other words: “anyone who has lived gendered oppression in a significant way”, or “anyone with a strong voice regarding feminist issues”. Or, frankly, don’t even bother with excluding cis men: <strong>just call the space feminist and open to any and all genders, and be done with it</strong>.</p><h3>Conclusion</h3><p>Labels are tremendously important to the queer community in particular. We’re sensitive to them. We use them to filter out things that might actually be <strong>dangerous</strong> to us. It’s your responsibility, as community organizers, to put serious effort into the structure of your community, the words you use, the rules you place on it, and the resources you provide. And besides reading medium thinkpieces like these, which might help a little, there’s no replacement for simply taking people who are not like you, who exist on these intersections, and bringing them into leadership. Most non-binary individuals that have some kind of footing in the community would be able to help you do any of the above without even having to refer to external sources. We know what our needs are.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=72bf8f396dc0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[One Month of Inclusive JavaScript]]></title>
            <link>https://medium.com/@maybekatz/one-month-of-inclusive-javascript-c169b2799875?source=rss-6a658354eb94------2</link>
            <guid isPermaLink="false">https://medium.com/p/c169b2799875</guid>
            <category><![CDATA[enforcement-of-norms]]></category>
            <category><![CDATA[community]]></category>
            <category><![CDATA[diversity-and-inclusion]]></category>
            <category><![CDATA[code-of-conduct]]></category>
            <dc:creator><![CDATA[Kat Marchán]]></dc:creator>
            <pubDate>Thu, 08 Sep 2016 16:28:05 GMT</pubDate>
            <atom:updated>2016-09-08T16:28:05.043Z</atom:updated>
            <cc:license>http://creativecommons.org/publicdomain/zero/1.0/</cc:license>
            <content:encoded><![CDATA[<p>Today marks a full month since <a href="http://wealljs.org">wealljs.org</a> publicly launched and got announced on twitter. A month isn’t a long time, but there’s still plenty to talk about, since this post will be the first time I talk about it in detail.</p><h3>✨Internet Kat✨ on Twitter</h3><p>Hi all! I&#39;m happy to announce @wealljs, an inclusive JavaScript community! Sign up for the slack at https://t.co/Zta734AKAJ!</p><p>I didn’t write a lot about it back then. Mostly ’cause I’d been focusing on seeding the pre-launch community, writing the initial policies, such as the <a href="http://wealljs.org/code-of-conduct">Code of Conduct</a> and <a href="http://wealljs.org/enforcement">Enforcement</a> policy, getting <a href="http://github.com/wealljs/wealljs.github.io">the website</a> working, and putting together a <a href="http://github.com/wealljs/wheelie-slack-app">Slack App to manage admin tasks, invites, etc</a>. Shortly after, I drafted the earlier versions of the <a href="http://wealljs.org/rfc-signup">Signup Policy</a>.</p><p>That seems fine — turns out in the past month, WeAllJS has hit a whopping <strong>370 members </strong>on Slack, which isn’t too bad for a brand new Slack focused around a single topic! We’ve already learned a few lessons, grown more policies, and developed a distinct community identity with useful resources for its members.</p><h3>What’s So Special About This Place?</h3><p>Most online communities I’m in tend to fall into two categories:</p><ul><li>exclusive communities intended to serve some slice of intersections, serving as backchannels or support groups, bastions of safety from the larger tech community.</li><li>everyone-jump-in communities centering around particular technologies which tend to deprioritize inclusive community building and supporting the underrepresented in favor of being open forums for specific topics.</li></ul><p>WeAllJS is different: It’s based on the premise that it’s possible to build an inclusive space where everyone can benefit from open access to resources (including jobs!), but where voices that are usually drowned out by the usual tech scene can be raised up and heard without fearing harm.</p><p>It’s often said in my community-building circles that you get to pick one or the other: Openness or Safety.</p><p>I believe WeAllJS can pull off both at the same time.</p><p>Well, <em>sort of…</em></p><h3>There is No Such Thing as a Safe Space</h3><p>We talk a lot about “safe” spaces and the benefits that they bring. I completely agree that having spaces to withdraw to that are more isolated from particular categories of aggressions and harm. But from a community organizer/manager point of view? If there’s anything that I’ve learned is this:</p><p><strong>You cannot guarantee your members’ safety</strong>.</p><p>You can do all the policy work you want. You can have all the application processes, filtering practices, Codes of Conduct, enforcement policies. But it won’t guarantee anyone’s safety. Because in the end, someone will say something or do something. And the damage will be done.</p><p>And the targets will not feel safe anymore.</p><p>And the more people you keep out, the fewer resources your members have access to.</p><h3>In Defense of Supportive Spaces</h3><p>WeAllJS adopted the label of a “supportive space” to describe what it does. We know we can’t guarantee the safety of anyone who joins, and that something will always happen, no matter how hard we try.</p><p>So instead, we’ll do something that we <strong>can</strong> commit to: We’ll support you.</p><p>Supporting means that when something happens, it’s the person who was harmed who takes priority. It means that we need to be proactive in structuring the community in such a way that the possibility of harm is reduced. It means everyone should know what happens, what to expect, and that they won’t need to fight for the smallest shred of justice. They won’t have to justify the pain before anyone is willing to take action.</p><p>Supporting means that you’ll help lift the weight off their shoulders without pushing them to the sidelines.</p><h3>Structuring Supportive Spaces</h3><p>Supportive spaces aren’t just about setting a bunch of rules (we do that), or having diverse organizers/admins (we do that, too): They’re about having a structure for your community that clarifies social expectations and balances access to resources with connection and community.</p><p>WeAllJS, being primarily a Slack-based community, uses a particular strategy for balancing these two: Resource Channels and Identity Channels.</p><p>The idea to structure a community in this way originated in the <a href="http://lgbtq.technology">lgbtq.technology</a> community, which started making such a distinction at some point, and implemented specific policies around them to better strike the balance between resource access and reduced exposure to harm.</p><h3>Resource Channels</h3><p>The premise behind resource channels is that there are some things within a community that are much better when everyone is able to share them. In the case of WeAllJS, these channels are public, managed by admins, and fit specifically into some narrow categories, such as “platforms/technologies”, “jobs and career advice”, “local community”, and a few miscellaneous channels for specific purposes like meta-conversation about the Slack.</p><p>Resource channels have an expectation of low-intensity conversation, of being spaces that are limited to those specific topics and generally to keeping connection between people careful and polite: as one might do at a professional meetup in meatspace at a work-related venue. We know how to behave in these spaces. We’re still friendly, we can still bond, but everyone is there because they see the space as a resource. The experience at WeAllJS so far is that this pretty naturally stays within a respectful, polite range of conversation.</p><h3>Identity Channels</h3><p>Identity channels exist on practically the other end of that spectrum: They’re private channels centered around specific parts of personal identity, different intersections. These spaces are created so we can bond with people who are like us, who we’re more familiar and more comfortable with. Spaces where we don’t have to watch out for particular microaggressions. Where can expose a side of ourselves that it simply isn’t comfortable (or safe!) to openly expose when others are looking. These are the spaces where we can have Those Conversations. They’re our backchannels. Our whisper networks. Our circles of friends and kindred spirits.</p><p>Examples of these channels are: lgbtq, poc, mental-health, not-men, not-women, persons with disabilities.</p><p>These channels are arguably just as important as resource channels for creating a healthy, bustling community. Identity channels work out to be incubators for particular intersections of your community. It turns out that when you go somewhere, look around, and realize you’re literally the only one there that’s anything like you… well, you know it’s not a place for you. And it’s probably not. Because no one will be there to understand when something affects you in a way that the others aren’t affected. You feel alone.</p><p>But when you look around and there’s a few of you, and you have a space where you won’t lose them in a much larger crowd — a place where you can make sure to <em>only</em> hear each other’s voices — you don’t feel alone anymore. You have a place to withdraw to. You have people that you need to ask questions of that you know will understand your needs related to that intersection better than others. People that you don’t need to educate.</p><p>And then, energized, you can go back into the bigger crowd. It’s much easier to be vulnerable when there’s a safety net right there for you. And it’s much easier to feel like you belong in the larger space when your little corner of your own is a part of it.</p><h3>A Month of Results</h3><blockquote>No joke, I’m really happy this group exists. I feel like I belong and have support much more now and it is lovely to have folks to talk to about my nerdy hobbies and to exchange knowledge with. WeAllJS is amazing. —<a href="http://twitter.com/matsie"> @matsie</a></blockquote><blockquote>i like how active and respectful this community is —Elaine</blockquote><blockquote>yeah our community seems really mature and developed because we have actually the highest concentration of dads — <a href="https://twitter.com/mysterysal">@mysterysal</a></blockquote><p>(quoted with permission)</p><p>It’s pretty great so far! The Slack has been seeing a lot more activity in the past two weeks as a core of participants get more comfortable participating, as channel cultures start forming. It’s <strong>amazing</strong> to sit in our #watercooler channel and see a huge variety of folks contributing. Not-men, queer folks, black folks, and cis white dudes, all in the same regular conversations.</p><p>Identity channel membership:</p><ul><li>mental-health: 23</li><li>not-men: 63</li><li>not-women: 15</li><li>neurodiversity: 20</li><li>poc: 23</li><li>black-folks: 8</li><li>latinx: 11</li><li>people-with-disabilities: 11</li><li>lgbtq: 52</li></ul><p>Note that there is a lot of overlap between members in these channels, and not everyone in the slack who falls into the general scope of an identity channel joins it. These numbers are less useful at looking at the overall balance in the community, and more at seeing the various groups that are being served by identity-based spaces — as well as just general representation in the Slack.</p><p>The community is also fairly spread out geographically. Bay Area techies turn out to not be a majority: there’s significant representation of Latin Americans, Europeans, and even a bit of of East and South Asia. One of the larger location-based channels in the Slack is even dedicated to people who are “out there” — that is, fairly far from significant tech centers in their respective countries.</p><p>The Slack also recently adopted a <a href="http://wealljs.org/rfc-docents">Docent System</a> for helping encourage conversation and have dedicated individuals to act as points of contact. And, most importantly: to watch out for voices that might be otherwise drowned out, and make sure they get heard in the conversation. The process is still in its early testing stages, and only a few channels have active docents so far (#npm, #backend, #rails, and #arthack). They’ve definitely already nudged those channels into more regular activity!</p><p>And all of this isn’t happening entirely without Code of Conduct violations. The Enforcement policy has been put into action more times than I can count, but most people don’t even notice. Let’s take a quick look at that policy:</p><blockquote>1. Tell someone “hey, that’s not ok”.</blockquote><blockquote>2. That person should apologize immediately and correct the behavior.</blockquote><blockquote>3. If this doesn’t happen, isn’t safe to do, or is not satisfactory, message admins.</blockquote><blockquote>4. Admins will take appropriate action in a timely manner, prioritizing those who were hurt.</blockquote><blockquote>— <a href="http://wealljs.org/enforcement">WeAllJS Enforcement Policy</a></blockquote><p>Almost the entirety of CoC “violations” have stopped at #2 in that list. Because our enforcement process is not zero-tolerance (and in fact, operates in distinct stages of seriousness), people who are called out for various issues simply apologize, edit the relevant message, and move on.</p><p>Perhaps, to me, the biggest sign that “The System Works!™” is this: it is not a common sight for a cisgender heterosexual white man to be asked directly, in a public channel, to refrain from using some ableist term (read: “crazy”/”lame”/other terms which are widely-accepted in common parlance). And they just go “oh sure, sorry about that!” and <em>everyone moves on.</em> This might seem like an obvious conclusion to you, dear reader, but it’s mindblowing to someone who has had to field numerous CoC violations as an admin in other communities for years.</p><p>Reactions like that means that no one involved feels particularly threatened: The person who Said That Word knows that they won’t get banned or publicly shamed for messing up or saying the wrong thing, because we just don’t do that — because our enforcement policy says we won’t. And the Person Who Was Hurt knows that they can speak up, and that <strong>admins will have their backs.</strong> They know that the worst-case scenario as far as they’re concerned means they have to escalate to #3 in the tl;dr, and admins will make sure things are handled from there. They won’t have to justify it to us. They won’t have to fight tooth and nail for what feels to them like basic respect. When you take a trust-but-verify approach to these things, temperatures stay low, and everyone is simply better able to handle what can very easily become a deeply uncomfortable conflict.</p><p>And so, We All Grow Together.</p><h3>I’m Done, I Swear</h3><p>This first post about this stuff was a little long. Thanks for hanging in there! I can only hope that writing about this, sharing experiences, and showing what really really worked and what really really didn’t will be useful to others and to this very community.</p><p>Let’s see where it all goes from here, dads! Wanna join us and help us make a difference? Head over to <a href="http://wealljs.org">wealljs.org</a> and sign up! I look forward to seeing you!</p><p>P.S. dad jokes have become a <em>thing</em>. Especially in the queer corners of the slack. I’m not even sorry.</p><h3>✨Internet Kat✨ on Twitter</h3><p>This is a good description of one of the corners of @wealljs. Dad jokes turned into a thing. (cr: @ShutoTakahiro)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c169b2799875" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kat’s Short Guide To JS Devops Ecosystem]]></title>
            <link>https://medium.com/@maybekatz/kat-s-short-guide-to-js-devops-ecosystem-9ffef67fdb8e?source=rss-6a658354eb94------2</link>
            <guid isPermaLink="false">https://medium.com/p/9ffef67fdb8e</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Kat Marchán]]></dc:creator>
            <pubDate>Fri, 19 Feb 2016 22:32:50 GMT</pubDate>
            <atom:updated>2016-02-20T16:38:42.206Z</atom:updated>
            <cc:license>http://creativecommons.org/publicdomain/zero/1.0/</cc:license>
            <content:encoded><![CDATA[<p>So as it turns out, the front-end JS ecosystem is fairly complicated. So many libraries to do basically everything, 100 times over. For a lot of folks, one of the biggest and most controversial bits of this is what to do at the development environment level, which I call devops. This is the stuff that isn’t your front-end framework or whatever, but the tools that help you put everything together and smooth the actual process of coding out.</p><p>I’ve tried to collapse them into a set of choices that you can make between fairly-equivalent tools, and you can figure out the details based on your specific project needs.</p><p>Note that depending on your other tools (servers, front-end frameworks, etc), a lot of these choices <em>will be made for you</em>. This post is for clarification, and doesn’t cover those cases, which you’ll have to suss out on your own.</p><h3>1. pick a task runner</h3><p>These are for abstracting away common development tasks, like running tests or a dev server. <strong>tool &lt;commandname&gt;</strong> to do each thing, i.e. <strong>gulp test</strong>.</p><p>Choices: <a href="http://gruntjs.com/"><strong>Grunt</strong></a><strong>, </strong><a href="http://gulpjs.com/"><strong>gulp</strong></a><strong>, </strong><a href="https://www.gnu.org/s/make/"><strong>make</strong></a><strong>, </strong>and<strong> </strong><a href="https://docs.npmjs.com/cli/run-script"><strong>npm scripts</strong></a>.</p><p>They are <strong>all the same thing</strong> — ops tools for composing together large, complicated build tasks. The first 2 (grunt, gulp) are nice because they have big ecosystems of common tasks, so you simply import them, and add some configuration, and they take care of the details. The others require no extra dependencies, but don’t scale very well as things get more complex (if that’s where you’re headed).</p><p><em>Edit: A previous version of this referred to broccoli as a task runner — this is not quite right. It works more like a bundler in practice (see below).</em></p><h3>2. pick a bundler</h3><p><em>(front-end only)</em></p><p>If you’re doing front-end, you usually want a tool that can get all your javascript files, collect them, minify them, and spit them out as a single <strong>app.js</strong> that you then put in a <strong>&lt;script&gt;</strong> tag.</p><p>Choices: <a href="https://webpack.github.io/"><strong>Webpack</strong></a><strong>, </strong><a href="http://browserify.org/"><strong>browserify</strong></a><strong>, </strong><a href="http://broccolijs.com/"><strong>broccoli</strong></a>.</p><p>They only differ in some details in their approach. Pick whichever you find yourself more confident with after looking at their docs. Most of the time, there will be no real difference in the end. npm cannot do this very easily at all, unless you write a manual concatenation bash script. Please don’t do that, and ignore the jerks who try and convince you that’ll ever be maintainable.</p><h3>3. pick a compiler tool</h3><p><em>(optional)</em></p><p>Compilers let you write javascript in one style (such as <a href="https://babeljs.io/docs/learn-es2015/"><strong>ES6/ES2015</strong></a> or <a href="http://coffeescript.org/">C<strong>offeeScript</strong></a>), and convert them to <strong>es3</strong> or <strong>es5</strong> so it works with most platforms, or even minify or otherwise transform it.</p><p>Choices: <a href="https://babeljs.io/"><strong>babel</strong></a><strong>, </strong><a href="http://lisperator.net/uglifyjs/"><strong>UglifyJS</strong></a><strong> </strong>or <strong>plugins to your bundler</strong> (<strong>babel</strong> can also be, and often is, a <strong>plugin</strong>)</p><p>If you’re just gonna write and output straight-up <strong>es5</strong> or <strong>es3 </strong>(“regular” javascript), <em>you do not need this</em>.</p><p>That said, the functionality in compiler tools is almost always absorbed into the build pipeline for bundlers, so most of the time these will just be plugins you add to those.</p><h3>4. pick a test runner</h3><p>There’s a bunch of test runners, they all work somewhat differently, but they all basically do the same thing: run your project’s tests.</p><p>Choices: <a href="http://karma-runner.github.io/0.13/index.html"><strong>karma</strong></a><strong>, </strong><a href="https://github.com/bitovi/testee"><strong>testee</strong></a>, <a href="http://www.node-tap.org/"><strong>tap</strong></a><strong>, </strong><a href="http://mochajs.org/"><strong>mocha</strong></a><strong>, </strong><a href="https://jasmine.github.io/"><strong>jasmine</strong></a><strong>, </strong>etc<strong>.</strong></p><p>Your choice here should depend on what you want your tests to look like, and what just happens to be more convenient for you. Running tests on a browser can be tricky, but the first two items on the list above specialize in running your test code in actual browsers, automatically.</p><p>Some clarification: You might see <strong>karma</strong> or <strong>testee</strong> talking about being able to run tests with <strong>mocha</strong> and <strong>jasmine. </strong>That just means they can use a subset of those tools (which are actually larger frameworks) to run your tests, but they essentially <strong>wrap</strong> them, and act as their own, separate tools.</p><h3>5. pick a linter</h3><p><em>(optional)</em></p><p>Linters are like a simplified mini-test-suite that usually runs before your actual tests, or in your browser. Linters just read through your javascript to find common errors, like misspelled variables, syntax errors, or formatting problems. They’re often used to make sure everyone on your project is coding in the same general style, and catch simple programmer errors.</p><p>Choices: <a href="http://standardjs.com/"><strong>standard</strong></a><strong>, </strong><a href="http://eslint.org/"><strong>eslint</strong></a></p><p><strong>standard</strong> is nice because you’ll never have arguments about how to configure your linter. <strong>eslint</strong> is nice because you get to spend weeks arguing about every single little detail about your team’s coding style. :trollface:</p><p><em>Edit: my snark above should tell you everything you need to know about how I feel about the details of this one in particular. Linters are handy. Don’t waste more time on them than they save you.</em></p><h3>6. use npm scripts to wrap all of the above</h3><p>Invoke all the above tools through npm scripts, so you have a single, straightforward command into all this stuff that works across the ecosystem.</p><p>npm scripts add binary dependencies to <strong>$PATH</strong>, so you can do:</p><pre>“scripts”: { “build”: “grunt build” }</pre><p>And then <strong>npm run build</strong> to run that task.</p><p>Since you know npm will basically always be installed, these days, getting your devs used to just doing <a href="https://docs.npmjs.com/cli/test"><strong>npm test</strong></a> or <a href="https://docs.npmjs.com/cli/start"><strong>npm start</strong></a> will be more future-safe. And really, you can let complexity happen over time this way, without complicating the interface, and most importantly: You don’t need to tell devs to <strong>npm i -g grunt-cli</strong>, which is a really annoying setup step for new dev, imo.</p><p>Choices: <a href="https://npmjs.com"><strong>npm</strong></a> ;)</p><h3>7. pick a front-end-specific package manager</h3><p><em>(optional, discouraged)</em></p><p>These tools are not really that necessary these days, but the fact is, npm’s front-end module support isn’t gonna do as good a job in some cases. <strong>npm@3</strong> usually flattens, but there’s no way to guarantee this, so you may run into issues where things you were pathing into <strong>node_modules/</strong> for unexpectedly moved deeper in the tree, or suddenly you have two copies of <strong>jQuery</strong> trumping each other, etc. Bundlers usually fix this, but it can still be a problem.</p><p>Choices: <a href="http://bower.io/"><strong>bower</strong></a><strong>, </strong><a href="http://jspm.io/"><strong>jspm</strong></a>, etc</p><p>idk. I don’t use any of these anymore. They’re just more dependencies I don’t need &lt;:) (disclaimer: Some of you may not be aware, but I’m a dev for the npm CLI. This last bit is clearly biased. I’ve used bower plenty in the past. Do whatever makes sense for <strong>you </strong>in the end.)</p><h3>putting everything together</h3><p>Curious about what this might all look like? You can check out <a href="https://github.com/zkat/mona/blob/develop/package.json">https://github.com/zkat/mona/blob/develop/package.json</a> for an example of a setup for a front-end-compatible library that:</p><ol><li>publishes to <strong>npm</strong></li><li>only uses <strong>npm scripts</strong> as the task runner</li><li>uses <strong>webpack</strong> for bundling</li><li>uses <strong>babel</strong> for converting ES2015 to ES5 (without bundling) to make it available to Node.js</li><li>Runs a linter (<a href="http://standardjs.com/"><strong>standard</strong></a>), builds, and uses <strong>mocha</strong> to run the test suite.</li><li>Does all of the above as <strong>devDependencies</strong>, requiring no global or external installations besides <strong>npm</strong> itself.</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9ffef67fdb8e" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>