<?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 Dan Schlosser on Medium]]></title>
        <description><![CDATA[Stories by Dan Schlosser on Medium]]></description>
        <link>https://medium.com/@danrschlosser?source=rss-59bbc929ff7a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*sZQi8w3YoyCKQNbmRkkEmQ.jpeg</url>
            <title>Stories by Dan Schlosser on Medium</title>
            <link>https://medium.com/@danrschlosser?source=rss-59bbc929ff7a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 23 Jun 2026 15:36:52 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@danrschlosser/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[My Credit Cards Betrayed Me in Takayama, Japan]]></title>
            <link>https://medium.com/@danrschlosser/my-credit-cards-betrayed-me-in-takayama-japan-576c24e3c713?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/576c24e3c713</guid>
            <category><![CDATA[japan]]></category>
            <category><![CDATA[humor]]></category>
            <category><![CDATA[travel]]></category>
            <category><![CDATA[life-hacking]]></category>
            <category><![CDATA[credit-cards]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Wed, 12 Dec 2018 15:34:59 GMT</pubDate>
            <atom:updated>2018-12-12T15:34:59.662Z</atom:updated>
            <content:encoded><![CDATA[<p>So there I was, standing in the middle of the street, when it hit me: I didn’t have enough money to afford my room that night. Or a bus ticket back to the city. I wasn’t even sure if I could afford dinner.</p><p>And with the strongest typhoon in 25 years about to make landfall in Osaka, I needed to figure something out. Like, now.</p><p>Let me start from the beginning. A few months back, <a href="https://schlosser.io/travel/japan-fall-2018/">I took a trip to Japan</a>. I was going to be there for three weeks, and for the first week I was all on my own. My flight into Tokyo landed on August 31, 2018. This is going to be important later.</p><p>When I landed, one of the first things I did was go to an ATM in the airport and pull out about $400 in yen. I took that money and travelled to a bunch of different cities over the next few days: Tokyo, Nikko, Kurobe, Toyama. Four days into my trip, I found myself in Takayama, Japan, in the center of rural Gifu prefecture. It was beautiful.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uba1qIV-VjRlYUOK.jpg" /><figcaption>The main shopping district in Takayama</figcaption></figure><p>By then, I was running a little low on cash. I had around ¥5000, or $50, and I definitely needed more. In Japan, <a href="https://www.bloombergquint.com/global-economics/cash-is-still-king-in-japan-and-that-could-be-a-problem-for-the-boj">cash is king</a>, and in rural Takayama, restaurants, hostels, and busses are all cash only. I knew this from my previous trips, and so I went to the only international ATM in town, at the 7–11 on the corner. I stuck in my debit card, and punched in my pin.</p><p>Transaction declined.</p><p>No problem, I thought, I probably mistyped my pin. I put my debit card back in the ATM, and re-typed my pin.</p><p>Declined again. This time I read the paper slip more carefully:</p><pre>Transaction Declined: This card has expired.</pre><p>I looked down at my debit card, and sure enough, my debit card had expired as of September 1st, 2018, <em>the day after my flight landed in Tokyo.</em></p><p>In the corner of the 7–11, a newscaster ominously reminded everyone that there was a typhoon headed for Japan. Typhoon Jebi, the strongest typhoon to hit Japan in 25 years, was on collision course for Osaka and due to make landfall tomorrow.</p><p>Everything was going to be fine.</p><h4>Let’s take a look inside my wallet.</h4><p>Whenever I travel, I carry a four cards with me in my wallet:</p><ol><li>Charles Schwab Investor Checking Debit Card</li><li>Chase Sapphire Reserve Credit Card</li><li>Chase Freedom Unlimited Credit Card</li><li>Google Corporate Credit Card</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9UzHHNprnc2RW_WJlJN7_g.png" /><figcaption>The four cards in my wallet. (Google card is my mockup)</figcaption></figure><p>My debit card was expired, so I called Schwab with lots of questions. Why didn’t I get any advance warning that my debit card was about to expire? Couldn’t they re-activate my card, or something? I was out of luck. You can’t use an expired debit card, no exceptions.</p><blockquote><strong>Problem #1</strong>: Schwab didn’t notify me that my debit card was going to expire. They claimed to have mailed me a new one weeks ago, but I never received it.</blockquote><p>The customer service agent offered to overnight the card to me from the U.S., but it would take a few days to get through Japanese customs. They asked me where I’d be staying for the next few days. I had planned to stay in a different town each night for the rest of the week, so it didn’t seem like a good option. I told them to ship it to my hotel in Tokyo, and I’d pick it up at the end of the week. But what was I going to do until then?</p><h4>Chase Credit Cards + ATMs = no luck</h4><p>I started sticking my credit cards into the ATM, starting with my Chase Sapphire Reserve (which has no foreign transaction fees), and following up with the Chase Freedom Unlimited. I figured they’d probably stiff me on the cash advance fees, but I’d live.</p><p>I typed in every pin I could think of, and they all got declined with an “incorrect pin” message. That’s when I realized: Did I even have a pin?</p><blockquote><strong>Problem 2</strong>: My Chase credit cards were both chip + signature cards that don’t support pins for purchases.</blockquote><p>Because my Chase cards were both chip + signature, I didn’t have a pin configured on them. Confused, I called Chase. It turns out these cards can be used for a cash advance at an ATM, but to do so you have to call Chase and specifically ask to setup an <em>ATM pin. </em>If you call and ask just to “setup a pin,” they’ll tell you that the card is chip and signature. (It took me three customer service agents at Chase to figure that out.)</p><p>Meanwhile, the winds of Typhoon Jebi just hit 130 mph.</p><p>So now on my fourth call to Chase, I get to the pin creation automated phone system. After painstakingly typing in my social security number and credit card number, I get to the end of the pin process and realize that while you can easily <em>change </em>your ATM pin if you already have one, <strong>you can’t actually create an ATM pin over the phone. </strong>Instead, they will <strong>mail you a randomly generated pin to your home address, in 2–3 weeks. </strong>Then, you can call in and change your pin to whatever you want. I hang up.</p><blockquote><strong>Problem #3:</strong> There’s no way for me to create an ATM pin over the phone.</blockquote><p>I called Chase back, now for the fifth time, and grilled them. Why was this so broken? By this time, I was on the phone with the ultra-elite-emergency-super-customer-support person from Chase. The woman told me that they didn’t allow ATM pin creation over the phone for security reasons, unless the card is less than 90 days old (not true for me).</p><p>I had a flash of hope when she said “Wait a minute, I swear there used to be some emergency pin process, but I haven’t heard about it for years… let me go look that up.” She put me on hold to, as I can only imagine, take the elevator to the basement of the Chase customer support center, open up some filing cabinet, and blow years of dust off some ancient manual in search for this “emergency pin” procedure.</p><p>It turned out she was right, they <em>used</em> to have an “emergency pin” process for situations like mine, but they stopped the process several years ago. This woman, who tried <em>so hard</em> to help me with all of this, had to say “I’m sorry, good luck with all of this” and hang up.</p><h4>No luck on my company card, either</h4><p>I tried my Google corporate card in the ATM as well, to no avail. I had a pin on the card, but it got declined, with the error message “feature not available.” Apparently, my corporate card didn’t support cash advances.</p><blockquote><strong>Problem #4:</strong> No cash access on my Google corporate card.</blockquote><h4>Time to call in the cavalry: Google Security team</h4><p>One of the many perks of working for Google is that employees have 24/7/365 access to the Google Security Team, the Google security team. No matter where you are in the world, you can call Google Security when you’re in trouble and they’ll help you figure it out. Even if you’re not on a work trip. (I was, at least sort of.)</p><p>I explained my situation: cash-only rural Japan, no cards that work, incoming typhoon. They told me I could apply to get cash access on my corporate card, but it would require manager approval.</p><blockquote><strong>Problem #5:</strong> I needed manager approval for cash on my corporate card.</blockquote><p>The Google Security team filed a ticket, but it was the middle of the night back home in the U.S. I could call back if things got really dire.</p><p>So there I was, in the middle of the street in Takayama, Japan, when it really hit me: I didn’t have enough money to afford my hostel reservation that night. Or a bus ticket back to the city. I wasn’t even sure if I could afford dinner. With the strongest typhoon in 25 years about to make landfall in Osaka, I needed to figure something out. Like, now.</p><p>I started to get creative. In the US, you can get cash back at a grocery store, like Stop &amp; Shop. So I walk up the counter at the 7–11 and whip out Google Translate, trying to explain to the 19-year-old working behind the counter what a cash advance is.</p><p><em>“I want to buy something using my credit card, and have you give me Yen.”<br>私はクレジットカードを使って何かを買って、円を貸してもらいたい」</em></p><p>She shook her head, clearly confused and weirded out. She gave me the look that said “yeah… we don’t do whatever that is.” I had to try something else.</p><h4>My solution? Begging strangers to help me use an ATM.</h4><p>I’m actually pretty surprised it took me this long to think of, but it finally popped into my head. Could Venmo be my answer? Well, not Venmo because I was in Japan and no one there had Venmo, but some peer-to-peer payments app. I tried to sign up for one of the many Japanese P2P payments apps, but they all required Japanese bank accounts. No dice.</p><p>I did have one app that could work, though: <strong>PayPal.</strong> Boring, corporate, ubiquitous, PayPal. It could work. Someone with a working debit card takes out Yen for me, and I send them money on PayPal.</p><p>What came next wasn’t pretty. I went to the most touristy area of Takayama and started profiling tourists that seemed the most likely to trust me. I approached them, like a shark.</p><p><em>“Excuse me, sir, I’m so sorry to bother you, but you see, my debit card–here take a look at it–you see it expired the day after I arrived here in Takayama, and see I have these credit cards…so my question is, do you have a PayPal account?”</em></p><p>I was literally that scammer that walks up to you on the street and asks if you can help him get his hands on some cash. I probably approached 10 different couples, all from Europe or Australia or India or the U.S. in search of someone who would trust me enough to take out ¥50,000 from an ATM for me, in exchange for that amount, rounded up, on PayPal.</p><p>I begged.</p><p>Time and time again, I got roughly the same answer. <em>“Sorry.. yeah.. you see, we don’t really have any cash… No, no, we’re just using our cards… yeah sorry I can’t help you.”</em> It was brutal. To them, I was just your average tourist scammer.</p><p>After an hour of trying, finally, <em>finally, </em>I found a willing tourist. Manuel, de Barcelona. Manuel and his wife listened empathetically to my sob story (I was an expert at this point), and after considering it for a moment, agreed. We went together back to the 7–11, he got me the cash, and I paid him on PayPal. There are good people in the world.</p><p>With cash in hand, I could finally afford my bus ticket to my next destination, and I could afford to check into my hostel. I asked if I could buy him and his wife a drink. They said they were headed to check into their hostel, but maybe later that night. “Where are you staying?” I asked.</p><p>Of course:<strong> </strong>They were staying in <strong>the same hostel as me.</strong> Not only that, but, as we found out later, we had rented <strong>neighboring rooms </strong>in the hostel. I’m not sure I could have made up something that coincidental. Of the hundreds of tourists visiting Takayama that day, it was Manuel that trusted me enough to take a risk, and do the PayPal for cash exchange.</p><h4>Epilogue</h4><p>The next day, I called back the Google Security team, and even though my manager hadn’t approved the ticket yet, they skipped the approval and put some cash access onto my corporate card. This got me through the rest of the week (Manuel’s ¥50,000 only went so far) until I arrived in Tokyo and picked up my new debit card.</p><p>I still carry these four cards with me whenever I travel. But now, I make sure to check my expiration dates, well before my trips start.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=576c24e3c713" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Design 101, from a Non-Designer]]></title>
            <link>https://medium.com/@danrschlosser/design-101-from-a-non-designer-a383e20dbfcb?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/a383e20dbfcb</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[web-design]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Mon, 25 Sep 2017 18:57:53 GMT</pubDate>
            <atom:updated>2017-09-29T13:59:26.498Z</atom:updated>
            <content:encoded><![CDATA[<p>For many, design can seem like magic — a dark art that only few can master. It can be intimidating to learn, especially since many people think that design sense is innate: either you’re born with it or you’re out of luck. (Not true.)</p><p>Disclaimer: I’m not a designer. I’m an engineer and product manager but I’ve picked up a few tricks from my colleagues that have helped me hold my own in design reviews and projects.</p><p>My perspective is that becoming an advanced designer requires years of practice but that the basics of design is like learning guitar: You only need to learn four simple chords to play a lot of the music from the past 50 years. I’ve collected a few equivalent design fundamentals that have served me well. Most of the examples I’ll use here are from web design (my wheelhouse), but my hope is that you’ll find them broadly applicable.</p><h3>1. What is design, and how do I learn it?</h3><p>I know the question sounds a little academic, but bear with me. After years of being corrected for my assumptions about the field, I’ve learned that everybody (including most designers) has a slightly different definition of design. Here’s the definition that makes the most sense to me as a starting point:</p><h4><strong>Design is the intersection between art, engineering, and people.</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FP_WPe8xZpAAKEZNN9wGnw.png" /></figure><p>The field of design could be understood as the process of using art and engineering to impact people’s lives.</p><ul><li>Design without art is dull. (Think of a stuffy office building.)</li><li>Design without engineering is impractical. (Think of flying cars.)</li><li>Design without people is devoid of purpose. (Think of an Olympic village, several years later.)</li></ul><p>Different fields of design use each of these skills in different proportions, but they all leverage some combination of all three:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8VEf6NaOJOhyEryYlO8j8A.png" /><figcaption>My entirely scientific, independently researched, peer reviewed explanation of various fields of design.</figcaption></figure><p>If the art-engineering-people triangle is an academic definition of design, here’s a more practical one:</p><h4>Design is a tool to direct attention, create understanding, and motivate action.</h4><p>When we want to achieve a goal, we need to first understand the world around us and act accordingly. When we interact with the world, we rely on core assumptions about how objects and elements will function. These assumptions are created and reinforced by design.</p><p>Take a very simple goal: walking into a building. A well designed door can be easily identified from the exterior of a building, and a properly shaped door handle can only be turned one way to unlatch it.</p><p>It’s design’s job to help people understand objects in their world, and make their interactions with those objects intuitive. This flow — attention to understanding to action — is core to design. We can evaluate design by examining how effectively it directs attention, communicates meaning, and enables people to take action when needed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0p_NGikMoy-RpzJmr20gUw.png" /><figcaption>If you want to influence action, you have to first direct attention and create understanding.</figcaption></figure><h4>Artists steal, engineers cheat, designers do both.</h4><p>There is lots of hard work required to become a designer: understanding art, engineering, and human psychology requires years of study. But when you’re just starting out? Cheating and stealing are perfectly acceptable as well. (Aside from complete and utter plagiarism.)</p><p>Becoming an artist is hard, but any teacher will tell you that imitation builds a strong foundation. A jazz musician might transcribe solos by Miles Davis, learning to play each note and phrase to better understand rhythm, harmony, and phrasing. Likewise, imitating your favorite designers can be a great starting place, especially when it comes to the more subjective choices like color and typography.</p><p>On the other hand, when it comes to engineering, copying others’ work isn’t very helpful. Instead, a few key tricks and cheats can get you a long way. In calculus, L’Hôpital’s rule, factoring, and completing the square are all useful techniques for parceling out a complex problem into solvable chunks.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0pEBQwavoxZfV7fnIcOKBg.png" /><figcaption>My goofy summary of how to learn art, engineering, and people</figcaption></figure><p>In design, these tricks take the form of best practices for layout, spacing.</p><h3>2. How do I layout my design?</h3><h4>Space facilitates understanding.</h4><p>In design, space is an extremely powerful tool for controlling attention, and conveying meaning.</p><p>Some designers use space well:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pNppY_QvcezTXIE1oNGFuw@2x.png" /></figure><p>Others don’t:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FHdpcUAxRowsqxsqniUvcg@2x.png" /></figure><p>So how can we use space effectively in design? To explore that question, let’s try an experiment. I’ll show you a few paragraphs of text and a captioned image, and you find the caption:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uWcHVqmmOGyHcKWL3wlelw.png" /></figure><p>Can’t find it? How about here:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iAMYFXlUcgHSu1M1OEAvIA.png" /></figure><p>OK, you might have figured it out. But it took a second, and we can’t necessarily be sure. How about here:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5M6cTnvExTSt6ELNdQpWRg.png" /></figure><p>OK, pretty doable, but I think we can do better:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kN_TKGtBR-MJKmocWps0NQ.png" /></figure><p>Finding the caption in that last example is easy, especially in comparison with the first version. Why?</p><h4>Proximity creates associations, and separation creates distinctions.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*caW3UAGiznTZ3A3YCuOEoQ.png" /></figure><p>The problem with the first Calvin image was that it wasn’t clear which of the many sentences is <em>associated</em> with the image. Said differently, it wasn’t clear which sentence was meant to be <em>distinct</em> from the rest of the paragraphs.</p><p>In the revisions, space is added between distinct elements (the image and the text, the caption and the paragraphs). We can visualize this process by drawing boxes around visually grouped elements:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MvrU7NnLQ9kr-J3Gidmurw.png" /><figcaption>Proximate items are grouped in red boxes.</figcaption></figure><p>This final version is quite easily parsable and therefore it’s easy to draw boxes around the intended grouping of elements. If we apply this evaluation technique to our earlier examples, we can see that the same principle holds.</p><p>In Alphabet’s site, the “G is for Google” text is closely associated with the beginning of the note “As Sergey and I wrote.” Additionally, the signature and signature label are grouped, with ample space above them, as to make clear that the signature is one unit that is distinct from the note.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DiMUl6VSVg5P0SLPU78JZQ.png" /></figure><p>Looking at Columbia’s website, we find quite the opposite. It’s hard to draw meaningful boxes, and when we do, they’re very tight to each other, often overlapping.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mPWsX0q2vN93tOO9xXw6ug.png" /></figure><p>Space should be used to make several elements distinct: the search box from “Email” and “Quick Links”, the dark blue bar at the top from the light blue sidebar and the content, and the image gallery from University news and events. See my simple mockup below as an example:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oNlLi2lFAQmCqCGEXtWwBg.png" /><figcaption>I added a bit of space to Columbia’s website. It looks… better?</figcaption></figure><p>These general principles of space can help sketch out a basic layout, but when it comes to the details of precise positioning, things can get tricky.</p><h4>Grids can help you place elements precisely.</h4><p>The word <em>grid</em> here can be a bit misleading. In the context of web design, a <em>grid</em> is a set of columns that can be overlaid on top of a page. Elements on the page are typically sized to take up one or more columns. In between columns, we can place a “gutter,” or space, so that adjacent items are not overlapping.</p><p>Take a look at the Airbnb homepage (circa a few months back) to see how grids helped organize their design:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Gw0WPGx0wFgmUnXWWG9BOA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ny6d-bDCrIIXAX16EoFeww.png" /><figcaption>The Airbnb homepage uses a traditional 12-column grid.</figcaption></figure><p>The principle here is consistency, consistency, consistency. Our brains are wired to notice things that are unexpected or outside normal (like a painting on a wall that’s not quite straight), and so as designers, we shouldn’t give them anything to squint at. On a grid, elements on a page make logical sense.</p><p>Notice how each image and piece of text on the page aligns with one of the grids. For example, while each row of images is a different height, they align on the grid. In the first row, each image is four columns wide, then two, then three.</p><p>Airbnb’s use of grids is unrelenting. Notice how they aligned the elements of the footer on the same 3-column groupings as the last row of images. Even the language and currency selectors (in the bottom left) are two columns wide!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7cEczgHjubv-QtdQx-kqFw.png" /><figcaption>Grids help organize the Airbnb footer. Note the “English” and “USD” dropdowns.</figcaption></figure><p>By aligning the majority of our design on a grid and breaking the trend for some elements, we can subconsciously draw a user’s eye. Take the top of the page: <strong>Can you spot the elements that break the grid system?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bu1sh17pgVM3feYWaSWr9g.png" /><figcaption>Where is Airbnb breaking their own grid system?</figcaption></figure><p>You might have noticed that the Airbnb logo and the four links (<em>Become a host, Help, Sign Up, Log In</em>) are all off-the-grid. This is because the navigation is meant to be made visually distinct from the rest of the page.</p><p>Notice anything else, though? This might be a stretch, but hang with me for a second. Take a look at the booking form with the grid overlay:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1GRnf6Hk-JLQlpwuVv42rw.png" /></figure><p>It’s off! Is it an error? A lazy web developer? I doubt it. Maybe I’m giving Airbnb too much credit here, but I would bet that the positioning of the lines between the “Where,” “When,” and “Guests” inputs is intentionally off-grid, shifting your eye to the right towards that lovely “Search” button. With the rest of the site being positioned meticulously on a grid, I can’t imagine that the designers and developers overlooked <em>the search box on the homepage.</em></p><p>Whether you buy that or not, I stand by that there shouldn’t be a strict formula when it comes to grids. Careful bending of the rules for visual balance or emphasis can be a powerful tool.</p><p>Grids emphasize a more general principle of design:</p><h4>Whenever possible, reduce mental strain.</h4><p>Many designers frame good design as reducing the amount of work that a user has to do to understand your product and take the next action. This can take several forms:</p><p><strong>Keep copy concise (versus jargony or text-heavy):</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ABRCz1nqGVQ-WGodtOh1qw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cEaKmopM91PLf0aEcTbLDQ.png" /><figcaption>DigitalOcean uses a clear tagline and an animated GIF. Amazon uses lots of text on their homepage.</figcaption></figure><p><strong>Opinionated design (versus asking users to make decisions):</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SVMSWZ1NH12zBbS-Pri7bw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JxKRmPkf0ic_LfHnxYjf8g.png" /><figcaption>Google Play Music only focuses on signing in. Spotify forces users to distinguish between Spotify Free and Premium.</figcaption></figure><p><strong>Or, taking one huge step forwards:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/845/1*apD1C8jYUc_rp0TdfybgbQ.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lB5uMigPXLFoYZm5oaHg4g.png" /><figcaption>The new version of reCAPTCHA knows if you’re a robot automatically. The old version asked users to transcribe indecipherable text.</figcaption></figure><p>Whatever form mental strain takes in your design, aim to reduce it wherever possible.</p><h3>3. What about color, typography, and illustrations?</h3><p>While layout and organization may seem like more of a science, many elements of design are very clearly artistic. As an amateur designer, I’ve felt that developing opinions about these visual components to design comes with experience. That said, there are a few tricks that I’ve used to squeeze by:</p><h4>When it comes to color, think subliminal.</h4><p>Picking the right color or colors for your design can be hard. As a place to start, think about how color can subliminally affect how your user views your design.</p><p><strong>Contrasting colors can be used to emphasize important components:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VlbbyqIQHImxNRQUJ5xwdg.png" /><figcaption>The MIT Technology Review uses red for their “subscribe” button.</figcaption></figure><p><strong>Commitment to a single color can help build a brand:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4Nn5jLkC6poQ14xYGwS_nQ.png" /><figcaption>Lyft has put pink and purple everywhere in their app and branding.</figcaption></figure><p><strong>Or try to change one:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ep5W06nE_YKL4GIYiZXqrw.png" /><figcaption>Green is a tame and placid color. Perhaps Uber is trying to modify their image?</figcaption></figure><p>Finally, if you’re looking to pick actual hex codes, I’d recommend <a href="https://medium.com/u/2fa5ff90fb">Jeff Hilnbrand</a>’s article <a href="https://medium.com/hh-design/picking-colors-part-1-techniques-4d67b314781d">Picking Colors</a>:</p><p><a href="https://medium.com/hh-design/picking-colors-part-1-techniques-4d67b314781d">Picking Colors</a></p><p>Personally, I don’t trust myself to pick colors quite yet. Often times, I just steal colors I like from other brands or websites. Great artists, yada yada.</p><h4>Typography can be confusing. Don’t get overwhelmed.</h4><p>Often picking the right font can feel like an impossible chore:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qfll9U0gAIIyPjQMjIQl7g.png" /><figcaption>Is Google Fonts mocking me?</figcaption></figure><p>While I tend to pick fonts and font pairs that I like from other designs, there are a few properties to keep in mind:</p><p><strong>Contrast is your friend:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R0-xllLVRMVP4q4TvfvD1g.png" /><figcaption>The Stanford D.School uses an awesome header font that contrasts the rest of the site copy.</figcaption></figure><p><strong>Tone is also crucial. What vibe do your fonts give off?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bLusTJPznQQum85xGD8zmg.png" /><figcaption>Medium’s typography gives its articles gravitas.</figcaption></figure><p><strong>Don’t get too fancy. Clear, legible fonts get your point across:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*r_2zFcrPqhk-Urm_y4ifag.png" /><figcaption>Airbnb used bold sans-serif fonts in it’s latest mobile redesign.</figcaption></figure><p>Again, with typography, don’t stress. Start by noticing what you like, and move from there.</p><h4><strong>When it comes to illustration, there aren’t any shortcuts.</strong></h4><p>To me, all explanations of illustration feel like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*RU58mQ4TMCATcVREQsyPMw.png" /></figure><p>I know there are some brands that use illustration to their advantage, but it can be hard to pin down exactly how it works.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tJB5yM9Aj-dVKeBnqdwhrA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JfAcIHmfhoID8kkKg47YXw.png" /><figcaption>Dropbox and Stripe use very different illustration styles to add life to their design.</figcaption></figure><p>While I don’t have a great answer here (no, stealing other people’s illustrations is not an option), I would recommend reading Scott McCloud’s book, <a href="http://scottmccloud.com/2-print/1-uc/">Understanding Comics</a>, which has a lot of interesting theories about how comics work.</p><p><a href="http://scottmccloud.com/2-print/1-uc/">scottmccloud.com - Understanding Comics</a></p><p>I particularly enjoyed his discussion on level-of-detail. McCloud explains how choice of style can make an illustration more relatable and emotional or more informative.</p><h3>Design is complex. But that doesn’t mean it has to be hard.</h3><p>I’m still a design-toddler, but I manage to get by with a few tools in my belt:</p><ol><li>Appreciating design as the intersection of art, engineering, and people is the first step. Bad design forgoes one of these elements for the other two.</li><li>Clever use of space and grid systems can help you layout elements of your design. Important pieces should be made distinct.</li><li>Once the rest is done, you can worry about picking the right colors, fonts, and imagery for your design. Learn from other designers and find what you like best.</li></ol><p>Hopefully, with these tools, you’ll be able to generate a first draft of whatever design you’re working on. Once you do, share it! There’s no better way to learn than friendly critique; working with others will keep you honest and refine your design.</p><p>Good luck!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a383e20dbfcb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building the Image Grid from Google Photos]]></title>
            <link>https://medium.com/@danrschlosser/building-the-image-grid-from-google-photos-6a09e193c74a?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/6a09e193c74a</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[web-performance]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Fri, 24 Jun 2016 00:58:37 GMT</pubDate>
            <atom:updated>2016-06-24T00:58:37.525Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nc-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<h4>Engineered for fast image loading and smooth scrolling</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*x09ieXFsQD5pbB-TdYXaJA.png" /><figcaption>That was a great milkshake</figcaption></figure><p>In 2015, I decided to take a picture of everything I ate. Every sandwich, every chip, and every square of chocolate. For 365 days, if I ate it, I took a picture of it. When December rolled around, I had over 1,800 pictures with nowhere to put them. I couldn’t upload that many photos to Facebook or Instagram, and I hadn’t found a photo service that I liked enough to put my food photos on.</p><p><a href="https://feeding.schlosser.io">So I built a website.</a></p><p>It turns out, in the course of making a website for viewing 1,800 photos I ran into a bunch of interesting technical challenges, and walked away from the whole thing with a JavaScript library called <a href="https://github.com/schlosser/pig.js">pig.js</a>, an image grid that is <strong>faster</strong>, <strong>more responsive</strong>, and <strong>easier to use </strong>than any other solution I could find. Here’s how I built it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fahBgQgAT4qsLCcj_OU2gg.png" /></figure><h3>First: Why the easy solutions don’t work</h3><p>The most straightforward way to display a collection of images on the web is to show the images in pages of rows and columns, with 3–5 images per row and 20–50 images to a page. It’s tried and true, but not a great solution for my purposes. If I post 1,800 photos in 36 pages, you can be sure that very few people are going to make it past page two or three.</p><p>You might think “A-ha! This is what infinite scrolling is for!” Most websites with lots of content use a simple tactic for simulating an infinitely long page: They display 10–20 entries in a vertical array, and when you scroll to the bottom of the screen they load in 20 more and inject them at the bottom of the screen and let you keep scrolling. Problem solved.</p><p>Well, not quite. I tried this, and it turns out no matter how you load them, two thousand reasonably-sized images on the same website will crash your web browser. The site works great as you scroll for the first minute or two, but as you keep going it will eventually get bloated and freeze. Bummer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zFaYdY4WxErd8Me11jHj0g.png" /></figure><h3>Finding an elegant solution</h3><p>I wanted to design an image grid that displays all two thousand images on one page, without showing more than 50 or so images at a time. To do this, I would need to <em>both load and unload</em> images onto the page, to ensure that a reasonable number of images were on screen at once.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3Io-_SW3J7h53d9GJuzMLA.png" /></figure><p>To accomplish this, I came up with an idea: wherever you are on the page, we should have all images within the viewport loaded, as well as some images immediately above and below the viewport, so they are visible when you scroll.</p><p>For a better user experience, it is helpful to know what direction the user is scrolling and make that buffer larger. If we are scrolling down, for example, we don’t need that many images loaded above the viewport, because they are only needed if the user changes scroll direction. If the user is scrolling down the page, the <em>primary image buffer</em> is below the viewport, and the <em>secondary image buffer </em>is above the viewport.</p><p>Images outside the viewport and outside the buffers do not need to be loaded into the page. As the user scrolls down the page, images above the viewport are removed as more are loaded below. This ensures that we have a relatively constant number of images on screen and a time.</p><p>It’s a clever solution, but not one that comes naturally in HTML and CSS. If we use a traditional “rows and columns” grid, removing a row of images from the DOM would cause the images below to jerk upwards. I thought about a way to cleverly put the right amount of padding above the upper buffer to avoid this problem, but that ended up being a huge headache. To make matters worse, alongside managing loading and unloading I also wanted the image grid to be responsive.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yDr6Xwqizm_C0juluaFaqw.png" /></figure><h3>Enter Google Photos</h3><p>I figured out a solution to this problem while scrolling through my food pictures on Google Photos. The web app choreographs a similar infinite-scroll that I wanted to build, while also allowing images to shift around smartly as you resize the page.</p><p>To figure out how they did it, I spent ten or twenty minutes fooling around in the Chrome inspector, watching as images were loaded and unloaded, and noticing how they did layout. The secret: <strong>CSS transform-based positioning</strong>.</p><h4>Using translate3d for layout</h4><p>The basic layout consists of a bunch of &lt;<em>figure class=”pig-figure”&gt;</em> elements inside a container, with the following CSS:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/583b0d21b940c22fc7a528e019331d43/href">https://medium.com/media/583b0d21b940c22fc7a528e019331d43/href</a></iframe><p>Then, once the library has injected and laid out all the images, the HTML ends up looking like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1f656a077a0299d07c18a006d963d619/href">https://medium.com/media/1f656a077a0299d07c18a006d963d619/href</a></iframe><p>The entire grid is computed in JavaScript, and executed by taking <em>&lt;figure&gt; </em>elements and positioning them within their container exactly using <em>height</em>, <em>width</em>, and <em>translate3d</em>.</p><p>OK, so what’s so cool about this solution?</p><ol><li><strong>Loading and unloading</strong>: Because each &lt;<em>figure&gt;</em> element is absolutely positioned, we can safely remove and add new elements without affecting the position of the others.</li><li><strong>Responsive sizing and layout</strong>: When you resize the window, you can update the <em>width</em>, <em>height</em>, and <em>translate3d</em> properties in the inline styles, and shift images around using CSS transforms.</li></ol><p>So this much I completely ripped from Google Photos (through the Chrome Inspector). I had an idea how the whole thing worked, but the implementation proved tricky.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R_OlwGk15iRT1n_6KtlpWA.png" /></figure><h3>How it works</h3><p>Reverse engineering the Google Photos image grid proved complicated. The grid consists of many rows of images, where each row has the same spacing between images and is perfectly sized to fill the container, but each row might have a different number of images, or a different height. Importantly, within each row, <strong>all of the images are the same height</strong>.</p><p>In order to size each row perfectly, we build up the row image by image, with a maximum desired row height. Because all of our images will share the same height, we can treat them as one combined shape.</p><p>While this would work as-is, it’s actually easier to use a <em>minimum aspect ratio</em> rather than a maximum height. Here’s how:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UjCVcmdoPGz_0PGrsKpIUw.png" /></figure><p>Let’s say the desired maximum row height is 200px. If the row is 1000px wide, that’s a total aspect ratio of 5:1. If we had just one 16:9 image at 100% width, the row would be 1000px * 562.5px. Too tall.</p><p>If we add another image to the row, each would be 500px * 281px. Still too tall.</p><p>We continue adding images onto our row until the aspect ratio of the combined shape exceeds our minimum, 5:1. In the illustrated example, it takes two landscape images, a portrait image, and a final landscape image to create a row with a large enough aspect ratio.</p><p>Then, using the aspect ratio of each image, we can compute each image’s width from its fixed height: For landscape images, their width is 169.5px * (16/9) = 301.3px. For our portrait image: 169.5px * (9/16) = 95.3px.</p><p>Now all that’s left is to update the style attributes on each of our <em>&lt;figure&gt;</em> elements and we’re done.</p><h4>Making it fast</h4><p>My original implementation involved running this entire algorithm every time a scroll event fired, which left me with some serious lag. In order to achieve smooth scroll behavior, I removed as much work from the scroll handler as I could.</p><p>While the selection of photos in view could change on every scroll event, the actual layout of the grid is fixed. Taking advantage of this, I separated the computation of each image size and position and the load/unload logic into two different functions:</p><ol><li><a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L384-L482"><strong><em>_computeLayout</em></strong></a><strong><em> </em></strong>is responsible for creating a huge list of objects, one per image, where each object contains a reference to a DOM element, as well as it’s desired <em>height</em>, <em>width</em>, <em>translateX</em>, and <em>translateY</em> values. I only call this on load and resize, when the layout needs updating.</li><li><a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L485-L587"><strong><em>_doLayout</em></strong></a> takes the latest scroll position and direction, determines the primary and secondary image buffers, and then uses the data structure created in <em>_computeLayout</em> to appropriately hide, show, and position the DOM elements.</li></ol><p>In doing so, I saw a big uptick in scroll performance. This separation of concerns ensures that we’re not computing our layout many times a second.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P2f58ZgLF-jSjEAc5VazrQ.png" /></figure><h3>Making it (even) faster</h3><p>The next step was to make sure that the grid ran well on mobile devices as well as desktops. To do this, I looked at how Medium loads images in their articles, and brought that to my grid.</p><p>Have you ever noticed on a slow internet connection how Medium’s images load in a blurred state and then appear to come into focus? It’s not just a cool effect; it’s also a tactic for reducing page load times.</p><p>They start by loading in a ~20px tall version of the image, blown up to the actual size of the image. Then, they blur that thumbnail, creating the blurred image effect. At the same time, they load the full image, and when it’s ready, they replace one with the other by animating the thumbnail’s opacity to zero. This tactic: loading a placeholder and then loading in the full asset afterwards is called <em>progressive loading.</em></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fjmperez%2Fembed%2Fpreview%2FyYjPER%3Fheight%3D600%26amp%3Bslug-hash%3DyYjPER%26amp%3Bdefault-tabs%3Djs%2Cresult%26amp%3Bhost%3Dhttp%253A%252F%252Fcodepen.io%26amp%3Bembed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2Fjmperez%2Fpen%2FyYjPER&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F390060.yYjPER.small.22361c06-ca6c-4c74-a0f7-6ee78d5573af.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/99f8a97787c8169b708157120c00d66d/href">https://medium.com/media/99f8a97787c8169b708157120c00d66d/href</a></iframe><p>José M. Pérez wrote a <a href="https://jmperezperez.com/medium-image-progressive-loading-placeholder/">great blog post</a> detailing the entire process, and wrote a super useful <a href="http://codepen.io/jmperez/pen/yYjPER">Codepen</a> that both shows off the effect and demonstrates how to use <em>filter:blur()</em> in CSS rather than a <em>&lt;canvas&gt;</em>-based solution.</p><p>Medium’s progressive image loading tactic has an extra added benefit: Because the full image is loaded in JavaScript, I can decide what size image to load on-the-fly. On small devices, load a 240p image, and on tablets load a 480p image, etc. This ensures that the images both looks good and loads quickly on all devices. This is especially important for my grid, where I’m loading lots of images all at once. Every speed increase matters when it’s multiplied 2000 times.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tz7kdfhO_tLlfdAR6b9bLg.png" /><figcaption>Progressive image loading in action</figcaption></figure><h3>Recap: Performance-first design</h3><p>I believe that on the web, performance can be one of the biggest components of good design and storytelling. With pig.js, I put speed as my one and only concern for the library. It was a lengthly process, but I ended up with four core tactics for making the grid smooth:</p><ol><li>Dynamically load and unload images above and below the viewport to reduce the number of elements on the page at once.</li><li>Make the primary and secondary image buffer different sizes, because we are more likely to load images in the direction we were already scrolling.</li><li>Separating out layout computation and DOM manipulation into two different functions: <em>_computeLayout</em> and _<em>doLayout</em>, only running the former on load and resize, drastically reducing the work we have to do on scroll.</li><li>Implement a responsive version of Medium’s progressive image loading, making on-the-fly decisions for what size image to load.</li></ol><h3>The end result? It’s pretty freaking fast</h3><p>If you don’t believe me, head over to <a href="https://feeding.schlosser.io">my demo page</a>. If you want to take it for a spin, <a href="https://github.com/schlosser/pig.js/">fork or clone me on GitHub</a>.</p><p>I’ve also over-commented the <a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js">JavaScript source</a> if you’re interested in diving into the details of how it works. There‘s a lot in the source that I wasn’t able to include here: organizing the <a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L589-L627">scroll</a> &amp; <a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L4-L64">resize</a> handlers, doing <a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L430-L478">aspect ratio math</a> while accounting for the space between images, <a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L313-L329">managing CSS transitions</a> that probably won’t complete when they’re supposed to, and <a href="https://github.com/schlosser/pig.js/blob/master/src/pig.js#L508-L544">the best in-source diagram</a> I could muster. Fun stuff :)</p><p>My final result was a library with no dependencies and no feature-bloat. For a pure display of images, it’s the fastest thing I’ve used. I hope you enjoy it!</p><p><em>Have a question or comment? Can you think of anything that might make this run even faster? I’d </em><strong><em>love</em></strong><em> to hear from you! Leave a response here, or even better: an issue/PR on </em><a href="https://github.com/schlosser/pig.js"><em>GitHub</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6a09e193c74a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hackcon: The Story So Far]]></title>
            <link>https://medium.com/major-league-hacking/hackcon-the-story-so-far-682981dfac21?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/682981dfac21</guid>
            <category><![CDATA[hackathons]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Tue, 19 Apr 2016 20:13:13 GMT</pubDate>
            <atom:updated>2017-03-22T17:52:48.199Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Oq9S878lbTCJxJgdnPmvTg.jpeg" /></figure><p>It’s amazing how far the hackathon community has come in just a few years. Back in February 2014, when Hackcon first kicked off in the cramped but homey AlleyNYC, the hackathon world looked very different than now. <a href="https://mlh.io/">Major League Hacking</a> had been founded just a few months prior, and the hackathon organizer community was still in its infancy.</p><p>Hackathons were popping up all across the country. Attendees were returning from larger hackathons and were starting to organize similar events at their own school for their own communities. Passionate organizers from all over worked to improve their own events, but were unable share with each other or differentiate their events. Enter: Hackcon.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bNBupW0Ed8rb2R1xlWD0FQ.png" /><figcaption>Orange on brown, ouch.</figcaption></figure><h3>The First Hackcon</h3><p>The first Hackcon flipped our community upside-down. The Hackcon team realized that if they put 100 organizers in a room together, then the stories, discussions, and debates that would arise would completely change those organizers and the events they run.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JQdQM-S752tZgITXg5qobw.jpeg" /></figure><p>With the help of my co-organizers Chris Yan and Dina Lamdany, I wrote <a href="https://www.youtube.com/watch?v=3L68tkWIc30&amp;list=PLPDgudJ_VDUdqhQldG7SqXGxaj-FiLGmP&amp;index=24&amp;nohtml5=False">a talk</a> about <a href="http://devfe.st/">DevFest</a>, its values, and why ADI, the club behind DevFest, structured our event around learning, community, and creating a welcoming experience for first-time hackers. In sharing the mission of ADI at Hackcon, I found myself more strongly connected with the organizer community. For many speakers (myself included), Hackcon was their first real public speaking experience. There was a raw energy standing up in front of the room, an energy created by a group of 100 students all excited about the same thing. It’s fun to <a href="https://www.youtube.com/playlist?list=PLPDgudJ_VDUdqhQldG7SqXGxaj-FiLGmP">go back and watch</a> how excited we all were to be talking on stage, finally able to share our enthusiasm with people who knew exactly how we felt.</p><p>Hackcon provided a space for organizers to share stories and work to improve hackathons. It was a platform for first-time organizers to learn about the nuances of running a successful event and gave veterans a new way of looking at their own events.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kJgV6eW-IZkhEHRzVrdFmw.jpeg" /></figure><h3>Hackcon II, III, &amp; EU</h3><p>After the first Hackcon, the inter-hackathon community exploded. The Hackcon Facebook group became a resource for organizers, and MLH curated and packaged content from Hackcon, making it accessible to future organizers. The <a href="https://www.facebook.com/groups/hackathonhackers/">Hackathon Hackers</a> Facebook page was founded in June 2014, with the mission of bringing the entire hackathon community closer together. I remember being inspired by how Hackcon and the organizers I met there had changed how I thought about DevFest, and gladly accepted an invitation to join the planning team for Hackcon II.</p><p>If the first Hackcon was about creating a network of student organizers, then Hackcon II was about sustaining it. Set in <a href="http://www.livestream.nyc/">Livestream Public</a> in Brooklyn, NY, this Hackcon embraced a more discussion-focused format, with selected talks and a continued focus on community events. Talks focused more on how we can work on the problems hackathon organizers face. Discussions dove deep into unsolved issues, like how to make events more inclusive, how to deal with crisis situations, and how to build hacker communities.</p><p>As hackathons spread internationally, so did Hackcon. That August, <a href="http://hackcon.eu/">Hackcon EU</a> was the first Hackcon outside the United States. It brought organizers from across Europe and the world together to discuss how running a hackathon is a unique challenge outside of North America.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Gs9MW6zKJUiB69K6BgHubg.jpeg" /><figcaption>A discussion circle at Hackcon III.</figcaption></figure><p>As the team behind Hackcon, we knew that our most important job was to create spaces that would stir conversation between attendees. That focus on conversation and community building became the entire thesis of Hackcon III, which had unconference-style discussion groups that were formed on the spot, led by attendees and organizers alike. Held in July at <a href="http://officesnapshots.com/2015/04/06/github-san-francisco-headquarters/">GitHub HQ</a> in San Francisco, Hackcon III established Hackcon as an annual summer event.</p><p>Hackcon III was in many ways a changing of the guard. Most of the speakers at the first Hackcon were seniors or recent grads, and it was clear that a new wave of organizers was growing. It was amazing to meet so many new and first-time organizers last summer, and hear about how they saw their events in a different light than the organizers just a year or two older than them. With Hackcon IV, our team wants to put the spotlight directly on them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1ecfMBt8SVjDs9MB9N24rA.jpeg" /></figure><h3>Hackcon IV: Campground Edition</h3><p><a href="http://hackcon.io/">Hackcon IV</a> will be radically different from the Hackcons of years past. First and most noticeably, it’s being held in Estes Park, CO, on a beautiful campground, with plenty of natural beauty all around. By removing attendees from the normal rush of a city setting, we will give them space to engage more meaningfully with each other, and hold even more impromptu conversations.</p><p>We’re also looking to empower even more first-time speakers at Hackcon IV. For everyone who applied to speak, we’ll be offering consulting on how to structure and deliver their talks. I hope that all of Hackcon IV’s speakers have the same experience I had in 2014. Speaking is both incredibly scary and tremendously empowering. It both gave me confidence in my work at Columbia and started conversations I could never have had otherwise.</p><p>Finally, because we won’t be hosting <a href="http://hackcon.io/">Hackcon IV</a> in a city anymore, we’re upping our game when it comes to community bonding events. While we don’t want to spoil the surprise, it’s safe to say we’ll be taking full advantage of our time out in nature.</p><p>It has been a huge honor to help think about how the next generation of hackathon organizers will change our community and the events we all know and love. I can’t wait for everyone to share in what the team has come up with this year. It’s going to be great!</p><p><em>All photos courtesy of MLH.</em></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2F30409e%3Fas_embed%3Dtrue&amp;dntp=1&amp;url=https%3A%2F%2Fupscri.be%2F30409e&amp;image=https%3A%2F%2Fe.enpose.co%2F%3Fkey%3DdRXnS9Gplk%26w%3D700%26h%3D425%26url%3Dhttps%253A%252F%252Fupscri.be%252F30409e%252F%253Fenpose&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/0485845899c5cc6e3ee55675ee779dc5/href">https://medium.com/media/0485845899c5cc6e3ee55675ee779dc5/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=682981dfac21" width="1" height="1" alt=""><hr><p><a href="https://medium.com/major-league-hacking/hackcon-the-story-so-far-682981dfac21">Hackcon: The Story So Far</a> was originally published in <a href="https://medium.com/major-league-hacking">Major League Hacking</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Polish Checklist for Web Developers]]></title>
            <link>https://medium.com/@danrschlosser/the-polish-checklist-for-web-developers-5b190b8b6851?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/5b190b8b6851</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Mon, 28 Mar 2016 20:58:55 GMT</pubDate>
            <atom:updated>2016-04-15T02:28:36.618Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3HTyHDAXdnaccPHSc7ZZbA.png" /></figure><p>It’s not hard to tell a good website from a great website. You can feel it. While most designers consider proper word choice, typography, and spacing, there are some details that are often forgotten. This is a list of tweaks to consider whenever you build a website. Put together, these tips can go a long way towards making a website feel polished.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9nwzThJgLePNbh4PYtsrKg.jpeg" /></figure><h3>I. Use Color to Extend Your Brand</h3><p>When used correctly, color can make your site more immersive and help you better communicate your brand.</p><h4>Text selection styling</h4><p><em>Read more on </em><a href="https://css-tricks.com/almanac/selectors/s/selection/"><em>CSS Tricks</em></a><em>.</em></p><p>One easy way to add a little extra punch to your website is setting a custom selection color, changing the stock default semi-opaque blue background when you highlight text to something more exciting. Here’s how:</p><pre>::selection {<br>    background-color: <strong>#FFDD33</strong>;<br>    color: <strong>#222222</strong>;<br>}</pre><pre>::-moz-selection {<br>    background-color: <strong>#FFDD33</strong>;<br>    color: <strong>#222222</strong>;<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w9KlRHcGwZEaumYaDpyN1w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DqnGyh_RGVHCOQJDNRNP3g.png" /><figcaption><strong>Left</strong>: The default blue text selection on <a href="https://www.spotify.com">www.spotify.com</a>. <strong>Right</strong>: Yellow selection color on <a href="http://worldaftercapital.org/">worldaftercapital.org</a>.</figcaption></figure><h4>Chrome Theme Color</h4><p><em>Read more on </em><a href="https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color"><em>Google Developers</em></a><em>.</em></p><p>Chrome for Android allows developers to change the color of the URL box and status bar to fit our website, by changing the <em>theme color</em>. It can be set to any hex value using one simple meta tag:</p><pre>&lt;meta <strong>name</strong>=&quot;theme-color&quot; <strong>content</strong>=&quot;#000000&quot;&gt;</pre><p>For colorful or dark-themed websites in particular, changing the theme color of a site can make it more immersive.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uwR5ukMQ5NSB0x376HDJbA.png" /><figcaption><strong>Left</strong>: The default white URL box on <a href="https://www.callofduty.com/">www.callofduty.com</a>. <strong>Right</strong>: A subtle black URL box on <a href="http://arstechnica.com">arstechnica.com</a>.</figcaption></figure><h4>Overscroll Color</h4><p>On some web browsers, like Chrome and Safari for Mac, users can use inertial scrolling to scroll beyond the top of the page and below the bottom of the page, a behavior called <em>overscrolling</em>. This behavior is not a web standard, rather it is defined independently by each browser that implements it. Most browsers do now allow developers to customize this behavior at all but some do (Chrome and Safari for Mac, for example). To control the overscroll color of your page, simply set the background color of the body tag:</p><pre>body {<br>    background-color: <strong>#3399FF</strong>;<br>}</pre><p>Especially for simple designs, with large blocks of solid color, the correct overflow color can help emphasize the hero content on your site.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lo9vaf-2HD9C-ZEkB4hN9g.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KShv1jVvtIZbq1kI1xrQBw.gif" /><figcaption><strong>Left:</strong> The default white overscroll color on <a href="http://danrschlosser.github.io/substituteteacher.js/">danrschlosser.github.io/substituteteacher.js/</a>. <strong>Right: </strong>Blue overscroll on <a href="https://minimill.co">minimill.co</a>.</figcaption></figure><p>Another option would be to disable overscrolling entirely using <a href="http://stackoverflow.com/questions/12046315/prevent-overscrolling-of-web-page">CSS</a> or <a href="https://github.com/luster-io/prevent-overscroll">JavaScript</a>. I wouldn’t recommend it because it can be confusing, but it isn’t a bad option.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*r5MZqPW09xYBvsNSlfgXhg.jpeg" /></figure><h3>II. Rewarding Interaction</h3><p>On a web page, interaction is dialogue with your users. Here are some simple ways to make your site more conversational:</p><h4>Hover, focus, active, and tap states</h4><p><em>Read more on </em><a href="https://developers.google.com/web/fundamentals/design-and-ui/input/touch/active-states?hl=en"><em>Google Developers</em></a><em>.</em></p><p>There are many ways to interact with an element, and you may want to react to these interactions differently. Elements can be hovered over (using a mouse), focused (using the tab key on your keyboard or a screenreader), made active (when pressed), or tapped (on a touch device). You can use pseudo-class selectors to style these states:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*Y-vt2PFHzfTTuaVSc5UjTQ.png" /><figcaption>Default, hover, focus, and active states, from <a href="https://developers.google.com/web/fundamentals/design-and-ui/input/touch/active-states?hl=en#pseudo-classes-for-touch-states">Google Developers</a>.</figcaption></figure><pre>.btn {<br>  background-color:<strong> #0087F7</strong><br>}<br>.btn:hover {<br>  background-color: <strong>#006DDE</strong><br>}<br>.btn:focus {<br>  background-color: <strong>#0053C4</strong><br>}<br>.btn:active {<br>  background-color: <strong>#0039AA</strong><br>}</pre><p>On devices that allow this to be overridden, there is a highlight color that appears when you tap the element. Many choose to hide it entirely:</p><pre>.btn {<br>    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*67VsXlv5_xg14edGIT5cWw.png" /><figcaption><strong>Left:</strong> Unaltered -webkit-tap-highlight-color on <a href="https://minimill.co.">https://minimill.co.</a> <strong>Right:</strong> The same site with a transparent highlight color.</figcaption></figure><h4>Transitions</h4><p><em>Read more on </em><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions"><em>Mozilla Developer Network</em></a><em>.</em></p><p>Once you have created different visual states for hover, focus, and active elements, it’s important to consider transitioning between these states. The most basic CSS transition syntax is as follows:</p><pre>transition: [delay] [easing] [property];</pre><p>For example, to put a subtle transition on all properties, you would include:</p><pre>transition: 0.3s ease all;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/733/1*x-VS0bMK4tBs9h4Xe9-MPA.gif" /><figcaption>Three buttons with different hover states and no transitions.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/733/1*mblMR2954OhThkOzLK6oMQ.gif" /><figcaption>The same buttons with “transition: 0.3s ease all;”.</figcaption></figure><h4>FastClick</h4><p><em>Read more on </em><a href="https://ftlabs.github.io/fastclick/"><em>FastClick</em></a><em>.</em></p><p>Making your website fast and reactive on mobile devices is extremely important. One way to make every part of your site feel a little faster is to use <a href="https://ftlabs.github.io/fastclick/">FastClick,</a> a JavaScript library that removes a 300ms delay between the physical touch of the screen and a click event being registered. Many touch browsers insert this delay in order to determine whether or not a touch is a tap, drag, or long press. For most of your site however, this won’t matter, and you can safely remove it.</p><p>Implementing FastClick is quick and easy:</p><pre>&lt;script <strong>src</strong>=<strong>&#39;</strong>/path/to/fastclick.js&#39;&gt;&lt;/script&gt;<br>&lt;script&gt;<br>    <strong>window</strong>.addEventListener(&#39;load&#39;, <strong>function</strong>() {<br>        <strong>new </strong>FastClick(<strong>document</strong>.body);<br>    }, <strong>false</strong>);<br>&lt;/script&gt;</pre><p><strong>Edit:</strong> <br>On some browsers, it is also possible to remove this delay by disabling zooming using meta tags, although this behavior is new and may not be reliable.</p><pre>&lt;meta name=”viewport” content=”width=device-width, ...&quot;&gt; <br>&lt;!-- OR --&gt;<br>&lt;meta name=”viewport” content=”user-scalable=no, ...&quot;&gt;</pre><p>Both using FastClick and meta tags disable double-tap to zoom, which <a href="https://medium.com/@achalv/a-short-history-of-the-350ms-tap-delay-ae18e61cebf5#.6sm7mja99">may be an accessibility concern</a>. Another option is to use the <a href="http://caniuse.com/#feat=css-touch-action">currently not well-supported</a> <a href="https://www.w3.org/TR/pointerevents/#the-touch-action-css-property">touch-action</a> property:</p><pre>.btn {<br>    touch-action: none;<br>}</pre><p><em>Thanks to </em><a href="https://medium.com/u/72f4bf13690e"><em>Chen Ye</em></a><em> for this note!</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vd3kxPqA9BsX5B92qYWB8w.jpeg" /></figure><h3>III. Keeping Consistent</h3><p>There’s nothing more embarrassing than having your site look different on different devices. Here are some tips to make sure your design is consistent across browsers and screen sizes:</p><h4>CSS Resets</h4><p><em>Read more on </em><a href="http://meyerweb.com/eric/tools/css/reset/"><em>Meyerweb</em></a><em>.</em></p><p>Most browsers include a set of default styles (font size, margins, input appearance, etc) that are applied to web pages that don’t override them. With a <em>CSS reset</em>, you can override these default styles, giving you the same base set of element styles to work from, no matter the browser.</p><p>The most popular CSS reset is <a href="http://meyerweb.com/eric/tools/css/reset/">Eric Meyer’s Reset CSS</a>. It’s short and sweet, and will handle the vast majority of browser defaults.</p><p><strong>Edit:<br></strong>Another great option is to use <a href="http://necolas.github.io/normalize.css/">Normalize.css</a>, which aims to “Preserve useful browser defaults” and make them the same in all browsers, rather than unsetting all styles like CSS resets do. Read more about the difference <a href="http://nicolasgallagher.com/about-normalize-css/">here</a>.</p><p><em>Thanks </em><a href="https://medium.com/u/19c90ddd8b8f"><em>Stefano Contiero</em></a><em> for the suggestion!</em></p><h4>Form Styles</h4><p><em>Read more on </em><a href="https://developers.google.com/web/fundamentals/design-and-ui/input/touch/active-states?hl=en"><em>Google Developers</em></a><em>.</em></p><p>Eric Meyer’s Reset CSS doesn’t cover everything however. There’s a wide variety of default styles that web browsers add to form inputs and buttons, which can be challenging to compensate for.</p><p>For example, it’s pretty rough when you think your form looks good and then iOS’s idiosyncratic default stylesheet messes that up:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*DqUTuZQsk7BNV5mzt1EfQw.jpeg" /><figcaption><strong>Left:</strong> A simple form on a desktop browser. <strong>Right:</strong> The same webpage on Safari for iOS.</figcaption></figure><p>There are a few ways to deal with these form issues. Some developers use yet another CSS reset, like <a href="https://gist.github.com/anthonyshort/552543">this one</a>, or <a href="http://codepen.io/terkel/pen/dvejH">this one</a>, or <a href="https://css-tricks.com/forums/topic/a-reset-for-forms/">this one</a>. Others feel that these resets are too broad, and aren’t a good idea, opting to test their website on different devices and do one-off bug fixes. Either way, the goal is the same: your forms should look the same on all devices.</p><h3>Conclusion</h3><p>Hope you found something new to think about for your next site! For your reference, here’s the TL;DR:</p><p><strong>Use Color to Extend Your Brand</strong></p><ul><li>Text selection styling</li><li>Chrome theme color</li><li>Overscroll color</li></ul><p><strong>Rewarding Interaction</strong></p><ul><li>Hover, focus, active, and tap</li><li>Transitions</li><li>FastClick</li></ul><p><strong>Keeping Consistent</strong></p><ul><li>CSS resets</li><li>Reset form styles</li></ul><p>Did I miss anything? Have a good resource to share? Post a response here or let me know at <a href="http://twitter.com/danrschlosser">@danrschlosser</a> on Twitter.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5b190b8b6851" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Respect Yourself! Use Gulp.]]></title>
            <link>https://medium.com/@danrschlosser/respect-yourself-use-gulp-bb1d17b1640c?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/bb1d17b1640c</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[gulp]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Sun, 10 Jan 2016 17:50:24 GMT</pubDate>
            <atom:updated>2016-01-11T00:51:10.777Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nc-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L55QzFxZI4zZ22_KyPhGvg.jpeg" /></figure><h4><em>Making websites just got a lot easier.</em></h4><p>When it comes to web development, there’s a lot to learn.</p><p>Maybe someone has told you to use <a href="http://css-snippets.com/browser-prefix/">vendor prefixes</a> for <a href="https://www.smashingmagazine.com/2010/06/the-principles-of-cross-browser-css-coding/">cross-browser compatibility</a>, to <a href="https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/optimize-encoding-and-transfer?hl=en">minify your code</a> to decrease load time, or to use a linter so that your <a href="http://csslint.net/">CSS</a> and <a href="http://jshint.com/">JavaScript</a> follows best practices. Maybe someone has ranted about how <a href="http://www.webdesignerdepot.com/2014/08/5-reasons-you-should-be-using-sass-today/">using SCSS is better than using CSS</a>, or about why <a href="http://www.creativebloq.com/web-design/templating-engines-9134396">templating engines are all the rage right now</a>. Or maybe this is the first you’re hearing of it, and you have no idea what setup to use.</p><p><strong>Trying to figure out “the right way” can be intimidating. </strong>Respect your sanity and your time: Gulp will save both.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FH12a2fX61aHOn39pff9vA.jpeg" /></figure><p>Gulp is a program that you can use to automate everything about developing on your project. It’s called a <em>build system</em>, <em>build tool</em>, or <em>task runner</em>. Instead of having to memorize eight obscure commands to get your project running, Gulp lets you use one. Gulp’s philosophy is that it should be easy to combine a bunch of programs together into one unified task.</p><blockquote>Gulp does everything short of writing your code for you.</blockquote><p>It’s amazing! Since I’ve learned to use it my productivity has skyrocketed, and so has my code quality.</p><p>So how does it work? The trick with Gulp is that it does very little on its own. All its power comes from the massive <a href="http://gulpjs.com/plugins/">library of plugins</a> that can be chained together with relative ease, using configurations in a file called “Gulpfile.js”. Let me give you an example:</p><p>When <a href="https://medium.com/u/2fa5ff90fb">Jeff Hilnbrand</a> and I started <a href="https://minimill.co">Minimill</a> together I knew that we’d need a solid web workflow to be efficient and consistent, and so I built an <a href="https://github.com/minimill/project-template">open source project template</a> that uses Gulp. Our Gulpfile allows us to:</p><ul><li>Install the project in just <a href="https://github.com/minimill/project-template#developing">three commands</a>.</li><li>Use <a href="http://handlebarsjs.com/">Handlebars.js</a> to keep our HTML organized into templates and partials.</li><li>Use <a href="http://sass-lang.com/">SCSS</a> to keep our CSS organized into logical pieces.</li><li>Use <a href="https://css-tricks.com/autoprefixer/">Autoprefixer</a> to automatically insert browser prefixes where necessary to handle cross browser compatibility.</li><li>Use <a href="https://www.browsersync.io/">Browsersync</a> to automatically launch a development version of our website, reload the page whenever we change the HTML, and inject changes to CSS, JavaScript, and images with needing to reload.</li><li>Use <a href="https://github.com/kangax/html-minifier">HTML Minifier</a>, <a href="https://github.com/ben-eb/cssnano">CSSNano</a>, <a href="https://github.com/mishoo/UglifyJS">UglifyJS</a>, and <a href="https://github.com/imagemin/imagemin">ImageMin</a> to compress and optimize our HTML, CSS, JavaScript, and images, respectively.</li><li>Use <a href="https://github.com/brigade/scss-lint">SCSS-Lint</a>, <a href="http://jshint.com/">JSHint</a>, and <a href="http://jscs.info/">JSCS</a> to perform <a href="https://en.wikipedia.org/wiki/Lint_(software)">linting</a> and style checking on our SCSS and JavaScript files.</li></ul><p>All with one command from terminal:</p><pre>gulp serve</pre><p>It’s hard to describe how empowering Gulp can be to those who haven’t tried it. It takes all of the hassle, stress and confusion away from web development, letting you harness the power of its plugin library without worrying about how to use each individual program. With a <em>stream</em>lined build process and more logical Gulpfile syntax, it gives build tools a major usability facelift.</p><h3>Get started now!</h3><p>Sold? Drop what you’re doing and try out Gulp. You’ll thank yourself later for all the time you’ve saved. Here’s how:</p><ul><li><strong>Clone my </strong><a href="https://github.com/minimill/project-template"><strong>project template</strong></a>, and mess around with it! Follow the installation instructions in the README file and see what it’s like. If you have any problems, feel free to <a href="https://twitter.com/danrschlosser">tweet at me</a> or <a href="https://github.com/minimill/project-template/issues/new">file an issue</a>.</li><li><strong>Try </strong><a href="https://travismaynard.com/writing/getting-started-with-gulp"><strong>this tutorial</strong></a><strong> </strong>to get started with Gulp. It’s easy to follow and doesn’t skip any steps.</li><li><strong>Start from scratch</strong> using Gulp’s <a href="https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md">4-step installation guide</a> and then install whatever <a href="http://gulpjs.com/plugins/">plugins</a> catch your fancy.</li></ul><h3>Alternatives to Gulp</h3><p>There have been plenty of build tools before Gulp that may be better suited to your project’s needs. Here are two popular alternatives (and why you might choose Gulp instead):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/647/1*lnErdJzJZo9X2HsqKV-lAg.gif" /><figcaption>Make doesn’t have a logo, but if it did, it would look something like this.</figcaption></figure><h4><a href="https://www.gnu.org/software/make/">Make</a></h4><p>The oldest build tool that’s still in active use today is Make, a program that comes preinstalled on Linux and Mac OSX. Make is built for projects that compile in pieces, especially C and C++ projects. In your Makefile, you create a tree of dependencies and write out bash commands to build each file from its parts. If any of a file’s dependencies are modified, Make knows to run only the commands necessary to rebuild the final product from the changed files.</p><p>Make has no concept of a “Make plugin” because all it does is run bash commands, so anything you could do from your terminal you can do from Make.</p><p>It’s a popular choice for many developers and an important tool to learn. But if you’re working on a web project, Gulp makes it easier to perform web development-specific tasks.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aWU9xINZAgFKHFmI3_R4FA.jpeg" /></figure><h4><a href="http://gruntjs.com/">Grunt</a></h4><p>The closer relative to Gulp is Grunt, a build tool that popularized a plugin-based system. Unlike Gulp, Grunt’s plugins are designed around commonly-used tasks, each one configured in the Gruntfile.</p><p>Gulp was designed to alleviate many of the aggravations associated with Grunt. For starters, Gulp uses <em>Node.js streams</em> to connect each plugin to the next. This means that tasks run faster on Gulp because streams remove the need to create temporary files at each step of the build process. Gulp’s “code over configuration” philosophy makes Gulpfiles more intuitive than Gruntfiles. Instead of writing lines and lines of configurations (as is the standard for Gruntfiles), Gulp will have you creating tasks using the plugins as building blocks, streaming one plugin into the next. For many, it’s a <a href="https://medium.com/@preslavrachev/gulp-vs-grunt-why-one-why-the-other-f5d3b398edc4#.6oycmkvez">matter</a> of <a href="http://www.hongkiat.com/blog/gulp-vs-grunt/">preference</a>, but if you’re picking your first build tool, Gulp is the way to go.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bb1d17b1640c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Don’t Think Different]]></title>
            <link>https://medium.com/@danrschlosser/don-t-think-different-99888fe48a9f?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/99888fe48a9f</guid>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[hackcon]]></category>
            <category><![CDATA[hackathons]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Mon, 27 Jul 2015 16:00:32 GMT</pubDate>
            <atom:updated>2015-07-27T19:16:50.659Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nc-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<h4>For hackathons, differentiation isn’t the goal</h4><p>I spent last weekend at <a href="http://hackcon.io">Hackcon</a>, the hackathon organizers conference. On Sunday, I was tasked with taking notes for a workshop entitled “Being Different,” which spun out from <a href="http://twitter.com/jhilmd">Jeff Hilnbrand</a>’s talk on the same subject. Instead of publishing my messy notes, I’m publishing a summary of our discussion, and some points I didn’t get to make day of.</p><h3>Dan Schlosser on Twitter</h3><p>&quot;We&#39;re just changing the metadata of our hackathons: title, location&quot; @jhilmd of @bitcmp #hackcon</p><p>The general zeitgeist going into the “Being Different” Hackcon workshop was that hackathons are all pretty similar: 24–48 hours, sponsors, prizes, apps, food, caffeine, and probably a midnight surprise. Each event might have it’s own little spin, but for the most part we were all working off the same model. This model, while tried and true, has several problems in it, which prompted our group to think about how to change it. The core of our discussion centered around two questions:</p><h3>1. Why are hackathons so similar?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*x0P1Gq6LVny4h_XdmS3kPQ.png" /><figcaption>Upcoming Hackathons in North America</figcaption></figure><p>At first, the answer seemed to be simple: <em>The model works</em>.</p><p>Hackathons haven’t changed drastically since the first generation of student hackathons (<a href="http://hackny.org">hackNY</a> and <a href="http://pennapps.org">PennApps</a>) largely because these events were so successful. In our discussion, many organizers recalled experiences of attending a hackathon early on in college, and seeking to bring the event back to their schools. Hackathons have an inspirational quality that makes attendees want to throw hackathons at their own schools. The answer is simple: organizers think hackathons are pretty much fine as they are. Problem solved, right?</p><p>Not quite. Hackathon organizers aren’t blind. They see room for improvement and growth in the hackathon model, but there are other factors at play that make organizers resistant to change. Here are a few justifications that were made for the similarities between hackathons:</p><ul><li>Drastically different events might make hackers from other schools less likely to attend.</li><li>Changing your event can backfire. (One organizer told a story about how hackers complained when they threw a hackathon and didn’t invite sponsor representatives into the hacking space.)</li><li>There’s no reason to differentiate because our local communities have not been exposed to hackathons, so they don’t realize that the event is the same as one from another school.</li></ul><p>While these concerns may seem justified at first, they have the same logical flaw. They assume differentiation for the sake of differentiation, rather than differentiation for some larger purpose. Finding that larger purpose became the second question.</p><h3>2. Why should hackathons differentiate?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZMyhould5lT1NiMjMSC-yA.jpeg" /><figcaption>A Hackcon discussion circle</figcaption></figure><p>In my opinion, this was really the wrong question to ask. For the hackathon community, differentiation shouldn’t be a goal. We shouldn’t be fighting over attendees; there are way too many students eager to attend hackathons for events to feel the need to compete. No organizers should elect to arbitrarily change their event to stand out in the crowd.</p><p>In our discussion, we discovered that many of us hadn’t thought carefully about <em>why</em> we were organizing hackathons in the first place. Without thinking through some basic motivations, the events become nothing more than copies of each other with slight variations. Throwing a good hackathon doesn’t mean looking for ways to differentiate, it means taking a step back an evaluating what the community needs.</p><h4>First, find your audience and get to know them.</h4><p>Are you hosting a hackathon for first timers? For burnt out veterans? For entrepreneurs? For designers? Depending on your audience, you should make different decisions about how long your event is, whether or not you have prizes, etc. In our discussion, many of our disagreements stemmed from the fact that we were organizing events for different kinds of people.</p><h4>Make sure you know your scope.</h4><p>Hackathons change lives. They create Computer Science majors, they make software engineers, and they can also do the reverse. A single bad experience at a hackathon can color someone’s view hackathons and the tech industry as a whole.</p><p>Many organizers had the attitude that by bringing the traditional hackathon model to their school, they were making an exclusively positive impact on their community. However, without addressing issues of inclusivity, health, and intimidation that come with that model, an organizer could unknowingly do great harm as well.</p><h4>Finally, have a vision and a value proposition.</h4><p>What will attendees get out of your event? What will keep thing there for the duration? <em>What do you want to achieve? </em>Way too often hackathon organizers get so caught up in planning that they lose track of any vision grander than hosting a hackathon. By solidifying a value proposition for your attendees, you can ensure that they leave the event satisfied.</p><h3>Some examples</h3><p>Here are examples that were brought up of events that differentiate for the right reasons.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*QUnIZBorQijOzvNmQT8jYg.png" /></figure><h4>hackNY</h4><p>As <a href="https://twitter.com/shyruparel">Shy Ruparel</a> will proudly tell you, <a href="http://hackny.org">hackNY</a> has remained relatively the same for the past five years. Despite this, hackNY remains one of best hackathons out there. It doesn’t have the best prizes, or food, or <em>anything</em> really. The hackNY team has crafted the right event for those that attend it. It goes to show that being different isn’t always the solution. Execution on the basics goes a long way, especially at a time where hackathons gimmicks are all too common.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u7Uxo3-ldqFACfp3BoA0vg.png" /></figure><h4>DevFest</h4><p>Three years ago, <a href="http://devfe.st">DevFest</a> was a week long hackathon that intended to give participants the time they needed to build high quality products rather than basic hacks. Not a bad idea at all, but it was a bad fit for the Columbia community. With the Computer Science major ballooning in size, there was an influx of inexperienced programmers on Columbia’s campus. In 2014, <a href="https://adicu.com">ADI</a> pivoted <a href="http://devfe">DevFest</a> to focus purely on education, moving the hackathon to the last day of the week, allowing for the rest to be spent on workshops. This refocus made the event take off, allowing ADI to reach hundreds of students that would have otherwise felt unqualified to attend.</p><h3>Building a better hackathon</h3><p>My biggest realization in this discussion was that when we talk about improving hackathons, “different” is a red herring. So was Jeff wrong to say that we need more differentiation in hackathons? No. We shouldn’t aim to be the best in some category, rather we should aim to be the best event for our attendees. There are too many ways to do “different” wrong to allow that to stand as a goal strive for. Instead, lets focus on a more straightforward approach: finding an audience and serving them. We need hackathons to change, but we definitely need them to change for the right reasons.</p><p>Too often, I realized, we argue about how hackathons should change or what they should be, without realizing, that not all hackathons serve the same purpose. Computer Science communities differ greatly between schools, and so it’s only natural that hackathons should bend to accommodate them. If organizers are upfront and transparent about their values when organizing an event, we can hold them accountable for not taking the hackathon model for granted.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CLpXwea_m4SviUJ4TV06WA.jpeg" /><figcaption>The HackCon crew</figcaption></figure><h4>Have a Hackcon story?</h4><p><em>Did you have a memorable experience at Hackcon? Write about it in a response to this post, I’d love to hear stories from conversations I missed out on.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=99888fe48a9f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PSA: How to Unlink Your
LinkedIn Address Book]]></title>
            <link>https://medium.com/@danrschlosser/psa-how-to-unlink-your-linkedin-address-book-a6f115185164?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/a6f115185164</guid>
            <category><![CDATA[linkedin]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[ux]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Fri, 05 Jun 2015 18:36:17 GMT</pubDate>
            <atom:updated>2015-06-11T20:39:13.300Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nc-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<p>Recently, I wrote a post entitled <a href="https://medium.com/@danrschlosser/linkedin-dark-patterns-3ae726fe1462">LinkedIn Dark Patterns</a>, which enumerated all of the ways that LinkedIn uses design to trick users into importing their address book into LinkedIn (allowing them to then get you to accidentally invite those contacts to LinkedIn). A <em>dark pattern</em> is a design choice intended to trick users.</p><p>I thought it might be nice to also explain how to check if LinkedIn has your contacts on it’s service, and how to remove them if they do. While we go, why don’t we count the dark patterns?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aQkXIfB_kWh74rgfwcPjfQ.png" /></figure><h4>Step 1</h4><p>Go to <a href="https://www.linkedin.com">LinkedIn</a>.</p><p><strong><em>(Dark patterns: 0)</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wQjyTTB6acZvppo2N5WIvQ.png" /></figure><h4>Step 2</h4><p>Hover on the person with a plus next to their head, and click the “Add Connection” header. <em>Note that clicking other links in the dropdown may take you to the same place.</em></p><p><strong><em>(Dark patterns: 1)</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lRy1H9IOLAV9_TzPf7ffjg.png" /></figure><h4>Step 3</h4><p>Click the small, hard to find “Manage imported contacts” link in the top right of the new page.</p><p><strong>(Dark patterns: 2)</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sB8pjXwD_cE4p3hF8W2Exw.jpeg" /></figure><h4>Step 4</h4><p>Scroll all the way to the bottom this next page. Note that the list of contacts itself is scrollable, so it’s very possible that you wouldn’t even figure out that it was possible to scroll past it.</p><p><strong>(Dark patterns: 3)</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q9cFjAQvNbnrd6i5jFbhaQ.png" /></figure><h4>Step 5</h4><p>Click the “Delete selected contacts” button hidden at the bottom of the page, instead of the “Invite selected contacts” button which has been visible the whole time.</p><p><strong>(Dark patterns: 4)</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4TtVxXEWyvSxanDUdARwiQ.png" /></figure><h4>Step 6</h4><p>Click “Delete” in the popup window.</p><p><strong>(Dark patterns: 4)</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kAplEwFORsLq8twU4gofvQ.png" /></figure><h4>Step 7</h4><p>Wait for the deletion to complete. <em>If you close the browser tab, it may not complete.</em></p><p><strong>(Dark patterns: 4)</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YljJgsD-sfTeiYi_5HPSJw.png" /></figure><h4>Step 8</h4><p>Celebrate!</p><p>(<strong>Dark patterns: 4)</strong></p><p>Congratulations, you’re done! Let’s see how we did:</p><p><strong>Number of Steps: </strong>8<br><strong>Number of Dark Patterns:</strong> 4</p><p>This process is far more difficult than it should be. When I first found it, it took me several hours of digging. Hopefully this helped you!</p><p><em>If you’re interested in how these contacts got there in the first place, and haven’t read my other piece yet, check it out below!</em></p><p><a href="https://medium.com/p/3ae726fe1462">LinkedIn Dark Patterns</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a6f115185164" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LinkedIn Dark Patterns]]></title>
            <link>https://medium.com/@danrschlosser/linkedin-dark-patterns-3ae726fe1462?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/3ae726fe1462</guid>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[linkedin]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Fri, 05 Jun 2015 18:34:54 GMT</pubDate>
            <atom:updated>2015-06-09T20:08:07.848Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nc-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<h4>or: Why Your Friends Keep<br>Spamming You to Sign Up for LinkedIn</h4><p>In December of 2013, I closed my LinkedIn account. As I retold in an <a href="https://www.facebook.com/danrschlosser/posts/10203064679683645">emotional post Facebook post</a>, I had discovered that I had been sending those annoying “Dan Schlosser has invited you to join LinkedIn” emails to my friends. Confused, I spent several hours digging around in LinkedIn settings and menus to figure out why.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1022/1*_Tk0Cyw9hJygDNkZK9IJIQ.png" /><figcaption><a href="https://www.facebook.com/danrschlosser/posts/10203064679683645">My emotional Facebook post.</a> (Pardon the language.)</figcaption></figure><p>It turned out that when I made my account years earlier, LinkedIn had tricked me into importing my address book. If they had used the contents of my address book just to suggest contacts on LinkedIn, I might not have minded, but they went further. On the “People You May Know” page, LinkedIn had inserted a few buttons to invite email addresses from my address book to LinkedIn, and made those buttons look a lot like people already on LinkedIn that I could connect to. The difference between these two kinds of buttons was negligible, and as a result I had been sending spammy emails when I thought I had been sending connection requests.</p><p>This feature has since been refactored (why I felt comfortable joining the service again recently) and these two buttons do not show up next to each other anymore. Instead, they make it one-click to invite every one of your contacts unknown to LinkedIn to the service.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uExqONPxCUnpFXBK-qcliw.png" /><figcaption>When they say “Add to Network,” they really mean “Send 688 emails.”</figcaption></figure><p>It also shows up in the contacts manager, where it only takes one click to both connect with every person in your contacts who is on LinkedIn, and to send a “Join LinkedIn” email to every person in your contacts who isn’t.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*E3gktX1J3cmNmnTcDKKIQw.jpeg" /><figcaption>“Invite selected Contacts” will send 2690 emails: some inviting to connect, others inviting to join LinkedIn.</figcaption></figure><p>This system, setup to trick me into inviting people in my contacts to LinkedIn, is called a <em>dark pattern</em>. In UX design, a dark pattern is design that works against users. It might trick them into doing the wrong thing, or just confuse them to the point where they can’t figure out how to do something that the designers don’t want them to do. This could be making it hard to delete a user account, or in LinkedIn’s case, making it <em>really hard</em> to use the service without importing your entire address book.</p><p>In order to bring LinkedIn’s spammy practices to light, I’ve walked through all the steps needed in order to sign up for and use LinkedIn without importing your address book. Check it out, it’s near impossible. Along the way, I’ll take a look at how LinkedIn uses design to trick its users.</p><h3>Account Creation</h3><p>For most people, this is where they get you. The big offense throughout this whole process is conflating OAuth with address book importing. Take a look:</p><h4>The Landing Page</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eJEL2tmV1e7pCGkyFmBdkQ.png" /></figure><p>This page is pretty simple. There aren’t any dark patterns at play here, unless you count the User Agreement, Privacy Policy, and Cookie Policy that joining the service entails. This page is clean.</p><h4>Basic Profile Info</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ynnM1-2alcPP9rF2uuhKcA.png" /></figure><p>This page is also clean. LinkedIn uses this info to connect you with other people that work at your company, or went to your school, and that’s to be expected. They give a nice explainer in the box on the right side. Simple and straightforward.</p><h4>The First Dark Pattern</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Dp0zETMpkuq1L-lPJykRlA.png" /></figure><p>Here’s where things get messy. After filling out basic profile information, LinkedIn asks you to “Get started by adding your email address.” There is a note explaining what this button does, but because it is put in light gray text next to a bold blue “Continue” button, they get most people to blindly click ahead. This is definitely a dark pattern. In fact, it’s really a lie. This page is not for “adding your email address,” it’s for linking address books.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dkM1uGAuZmGHAQDytw5HSQ.png" /><figcaption>A closeup of the dark pattern in question. Note the use of color discourage users from reading the explanation text.</figcaption></figure><h4>OAuth Dialogue</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1Q7wCEmX66b72t86F0a4WA.png" /></figure><p>After clicking the blue continue button on the previous page, the Google OAuth popup appears. Note that one of the permissions being granted is “Manage your contacts.” Google hasn’t done an amazing job highlighting this fact, but it’s pretty good. If someone were to click “Accept” at this stage, the user’s entire address book would be imported into LinkedIn. This is where I went wrong the first time. Here, LinkedIn is taking advantage of the fact that Google uses the same OAuth popup for address book import as they do for the “Log in with Google+” dialogue. LinkedIn knows that most users just click through these windows without reading the permissions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/861/1*WF6QY9wsQvDiBF_pf9eoKg.png" /><figcaption>LinkedIn hopes you won’t notice this additional permission</figcaption></figure><h4>The Failure Screen</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1ndhbuiRc5nKotURO1aHrA.png" /></figure><p>If the OAuth flow is cancelled, an error appears. It reads “We are unable to import your email contacts. Please try again later.” The continue button brings the OAuth window open again; you need to find the tiny “Skip this step” link at the bottom right to proceed. Moreover, the link is placed outside of the blue box which ostensibly contains all relevant info or controls. This page is excellently designed, but it’s designed to trick users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xOE-N6Vs7t6AW6sn0rfwRQ.png" /><figcaption>You need to find the tiny “Skip this step” link at the bottom right to proceed.</figcaption></figure><h4>Are You Sure?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K-gEVKvxMoEcIIzCp-pFoQ.png" /></figure><p>Just in case you found the hidden link by accident, LinkedIn asks you to confirm that you do indeed want to skip the address book import. Notice that “address book” or “contacts” show up nowhere in this popup window. Instead, you’re prompted to “Find now.” Wouldn’t it be nice if LinkedIn gave this kind of warning dialogue when you click the button that gives them your entire address book?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y0MdgAKLrUR65HWhelrAZA.png" /><figcaption>Why on earth would you want to skip seeing who you already know?</figcaption></figure><h4>Confirm Your Google Account</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AsGKLIvOGPAYyq-wjgn7RA.png" /></figure><p>This next page is pretty insulting. The text asks the user to “confirm” their Google account, and “verify” their email address, but what LinkedIn is not saying is that clicking “Confirm my Google account” will sync the user’s address book with LinkedIn. The user has already indicated on the previous page that they do not want to sync their address book with LinkedIn, but they try again anyways.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*r3BeM8lq1_93EXAf1sMp2g.png" /><figcaption>One of the most insulting screens of this process. Since when does “Confirm my Google account” mean “Give us the entire contents of your address book?”</figcaption></figure><h4>We Could Not Confirm Your Email Address</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y0IN-OAhlrvNx_n6UhVRmQ.png" /></figure><p>If we cancel out of the OAuth dialogue on the confirmation page, a warning appears indicating that a confirmation email has been sent instead. For once, the blue button on the page doesn’t import all your contacts, and instead links to Gmail.</p><h4>Confirmation Email</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QzLdsR8A76wL7BSsRi3Wzg.png" /></figure><p>This is the email that LinkedIn sends to confirm your email address. If you click the yellow button, it links to the next page shown.</p><h4>Add Your Email Address… Again?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pP-zQ_Oc4brBQjYLHwvXrA.png" /></figure><p>Following the link in the email shows a success message which reads “Thanks for confirming your email address…” right next to a box asking you to “Get started by adding your email address.” Recognize this screen? It’s the <em>same one as before</em>. Once you confirm your email address, they try a third time to get you to “add” it. After the first two times that the user explicitly skipped adding their address book, it is overwhelmingly clear that they don’t want to. This page is included just in case it happens to trick users into clicking “Continue.”</p><h4>Are You Sure… Again?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EizTEMBudvxBr2xX95qsTA.png" /></figure><p>Just like before, if you click “skip this step” at the bottom of the page, a warning popup appears making sure you didn’t skip accidentally.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y0MdgAKLrUR65HWhelrAZA.png" /><figcaption>Just in case you didn’t mean to skip this step the last few times.</figcaption></figure><h4>Get the App</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bve0H7x5bKfwHeQ8X8likw.png" /></figure><p>On the next screen, they offer to send you a link to download the LinkedIn mobile app. If they don’t get your address book on the web, maybe they’ll get it through your phone.</p><h4>Finally done</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HYf5ETyW_r4JMy04H-WZCw.png" /></figure><p>There we have it, finally signed up and signed in to LinkedIn. The next part of the new user experience is filling out your profile. Depending on how you count, LinkedIn tries to import the user’s address book three to eight times. It shouldn’t be this hard to sign up for a product without giving away any unnecessary information.</p><h3>The New User Experience</h3><p>In software design, a new user experience, or <em>NUX</em>, is content that is driven to make the service valuable for new users who likely don’t have any connections or friendships on the service. For my experience with LinkedIn, this started with a welcome email. Let’s take a look at how they use dark patterns to get you to sync your address book, even if you made it this far without doing so already.</p><h4>The Welcome Email</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K-2I9NuwJcbO6OgE5HlOAw.png" /></figure><p>It turns out that the “Get Started” link and the “Stay Connected” link both go to two different screens that both do the same thing. First, let’s follow the big yellow “Get Started” button, as I’m sure that’s what most people clicked.</p><h4>Every Career Needs A Strong Network</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0mmeJKaZZSS6hIInxKo3SQ.png" /></figure><p>Big surprise. Yet another way to import our address book. In fairness, this is the page where the copy is most descriptive of what’s happening. The sub-header reads “Build yours by looking for your email contacts” and there isn’t any mention of “adding your email address,” which would have been very confusing. Again, we see a big blue “Continue” button that just begs to be clicked.</p><p>Also, LinkedIn is using traditional NUX designs to trick users into thinking that this is more of a tutorial than an attempt to get the user’s address book. Notice the dots up in the far right, and the solid blue background? This is different from every other screen we’ve seen before. It feels different than every other part of LinkedIn we’ve experienced so far. For users of other web or mobile applications, this might feel like a first-time tutorial screen, where you click through the six screens that teach you what the app is, and then you get to actually use it at the end. Most users are trained to click through these tutorial screens, and LinkedIn is counting on that. In case you hadn’t guessed it, the “Continue” button launches the Google OAuth popup again.</p><h4>You Don’t Want A Strong Career?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YPDa4EAG2cWTEOg6jcH4Tw.png" /></figure><p>If you managed to find the skip link, LinkedIn asks you to confirm that you want to skip importing your address book. Once again, the blue “Continue” button in the popup is actually the “No never mind, I <em>do</em> want to give you all my contacts” button. We’re looking for the “Skip” link. This is a textbook dark pattern. In the last screen, the skip link was hidden on the right, and the continue button was highlighted on the left, where it’s more noticeable. Here, that positioning is flipped, so if you happen to find the skip button, you have to reverse your thinking, and notice that this time the skip button is on the left. To add insult to injury, the wording of the question is such that “Continue” seems like the answer we want. The word “Continue” has an affirmative connotation for most people, so when being asked “Are you sure you want to skip this step?” it seems unnatural that “Continue” doesn’t get us what we want.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/696/1*iC1I3cyG10xCnLLyxQ_e7g.png" /><figcaption>This popup is fantastically designed to trick you.</figcaption></figure><p>Lets review everything this popup does.</p><ol><li>The big blue button is the “give us all your contacts” button.</li><li>The skip link we’re looking for (and have already clicked once) has been moved to the other side of the button, which confuses the left-right association that was subconsciously built in the previous screen.</li><li>The popup essentially asks “Are you sure?” and “Continue” here means “No,” which feels unnatrual.</li></ol><p>Pretty clever.</p><h4>The Rest of the NUX</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zVccWrD9oDBW3WovBrDWCg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BH6qgNxc1ISQkaazwF7xfA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IHY8cF9tVljstys2QjS98w.png" /></figure><p>The rest of this flow is harmless. If you happen to make it through the previous screen without getting fooled, the rest of the new user experience screens serve to connect you with more companies or interests, or to get you to download the mobile app.</p><h4>Done with the NUX?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*whhx4YKHVfOFlZprqAysPA.png" /></figure><p>So we’ve finally finished, and we’re on the LinkedIn homepage. Now this page is a total mess design wise, but I’d like to draw attention to the “Welcome, Dan!” card that shows up, which has a big yellow “Continue” button. By now, I’m sure you know where that goes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h2YMTXSKBb4x9UsBGAwLgQ.png" /><figcaption>Deja vu, right?</figcaption></figure><p>The only solace I can find here is that the page is so cluttered that I doubt that most people would end up finding this link on the first time. Thankfully this card sticks around for a while…</p><h4>What About That Other Link in the Welcome Email?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2GnLIG7sGdKmGz0tjyzjaw.png" /></figure><p>Remember the “Stay connected” link? Turns out that takes you to a completely different screen that also gets you to import your address book.</p><h4>Yet Another Way to Add Your Email Address</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RcZqfqAzcf7-4PNK5F2vSw.png" /></figure><p>This page is no longer new user experience, rather it’s the permanent home for the “add your email address” flow. We see a return of the original copy which hides the true function of the “Continue” button.</p><h3>A Final Word</h3><p>I hope you understand now that when you get spammy emails from friends inviting you to LinkedIn, <strong>it’s LinkedIn’s fault</strong>, not your friends’.</p><p>Many smart people have written about how <a href="http://www.theverge.com/2013/8/29/4640308/dark-patterns-inside-the-interfaces-designed-to-trick-you">dark patterns damage brands</a>, and are <a href="http://alistapart.com/article/dark-patterns-deception-vs.-honesty-in-ui-design">harmful to user trust</a>. I can unequivocally say that LinkedIn’s address book import design is harmful to their brand, even if it’s better for business in the short term. They make money when their network is more strongly connected, and so it is in their best interest that users connect their address books.</p><p>LinkedIn isn’t the only social network that uses dark patterns to grow their social graph, far from it. However, LinkedIn is an example of doing this to the extreme. It made me quit the service for two years, and has harmed my image of the company. Dark patterns are bad design, and bad design is bad business. I guess I’m disappointed that LinkedIn doesn’t agree.</p><p><em>PSA: If you’re wondering if LinkedIn has your address book imported, I wrote a short tutorial on how to find out, and how to remove it. Check it out </em><a href="https://medium.com/@danrschlosser/psa-how-to-unlink-your-linkedin-address-book-a6f115185164"><em>here</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3ae726fe1462" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Switching to Medium Was Harder Than It Should Have Been]]></title>
            <link>https://medium.com/@danrschlosser/switching-to-medium-ac02b43e2220?source=rss-59bbc929ff7a------2</link>
            <guid isPermaLink="false">https://medium.com/p/ac02b43e2220</guid>
            <dc:creator><![CDATA[Dan Schlosser]]></dc:creator>
            <pubDate>Thu, 04 Jun 2015 02:56:20 GMT</pubDate>
            <atom:updated>2015-06-04T04:35:57.302Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-nc-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Z4vZt36wn5BMgzhxdgZ5jQ.png" /></figure><p>A few days ago, I migrated my personal blog to Medium. From now on, I’ll be publishing <a href="https://medium.com/@danrschlosser">here</a> instead of on my website. I had some good reasons to stay off it for so long, but I’m glad that I switched.</p><p>I’m a big believer in personal websites, especially self-hosted ones. <a href="https://schlosser.io">My website</a> is where I first started messing around with web development, and working on it has taught me a lot of what I know. I’ve learned basic system administrator skills, Flask, HTML, CSS, and JavaScript. Part of hosting my own website was making a blog, which meant setting up a content management system (in this case, a folder full of markdown files), and building the blog from scratch. I learned a lot doing this, I would whole-heartedly recommend the process to anyone who is considering it. When things broke, I was the only person to fix it, and they weren’t always easy problems to solve. Self-hosting taught me self-reliance as a web developer.</p><p>Over time, however, managing my blog has become less of an adventure, and more of a task. I’m busy <a href="https://medium.com/@danrschlosser/eventum-an-event-driven-cms-b28422951a43">maintaining one CMS</a>, I’d rather not maintain two.</p><p>When I considered switching to Medium, however, the site’s branding turned me away pretty quickly. Medium wants to be a service that “connects people, stories, and ideas that matter to you.” It’s a place for bright minds to share brighter ideas, and it’s a space where people talk about serious topics, and I’m not sure I fit in.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-VxY0fTrC79OP7DoVTCplg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C_gRxJeCz65lqRmM-ZcC5Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*akNOVCbwhETq1zjgy8mlvg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jGu2XzS2RouLd0oqA9VzOA.png" /><figcaption>Copy from <a href="https://medium.com/about/medium-connects-the-people-stories-and-ideas-that-matter-to-you-495655fb8459">Medium’s about page</a></figcaption></figure><p>The <a href="https://medium.com/about/medium-connects-the-people-stories-and-ideas-that-matter-to-you-495655fb8459">Medium about page</a> demonstrates this pretty clearly, where the word “stories” is almost always accompanied by “ideas”. This branding decision is very conscious, from the article layout to the typography. On Medium, people are judged for the quality of their ideas, rather than what they look like or how fun their summer vacation was. For this reason, it has a leg up over many social networks. The problem is that a community of thinkers can be intimidating.</p><p>I’m hesitant to put my writing onto a service where everything is taken so seriously. I believe that I have valuable thoughts to offer the world (if I didn’t, I wouldn’t publish my writing at all), but for me, publishing on Medium feels presumptuous.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*SiF3F72JvIiF0yHvWb_Y3w.png" /><figcaption>Featured tags on Medium’s front page</figcaption></figure><p>Medium’s sell to writers is audience. By publishing on Medium, I can get access to new readers that would never have gone to my personal blog. But then the question becomes: <em>Is my writing worth discovering?</em></p><p>My blog posts don’t necessarily fit in next to other articles about technology, never mind articles tagged with “BlackLivesMatter”, “Women In Tech”, or “Education Reform.” These topics are serious; they demand respectful discussion and Medium facilitates that. The problem is that I’m not sure if my writing falls into that category. I blog seriously about technology and design, yes, but I can also be a little silly, and that’s important to me. I am serious about my writing, but my writing isn’t always serious. Because of this, I can’t help feeling a little out of place.</p><p>This branding problem has kept me off Medium for over an year, but recently I’ve reconsidered. For me, writing on Medium means being taken a bit more seriously, and I think I’m okay with that. I’m still not sure my writing fits in here, but I’ll have to wait and see.</p><p>Most of all, moving to Medium means putting pressure on myself to do more writing. I’ve realized that publishing on a personal blog doesn’t mean much if your blog doesn’t have followers, and most people don’t follow blogs these days. My writing is more discoverable now, and I’m okay with that.</p><p>It makes sense to switch to Medium and voice my concerns instead of yelling them into a self-hosted void. There’s a lot to love over here. While the Medium editor is <a href="https://twitter.com/danrschlosser/status/603594419489656835">far from perfect</a>, I appreciate that it’s a hard problem and that they’ve done a pretty good job. I prefer tools with more customizability, but good design has constraints, so I’ll concede. Yes, I’ll miss syntax highlighting and underlining and picking my own fonts, but I won’t miss worrying about uptime or <a href="https://medium.com/@danrschlosser/i-hate-cross-browser-compatibility-a-website-redesign-gone-wrong-d6ba9fa2e4f4">cross-browser compatibility</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ac02b43e2220" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>