<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Facebook - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Facebook - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 11 Jun 2026 11:18:49 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/facebook/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ The Real Work From Home Winner Is The Shareholder ]]>
                </title>
                <description>
                    <![CDATA[ By Adam Naor Today roughly eight million Americans work remotely full-time. And among the most commonly held jobs include many that leverage skills honed on freeCodeCamp. These jobs include web design, software engineering, product management, and wr... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-real-work-from-home-winner-is-the-shareholder/</link>
                <guid isPermaLink="false">66d45d7dcc7f04d2549a370c</guid>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ finance ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Math ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 16 Jun 2020 05:22:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/06/FN-AH983_FN_SHA_P_20190828113214-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Adam Naor</p>
<p>Today roughly eight million Americans work remotely full-time. And among the most commonly held jobs include many that leverage skills honed on freeCodeCamp. These jobs include web design, software engineering, product management, and writing.</p>
<p>Firms are embracing the shift to hiring and empowering remote staff for many reasons. Some of the reasons frequently referenced include increased workforce productivity and access to new pools of talent.</p>
<p>One reason that is cited less frequently (but is seemingly as important) is that shifting to a remote labor force will significantly reduce a firm’s costs. Ultimately these cost savings will benefit shareholders. </p>
<p>I want to explain the cost structure that firms, and in particular technology companies, must manage. I absorbed these lessons by studying the financial documents and annual reports of companies that perhaps you aspire to work for or whose products you may use and enjoy.</p>
<p>I want to share these lessons with you.</p>
<p>First, some relevant financial context. All firms have essentially three large costs that they must manage: Property Plant and Equipment (PP&amp;E), operating expenses, and Selling, General and Administrative (SG&amp;A) expenses.</p>
<p>When a firm maintains an office (or famous large headquarters in the case of Google, Facebook, and Apple), it obviously must pay for the furniture, land, buildings, and machinery that help power its business. These fixed assets are expected to be used for at least one year and are classified as PP&amp;E on a firm’s balance sheet. </p>
<p>Operating expenses are a second category of cost that firms must manage. These costs include the utilities, insurance, taxes, and payroll that a firm pays to remain open. </p>
<p>Lastly, a company needs to budget for SG&amp;A expenses which are the sum of all direct or indirect selling expenses and general administrative expenses a firm accrues.</p>
<p>With this context in mind, we can view remote work - and the advocacy of remote work by CEOs - through a new financial light. </p>
<p>By placing workers in home offices (or remote co-working spaces) a firm can succeed in achieving two things in a single action: the firm can reduce its fixed and variable costs and move part of its cost structure from its balance sheet to that of its staff.</p>
<p>In short, companies won’t need to invest as much in buildings and equipment (i.e. lower CAPEX), which will lead directly to higher cash flow. This will lead to higher expected growth and higher stock prices over time. </p>
<p>Additionally, companies can decrease salaries and decrease corporate administrative costs, (i.e. lower SG&amp;A), which will lead to higher net income to equity holders.</p>
<p>Facebook provides evidence of this trend.</p>
<p>Recently Facebook Founder and CEO Mark Zuckerberg said that as much as 50% of Facebook’s workforce could be working remotely in the next five to ten years.</p>
<p>What data supports this policy?</p>
<p><img src="https://lh4.googleusercontent.com/gPJ3R8w_QkKdaECTszbseFJo6_HFnLtzDio6eYtkkQIA3UVy5zSP3FA4JYckbjTYBPnXPrp5HIkE2TcvLATKkRbgQuaucyGA9hbpsM4lo1F1xU6v9iK8Zdb12HPrqfoNorcUJaZL" alt="Image" width="701" height="433" loading="lazy"></p>
<p>Firstly, look at the explosion of Facebook’s SG&amp;A costs in the last three years.</p>
<ul>
<li>In 2019 Facebook's annual SG&amp;A increased 80% from 2018.</li>
<li>In 2018 Facebook's annual SG&amp;A increased 56% from 2017.</li>
<li>In 2017 Facebook's annual SG&amp;A increased 32% from 2016.</li>
</ul>
<p>Next, look at Facebook’s increase in operating expenses.</p>
<ul>
<li>Facebook's annual operating expenses for 2019 increased 51.05% from 2018.</li>
<li>Facebook's annual operating expenses for 2018 increased 51.22% from 2017.</li>
<li>Facebook's annual operating expenses for 2017 increased 34% from 2016.</li>
</ul>
<p>Lastly, note that even as Facebook’s revenue has increased, the rate of growth is slowing.</p>
<ul>
<li>Facebook's annual revenue for 2019 increased by 27% from 2018.</li>
<li>Facebook's annual revenue for 2018 increased 37% from 2017.</li>
<li>Facebook's annual revenue for 2017 increased 47% from 2016.</li>
</ul>
<p>Facebook’s SG&amp;A and operating expenses are increasing faster than Facebook’s rate of revenue. </p>
<p>To increase profitability, Facebook will need to find ways to decrease its costs. It has a few obvious buckets to target and expanding its remote workforce can reduce PP&amp;E, SG&amp;A, and other operating costs in one fell swoop.</p>
<p>Let me explain how.</p>
<p>Remote workers will reduce Facebook’s dependency on furniture, land, and buildings. The decreased utilization of these fixed assets will lower Facebook's PP&amp;E. </p>
<p>Secondly, remote workers will decrease Facebook’s payroll. Why? Because Facebook can pay lower wages to workers outside of dense regions where the majority of their workers are today. Hiring talent outside of metropolitan areas will enable Facebook to pay wages indexed to local costs. </p>
<p>A software engineer in New Hampshire or Montana will cost Facebook less to employ than that same engineer located in New York City or the Bay Area. Zuckerberg explained that Facebook “will adjust salaries to your location...that means if you live in a location where the cost of living is dramatically lower, or the cost of labor is lower, then salaries do tend to be somewhat lower in those places.”</p>
<p>The reduction of costs can be extrapolated to SG&amp;A. Rent, utilities, and office supplies are three examples where Facebook can move costs from its balance sheet to that of its staff who will likely be expected, among other things, to heat and cool their home work environments, make their own coffee and food, or clean their home workspaces -  at their own expense.</p>
<p>This shift in cost structure will likely yield disproportionate benefits to shareholders because the earnings of a firm increase when, holding all else constant, costs decrease.</p>
<p>What do these changes mean for you? I have a few ideas.</p>
<p>Remote workers would be wise to ask for and negotiate new benefits packages. Subsidized wifi or utilities seem like reasonable things to ask for if you no longer have an office to work from. Discounted home office products - a chair, desk, light, keyboard, monitor  - should be included as non-taxed items when joining in a remote role. Access to virtual mentoring or mental health tools can be requested as core perks to ensure that you are growing and healthy while performing remote work.</p>
<p>As remote work becomes more prevalent - for full time remote workers and employees who blend their time between workplaces - new paradigms of work will arise. With this fundamental shift in the labor markets, firms will have a unique opportunity to reduce costs. How and where their expenses are cut will dictate the rate at which earnings can increase. </p>
<p>It seems to reason that shareholders will benefit from enhanced profitability coming from these changes. But remote engineers, designers, product managers, and sales professionals can benefit too. By asking for new and specific perks that empower remote work, these workers might see more of the upside derived from this shift in the labor market.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I landed offers from Microsoft, Amazon, and Twitter without an Ivy League degree ]]>
                </title>
                <description>
                    <![CDATA[ By Zhia Chong This is for those of you out there who are about to start your job search and who may be worried that you can’t land a top-tier tech job without a Stanford CS degree. Someone told you that you’re not good enough to get a job at ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-landed-offers-from-microsoft-amazon-and-twitter-without-an-ivy-league-degree/</link>
                <guid isPermaLink="false">66d461c857503cc72873deea</guid>
                
                    <category>
                        <![CDATA[ Backend Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ career advice ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career development  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ careers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ coding interview ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Google ]]>
                    </category>
                
                    <category>
                        <![CDATA[ internships ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Interviews ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Microsoft ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Twitter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 23 Feb 2020 08:14:06 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/02/1_QuyFfwka5D5j7Z2IR4mcCQ.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Zhia Chong</p>
<p>This is for those of you out there who are about to start your job search and who may be worried that you can’t land a top-tier tech job without a Stanford CS degree. Someone told you that you’re not good enough to get a job at Microsoft or Facebook. </p>
<p>But I’m here to tell you that you can get that job. Here’s how I landed my dream job at Twitter.</p>
<p>Read more about my courses <a target="_blank" href="https://docs.google.com/document/d/1PeK69h4H82rwKjhactiE_sAIorCcZgXgXTY7k-nXpnE/edit?usp=sharing">here</a> to learn how I prepared.</p>
<p>You can read about my experiences after a year at Twitter <a target="_blank" href="https://www.freecodecamp.org/news/what-ive-learned-in-1-year-at-twitter-65150f5d4af2/">here</a>.</p>
<h3 id="heading-what-this-article-covers">What this article covers:</h3>
<ul>
<li>My background</li>
<li>How I landed interviews with top tech companies in the world: Facebook Google, Amazon, LinkedIn, Microsoft, Twitter, Pinterest, Snapchat, and others.</li>
<li>How I landed multiple offers as a full-time software engineer</li>
<li>Lessons from my interview experience</li>
<li>Subscribe <a target="_blank" href="http://eepurl.com/dnt9Sf">here</a> for more article updates from me</li>
</ul>
<p>If you prefer to watch my story instead, I made a video here:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/83Reyvrs-VQ" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-background">Background</h2>
<p>I did not graduate from an Ivy league school. I went to a community college in Idaho for two years, and then finished my CS degree at a small Catholic university.</p>
<p>I started learning computer science in my junior year of college, because it sounded fun to me at the time. The only thing resembling a computer I had growing up was a Chinese copycat of the Nintendo SNES. Even then, it would break every time I put a cartridge in it.</p>
<p>To support myself through college, I took multiple part-time jobs like cleaning floors and working stand-up concessions.</p>
<p>When I graduated, I didn’t have a job lined up. I applied to as many big tech companies as I could, and had the good fortune of landing a few phone interviews.</p>
<p>At this point, I didn’t have a single notion of what a technical screen would be like, much less how to prepare for it. I headed into these interviews thinking that the interviewer would ask me what a linked list or binary tree was.</p>
<p>I <strong>didn’t pass</strong> any of those interviews.</p>
<h2 id="heading-moving-forward">Moving forward</h2>
<p>I didn’t delve too much into whether I was good. I knew that I could learn things fast. I just needed an opportunity.</p>
<p>As the saying goes, cast your net far and wide. So that’s what I did.</p>
<p>What I did next is something I’m particularly proud of. I wrote a simple Python script that scraped job listings on Craigslist with titles containing keywords from a list, and collected the emails in a spreadsheet. For the actual war story, you can read the article <a target="_blank" href="https://www.freecodecamp.org/news/how-i-built-a-web-crawler-to-automate-my-job-search-f825fb5af718/">here</a>.</p>
<p>It wasn’t the smartest solution, but people who post on Craigslist are surprisingly accurate with their titles.</p>
<p>Craigslist, however, didn’t like people scraping their website. To work around this, I ran my script through a VPN, and had a timer that would pause the script every few minutes or so. It wasn’t perfect, but it worked well enough.</p>
<p>In the end I collected about 500 emails from around San Francisco, Portland, Spokane, and Seattle. I filtered the results by how specific and recent they were, and kept improving it by adding more and more features.</p>
<p>As it turned out, there were a few bots in the market already that crawled Craigslist and sent out automated emails. These were mostly offshore companies that were looking to pitch their company to the US market.</p>
<p>One of my workarounds was that I crafted emails that used keywords from their listings in the title of my emails. I then added more details using the body of the postings to make it seem more personable. I did a quick A/B test, and the replies I received had increased quite a bit from around 2–3% to 10%.</p>
<p>Out of the 500 or so emails, I received about 50 replies, and landed phone screens with a small percentage of those. I stopped at 500 because I was short on time and needed to finalize a job as soon as possible. I was optimizing for results rather than reach at that point.</p>
<p>As luck would have it, I finally landed a job at a startup in Seattle as a junior software engineer. The startup was located in Kirkland at the time, so I had to take a 45-min bus ride to make it in time for the interview.</p>
<p>I then stayed there for the next 3.5 years, where I learned a great deal of stuff like Amazon AWS, EC2, DynamoDB, SQS, and Docker. I grew a lot during this period. I learned how to write modular, maintainable code. I learned how to reason about software design. And I learned how to handle people problems.</p>
<p>I was working next to a group of smart people who held jobs at Microsoft, Amazon, and LinkedIn, and I tried to be the “sponge” in the group. I absorbed anything and everything they threw at me. I believe this made a huge impact in my career.</p>
<h2 id="heading-startup-days">Startup Days</h2>
<p>During my stint at the startup, I worked almost exclusively on backend development, with some dev-ops in between. I started out writing some functions to add/modify a feature that were mostly small in scope. But it was a great opportunity to understand the codebase and get some code reviews.</p>
<p>A year into it, I started owning parts of the codebase, and then I was tasked with turning a set of features into a service. That was the start of the SOA phase for the startup. We started turning various components of the site into services, and that’s how I started learning more about RESTful services, authentication, AWS services, pub-sub, distributed systems and so forth.</p>
<p>The interesting part here is that <em>I didn’t learn about any of these through books or formal education.</em> Rather, I needed to get that set of features done and there were the bottlenecks.</p>
<p>So I thought, let’s go solve it!</p>
<p>There were many times where I was stuck in analysis paralysis — a state where I over-analyzed scenarios and ended up not able to make progress.</p>
<p>Those trying times were the <strong>greatest</strong> learning opportunities. I started to learn feature scoping, negotiations, monitoring, alerting, and documentation. Each step of the process revealed more things I needed to learn. I grew the most during these 2–3 years, both as an individual and software engineer.</p>
<h2 id="heading-how-i-prepared-for-my-interviews">How I prepared for my interviews</h2>
<p>After suffering through my first job search, I told myself that I must be prepared in future interviews.</p>
<p>I started preparing for interviews by charting out an overview of what I was good at, bad at, and where I could improve. I broke it down into three categories: <strong>data structures, algorithms, and system design.</strong></p>
<p>Having worked in PHP for most of my professional career, and C++ in college, I wanted to try something a little simpler and less verbose for interviewing.</p>
<p>For this reason, I picked Python. It is a great language to learn, easy to pick up, supports many data structures out of the box, and can be written quickly on the whiteboard. I learned Python by going through YouTube tutorials like <a target="_blank" href="https://www.youtube.com/watch?v=Z1Yd7upQsXY">these</a>, and also reading their documentation. I prefer Python 2.x, but you can go for either 2.x or 3.</p>
<p>Also, another reason why I picked Python is that it’s highly readable and easy to write on a whiteboard. Here’s a trivial comparison between C++ and Python.</p>
<p>A C++ program to sort in descending order:</p>
<pre><code class="lang-c++"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">&lt;bits/stdc++.h&gt;</span></span>
<span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>; 
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{   
    <span class="hljs-keyword">int</span> arr[] = {<span class="hljs-number">1</span>,<span class="hljs-number">10</span>,<span class="hljs-number">0</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>};
    <span class="hljs-keyword">int</span> n = size(arr)/<span class="hljs-keyword">sizeof</span>(arr[<span class="hljs-number">0</span>]);   
    sort(arr, arr + n, greater&lt;<span class="hljs-keyword">int</span>&gt;());   
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; n; i++) {       
        <span class="hljs-built_in">cout</span> &lt;&lt; arr[i] &lt;&lt; <span class="hljs-string">" "</span>;   
    }    
    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre>
<p>Compare that with Python’s version:</p>
<pre><code class="lang-py">a = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">1000</span>]
a.sort(reverse=<span class="hljs-literal">True</span>)
<span class="hljs-keyword">print</span> a
</code></pre>
<p>I’ve received feedback from interviewers to <strong>err on the side of brevity</strong> in an interview. In a 45-minute interview, you want to use most of your time solving the actual problem.</p>
<p>Pro tip: pick a language that’s less verbose so that you can write the code more quickly on the whiteboard.</p>
<h2 id="heading-preparation-mode">Preparation mode</h2>
<p>I spent about a week going through simple challenges on LeetCode, HackerRank, and Project Euler to familiarize myself with their interfaces, and to get used to writing code in Python.</p>
<p>The first week gave me insights into my competence level at certain programming languages. I spent another week going through some design challenges like “design X” and went as wide and deep as I could.</p>
<p>This was a lot of fun for me, because I often looked at iOS apps and tried to figure out how they did it. For example, how would you build Instagram from scratch? (I was asked this at Facebook.)</p>
<p>My background is in API designs and service-oriented architecture, so I took this opportunity to show how I would design my own version of Instagram. And because I have some iOS programming experience from my side-projects, I could talk a little bit about callbacks and push/long-polls here.</p>
<p>I started the conversation with some features I’d like to have on my own version of Instagram: likes, upload a photo, and a simple timeline. Feature scoping enabled me to build a very solid API because I know these scenarios well.</p>
<p>I then drew some pictures of a high-level design, of how the client would interact with the backend, and of how the backend would store the data.</p>
<p>I started small, and then added more components where needed and proactively sought where the bottlenecks were. I made educated guesses (read <strong>educated, not blind guesses</strong>) on what the requirements would be, and how each technology would fit in well. And also equally important, what technologies would <em>not fit well.</em></p>
<p>For example, why would you use Cassandra over MySQL to store certain information (hint: scale, speed of development, schema reviews), why use OAuth over simple authentication, Redis vs Memcached for caching data, streaming vs batch processing, and so on.</p>
<p>There are many areas you can explore here, so typically a one-hour session is not enough. To do well on these questions, you have to read and learn about trade-offs. Pros and cons of technologies in the industry. For this, I recommend a site like <a target="_blank" href="http://highscalability.com/all-time-favorites/">HighScalability</a>.</p>
<p>Take it like a typical brainstorming session with a coworker, so explore <em>as widely and as deeply</em> as you can.</p>
<p>It’s crucial to know that these design interviews are meant to explore how much you know and how well you know it, and it’s <strong>an opportunity for you to shine.</strong> I watched this YouTube <a target="_blank" href="https://www.youtube.com/watch?v=ZgdS0EUmn70">video</a> from an ex-Facebook engineer about how to solve design problems, and it gave me insights that helped me tremendously with my design interviews. My two main lessons from it: <strong>drive the design conversation,</strong> and <strong>show what you know</strong>.</p>
<p>I listed out my competency level for: <strong>data structures</strong> (linked list, hash map, binary tree, binary search tree, heap, array), <strong>algorithms</strong> (binary search, hashing, dynamic programming, sorting), and <strong>language-specific syntax and libraries</strong> (like sort, lambda for Python, appending, indexing).</p>
<p>I picked the area I was worst at, and started working on it: <strong>algorithms</strong>.</p>
<p>Algorithms have never been my forte. It’s been a while since my college days, and I didn’t spend much time doing binary search in my day-to-day career. I had an inkling of how each algorithm would perform, and in what scenarios to use them. But I wasn’t 100% comfortable with writing a binary search in under 10 mins. On a whiteboard. In front of an interviewer.</p>
<p>I also picked up a bunch of fine-point markers from <a target="_blank" href="https://www.amazon.com/86601-Low-Odor-Markers-Assorted-8-Count/dp/B000Z88D2E/ref=sr_1_3?ie=UTF8&amp;qid=1518801079&amp;sr=8-3&amp;keywords=white+board+pens">Amazon</a>, which work amazingly well. Perhaps it’s just me, but the fine-point markers in interviewing rooms usually don’t work at all. I’d usually scramble for 2–3 mins looking for a working pen, and that’s 2–3 mins you can’t afford to waste. Plus, fine-point markers allow you to write 5–8 more lines of code on a typical whiteboard vs. thicker ones. :)</p>
<p>Pro tip: Get your own set of fine-point markers.</p>
<p>I got a whiteboard from Costco for $50, some books from Amazon (listed in the tools I recommend section below), and started practicing. I made sure I ramped up on binary search, recursion, dynamic programming, BFS and DFS. A lot of interviewing questions revolved around recursion and binary search or some variations of it.</p>
<p>The best interviewing questions I’ve seen had many different solutions to them, and there’s an additional layer added on top as you progress through.</p>
<p>One Google question I had was related to file-system directories, and how to traverse them (hint: recursion). I solved that relatively quickly, and the interviewer asked how to identify a missing file in that directory. That was a little more difficult, but I got through it. And we then moved into how to rebuild the directory, how to serialize/deserialize it, and we spent a good chunk of time debating how file directories work underneath the hood. It was a very enjoyable session for me.</p>
<h2 id="heading-interviewing-at-top-tier-companies">Interviewing at top-tier companies</h2>
<p>It was a nerve-wracking experience, to say the least, and a real roller-coaster.</p>
<p>I allocated my time in the following manner: 20% resume, 20% research and 60% interview preparation.</p>
<p>I spent 20% of my time fixing up my resume, which hadn’t been updated in at least three years. I took a hard look at the stuff I’ve done in the past, and picked projects I handled end-to-end, <strong>regardless of complexity.</strong></p>
<p>The reason for doing this is two-fold. Taking a project from start to completion demands discipline and leadership — two of the traits I’d like to be identified with.</p>
<p>Secondly, ownership of a project end-to-end means I can talk about each aspect of the project <strong>at length and in depth.</strong> This proved critical in helping me navigate my design round at Twitter, where they grilled me hard on not only the designs of my projects, but also the decisions behind them.</p>
<p>20% of my time was used for research. Research in this case meant doing due diligence on companies I was interested in and reaching out for referrals. Having referrals helps with return calls.</p>
<p>From my experience, I sent out 20 or so cold messages to startups and mid-stage companies, and only heard back from a handful. But, almost all the companies I was referred to by an existing employee sent me a message within a week. This is anecdotal, but there’s value to be had there.</p>
<p>I am not that sociable, and I didn’t know many people who’d be able to refer me to a company I was interested in. To solve that problem, I went on LinkedIn. They have a search functionality that I used to search for 1st and 2nd-level connections. 2nd-level connections are people who’re one hop away from your immediate circle. In other words, we have mutual friends who can <strong>vouch for my credibility</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/02/linkedin-search.png" alt="Image" width="600" height="400" loading="lazy">
<em>LinkedIn search</em></p>
<p>This is incredibly important, because cold-calling someone for a job is very, very hard, especially in today’s market. People tend to err on the side of caution when it comes to cold-callers. Using LinkedIn was super helpful for my research phase.</p>
<p>Looking back at all the companies I interviewed at, here are my thoughts on each of them:</p>
<ul>
<li><strong>Facebook/Google</strong> — very mechanical. The standard interviewing process, and I didn’t feel any personal connection to them.</li>
<li><strong>Pinterest</strong> — not the best interviewing experience, but a cool product and company.</li>
<li><strong>Microsoft</strong> — loved the team and especially the manager and her manager. Standard interviewing questions, but very personable. Close-second choice. Your mileage may vary, though — each team at Microsoft interviews differently.</li>
<li><strong>Amazon</strong> — standard interviewing process. About 50% of the people love it, the others don’t.</li>
<li><strong>Twitter</strong> — incredibly fun and personal. Loved the interviewing process, gave a lot of emphasis on the individual and what I’d done in the past.</li>
<li><strong>Snapchat</strong> — cool office in LA, great bunch of people who decided to jump on the startup bandwagon. Felt like things were shrouded under a cloud of secrecy.</li>
<li><strong>Lyft</strong> — near to where I live, nice office, standard interviewing process. No strong feelings about it.</li>
</ul>
<h2 id="heading-lets-talk-about-my-favorite">Let’s talk about my favorite</h2>
<p>In many ways, I’d say Twitter’s interviewing style was hard. But at the same time, it was more interesting and personable than other companies I’ve interviewed at.</p>
<p>Their interviewing process starts with an introductory phone call with an engineering manager. That’s followed up by one or two technical phone screens, depending on how you perform. If you do well, they’ll fly you out to the office you’re interviewing for, which was Seattle in my case. There are three 1-hour-and-15-minute rounds, each with two interviewers.</p>
<p>The first two technical phone screens are the standard, run-of-the-mill technical screens where you solve coding problems on a shared coding doc.</p>
<p>The onsite rounds, however, are much more conversational and feel much less intimidating. The interviewers will ask you in-depth questions about your past projects, and they’ll grill you on what you’ve done in the past. If you claim ownership of a project, you should expect some questions about it. You’re encouraged to use them for references and to bounce ideas off of.</p>
<p>I never felt any pressure to magically come up with a fully working solution, and it felt highly collaborative.</p>
<h2 id="heading-the-others">The others</h2>
<p>In comparison, interviewing at Facebook and Google felt much more mechanical. They have one or two technical phone screens, and five to six onsite coding rounds. Each round involves some coding on a whiteboard, and you’re expected to come up with a near-perfect solution in a reasonable amount of time.</p>
<p>Facebook has two coding rounds, one design round, and one behavioral round.</p>
<p>I went through an additional shadow round at the end of the day, which didn’t count towards my overall score.</p>
<p>Google had five coding rounds, none of which focused on designs, and not a single interviewer asked about my previous projects. I don’t necessarily think this is bad. But I think it felt very mechanical and didn’t give much opportunity for the engineer to show what they’re capable of. Some people do well in these scenarios, much like some students do well in exams.</p>
<p>I <strong>did not enjoy</strong> my interview with Pinterest. I think the product itself is interesting, and their engineering team seems to be working on very cool technical <a target="_blank" href="https://medium.com/@Pinterest_Engineering">problems</a>. But I definitely had a negative experience during my interview there.</p>
<p>Pinterest has three coding rounds and one design round. Of those four rounds, the design round was most disappointing to me. Here’s why:</p>
<p>The interviewer came in late, and he spent a few minutes glancing over my resume before proceeding to draw some APIs on the board. He gave a short description of what he expected the API to do, and asked how I would solve it. We clarified the features of the API, and I started describing my solution using the whiteboard. About 5 minutes into it, I turned around and <strong>saw him taking a nap!</strong></p>
<p>Not cool.</p>
<p>I gave the recruiter my feedback in a survey, and I didn’t hear back from them after that.</p>
<p>I won’t delve into specifics of the questions I was asked during all the interviews. Instead, I’ll share some of the insights and useful tips I learned from my preparation process.</p>
<h2 id="heading-what-i-learned">What I learned:</h2>
<ul>
<li>Be <strong>honest</strong> on your resume. Most companies <em>will</em> ask you questions about your resume, and they can tell if you made it up. It’s better to be able to know <strong>100% about one project than to know 10% about 10 different projects.</strong></li>
<li>One-page resumes are <strong>recommended</strong>. This is especially true for tech companies, and it seems that the wisdom within the tech sphere is that you should reserve two pages and longer for post-doctoral work, or if you’ve done a lot of projects that you know and care deeply about. A friend of mine runs a <a target="_blank" href="https://www.jobscan.co/">company called Jobscan</a> that scans resumes and makes <em>specific, actionable</em> improvements on them. They’re pretty awesome, so try them out :)</li>
<li><strong>Socialize and establish a network</strong>. There’s a lot of competition for software engineering jobs, and these top tech companies are filtering through thousands of resumes a day. Having a referral will help you get some eyes on your resume.</li>
<li><strong>Nail</strong> your pitch. Every company that’s interested in you wants to know why you’re interested in them. <strong>A bad answer</strong>: I just need a job right now to pay bills. <strong>A less-bad answer</strong>: I was browsing online and found you guys. Sounds like you’re working on interesting things. <strong>A good answer</strong>: I know you’re doing some interesting work in X to achieve Y. I’ve done some work in the past and here’s what I learned about A, B, C that might be related to X. I am passionate about Y because blah. (<em>Don’t</em> use this as a template. Instead, you should see the pattern here — do your research, use your background, and show the company why both of you would fit well together.)</li>
</ul>
<h2 id="heading-some-more-advice">Some more advice</h2>
<p>Technical interviews are incredibly difficult, and sometimes it’s a hit-or-miss. The best opportunities, however, are reserved for those <em>who are prepared.</em></p>
<ul>
<li><strong>Prepare early, prepare <em>well</em></strong>. Everyone knows that they should prepare for an interview, but most don’t know how to do it <em>well</em>. As with anything worth doing, it takes deliberate practice to do well at something. And deliberate practice means you need to have a system.</li>
<li><strong>Build a system</strong> to practice technical skills. I started by rating myself from 1–10 on how good I was, and worked on the ones I was worst at. I spent days on different types of questions until I fully mastered each concept. And I <strong>wrote notes daily on Evernote</strong>. I had a note that serves as a brain dump for all things programming. It is full of programming tips &amp; tricks, common errors and misconceptions, frameworks for solving specific types of questions, and much more.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/02/my-notebook.png" alt="Image" width="600" height="400" loading="lazy">
<em>My notebook</em></p>
<ul>
<li><strong>Keep a notebook</strong> of the things you’ve learned. I use both <a target="_blank" href="http://evernote.com">Evernote</a> and <a target="_blank" href="http://onenote.com">OneNote</a> to keep track of things. OneNote for technical stuff/code, because I like that I can easily format the note any way I like. I use Evernote for essays/thoughts. The image above shows a note I keep on architecture and system designs.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/02/evernote.png" alt="Image" width="600" height="400" loading="lazy">
<em>Evernote for thoughts/tips</em></p>
<ul>
<li><strong>Jot everything down</strong>, even if you don’t think you’ll use it. I tend to forget very easily, so anything that I learn I write it down, including shell commands. I read technical blogs from time-to-time, and if I find anything interesting I jot it down on Evernote right away. I’ll revise it every week or month and reorganize accordingly. This has helped me tremendously over my career.</li>
<li><strong>Get mock interviews</strong>. This was definitely very valuable and I highly advise it. I had mock interviews with friends and tried to practice as much as I could. If you can’t find friends to practice with, then I recommend Refdash, which is an Interview-As-A-Service. They have a group of interviewers who work at big tech companies like Google, Facebook, and Microsoft. These interviewers will assess you on your coding and design skills. The best part of it is they’ll give you a score at the end of it with specific actionable items on how to improve.</li>
<li>It’s <strong>OK to fail. I failed multiple interviews during this whole process.</strong> Sometimes you just have a bad day. It’s not the end of the world if you fail. Companies are biased towards saying no because it’s a lower risk for them. A false positive costs more than a false negative in the long run. The first few rejections definitely stung the most. I failed multiple phone screens when I first started interviewing, and my confidence level sunk. I had doubts in my mind about my abilities and started fearing that my skills weren’t relevant in today’s job market. However, I gave myself a tip: If you fail 10 times, then try 10 times more. <em>All you need is one success.</em> That reassurance gave me a lot of confidence to keep pushing through and when my first offer came through, the other offers came much more easily.</li>
</ul>
<p>It took me about <strong>2 months</strong> of deliberate practice and preparation for my interviews. I spent about <strong>20 hours/week, or 80 hours/month,</strong> learning and writing notes on top of a full time job.</p>
<p>To build up my resume, it took 3.5 years of focused, deliberate work. I intentionally picked things that were tough and icky so that I could learn more than anyone else. Even though I don’t have a brand name university or top-tier tech company on my resume, I made up for it with a clear, thorough understanding of the projects I worked on. And this was possible because I researched and wrote down notes of everything I learned, and have a system to review them.</p>
<p>Remember: the strong survives, the tough thrives.</p>
<p>TL;DR: Don’t give up, set yourself up for opportunities, practice a lot, and stay hopeful. Focus on the process, and take a disciplined, dedicated approach to the process.</p>
<h3 id="heading-tools-i-recommend">Tools I Recommend</h3>
<ul>
<li><a target="_blank" href="https://amzn.to/2I80wup">Designing Data-Intensive Applications</a>: Awesome book for learning about scaling distributed systems! Highly recommended.</li>
<li><a target="_blank" href="http://amzn.to/2Dcs6Qd">Elements of Programming Interviews</a>: Great for solving coding problems.</li>
<li><a target="_blank" href="http://amzn.to/2Hj91OH">Cracking The Coding Interview</a>: Great for covering foundational CS coding problems.</li>
<li><a target="_blank" href="https://www.dailycodingproblem.com/zhiachong">Daily Coding Problem.com</a>: This is a free-to-try website that offers free daily coding problems. You can sign up for interesting daily coding challenges, and you can pay for solutions if you want.</li>
<li><a target="_blank" href="https://db.tt/tdUSP79S">Dropbox</a>: I keep all my files, pictures, resume here. Easy access, installed once and available everywhere. Love it ❤️ (If you sign up thru this link, both of us will get free 500MB!</li>
<li><a target="_blank" href="https://coderunnerapp.com/">CodeRunner</a>: I love this Mac app! I used this multiple times to run ad-hoc Python scripts/functions and it just works amazingly well. ?</li>
<li><a target="_blank" href="https://amzn.to/2D8FUxS">Kafka the Guide</a>: I used this book as a reference guide, and enjoyed it for the high-level description.</li>
</ul>
<p>(I share more resources I personally have used and recommend on <a target="_blank" href="http://zhiachong.com/resources">zhiachong.com</a>, if you’re interested in learning more.)</p>
<p>Thanks for reading my story! You can find me on <a target="_blank" href="https://twitter.com/zhiachong">Twitter</a> and <a target="_blank" href="https://www.linkedin.com/in/zhiachong/">LinkedIn</a>. I would love to connect and talk more about tech, startups, travel :D</p>
<p><strong>Credits:</strong></p>
<p><a target="_blank" href="https://twitter.com/hakczar">Brandon O’brien</a>, my mentor and good friend, for proof-reading and providing valuable feedback on how to improve this article.</p>
<p><a target="_blank" href="https://medium.com/@yksugi">YK Sugishita</a>, an up-and-coming Youtube star who left his job at Google to pursue his dreams, for proof-reading and giving critical feedback.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to develop a great Facebook login flow with Firebase and Ionic ]]>
                </title>
                <description>
                    <![CDATA[ By Ryan Gordon It’s helpful to use social sign-ins with Ionic for your users who would rather not create and remember another username:password combination. Instead, you can allow users to sign in with accounts they already own. You don’t need to sto... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-develop-a-great-facebook-login-flow-with-firebase-and-ionic-656a295c4fe9/</link>
                <guid isPermaLink="false">66c351b5c2631756f9f063bd</guid>
                
                    <category>
                        <![CDATA[ authentication ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 05 Jul 2018 22:09:49 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*YftIGPfmk-Sok90hvhY05Q.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Ryan Gordon</p>
<p>It’s helpful to use social sign-ins with Ionic for your users who would rather not create and remember another username:password combination. Instead, you can allow users to sign in with accounts they already own. You don’t need to store hashed passwords to compare, you don’t have to handle sending sign up emails, and you don’t need to reset passwords. The user’s chosen provider will handle all of this for you.</p>
<p><strong>Do you want just check out the code instead of following the post? Please give the <a target="_blank" href="https://github.com/Ryan-Gordon/Ionic-Firestarter">repo</a> a star in you find it helpful!</strong></p>
<p>Some of this post will be very similar to the other tutorials on my page. If you have ionic and Node installed and have a project setup, you can jump to the code <a class="post-section-overview" href="#6156">here</a> .</p>
<p>To follow along with this tutorial, youll need both Node.js and Ionic installed.</p>
<p>To install ionic and cordova, which for the moment is needed for plugins, run the following in your terminal after installing Node:</p>
<pre><code class="lang-bash">npm install -g ionic cordova
</code></pre>
<p>If you get EACCES: permission denied, you may need to run the command with sudo.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*O7an59vwaCcUeF8YHm9frg.png" alt="Image" width="800" height="314" loading="lazy"></p>
<p>Create an app with ionic start  . For this, use a blank template as a starting point.</p>
<p>The code for Facebook sign-in will be put into a provider class which will be called by whichever page needs to use that sign-in method.</p>
<pre><code class="lang-bash">ionic g provider auth
</code></pre>
<h3 id="heading-setup-app-with-firebase-and-get-credentials">Setup app with Firebase and get credentials</h3>
<p>In order for Firebase to work with the Facebook platform, we will need to perform three steps:</p>
<p>— Setup a new App in the Facebook developer’s portal</p>
<p>— Setup Facebook sign-in on Firebase</p>
<p>— Implement the sign-in flow</p>
<h4 id="heading-facebook-developers-portal">Facebook Developer’s Portal</h4>
<p>The Facebook Developers Portal is an interface to all of the developer tools and APIs available. It is what we’ll use to setup the sign-in API on Facebook’s side.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*8GTVmvTMHbsN8-i0_BJp0w.png" alt="Image" width="800" height="536" loading="lazy"></p>
<p>Choose a name and a contact email for your app. The contact email may be shown to users, so make sure it’s professional.</p>
<p>After this, the app will be created in facebook and we can add the plugin to our application!</p>
<p>There will be two plugins needed. The cordova plugin designed to work with Facebook natively, and a wrapper for it.</p>
<pre><code class="lang-bash">$ ionic plugin add cordova-plugin-facebook4 --variable APP_ID=<span class="hljs-string">"123456789"</span> --variable APP_NAME=<span class="hljs-string">"myApplication"</span>
</code></pre>
<p>You’ll need to replace the values or <code>APP_ID</code> and <code>APP_NAME</code> for your real credentials. You can find both of those inside your Facebook Developer’s Dashboard.</p>
<p>The other plugin will allow us to work with the first one, through TypeScript.</p>
<pre><code class="lang-bash">npm install --save @ionic-native/facebook
</code></pre>
<p>Now we have the plugin installed and wired up to the Facebook console.</p>
<p>There are two final steps for this: selecting which platforms we will use on the FB Developer Portal and importing in the app.module.</p>
<h4 id="heading-selecting-platforms-in-fb-portal">Selecting Platforms in FB portal</h4>
<p>Our app is created, however we need to specify which apps can use our sign-in API. This is done by adding platforms with a bundle ID we specify.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*3apVFW4u2k0k_2piCMPA9w.png" alt="Image" width="800" height="502" loading="lazy"></p>
<p>To begin click Add Platform, select either Android or iOS. Both platforms will need to know the generated ID of your app when it is in deployment.</p>
<p>The ID value found at the top of your config.xml will be used for both the Google Play store package name and the BundleID.</p>
<blockquote>
<p>Don’t forget to also import the plugin in your <code>_app.module.ts_</code> and specify it as a provider for the project.</p>
</blockquote>
<h3 id="heading-setup-facebook-sign-in-on-firebase">Setup Facebook sign-in on Firebase</h3>
<p>Setting up the sign-in within Firebase will be the easiest task. Once the app is created on the FB developer’s portal, it will have an APPID and an APPSECRET. These two values are needed to link Firebase to our Facebook app.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*58Khs2B3iNFKDVWxsGwviA.png" alt="Image" width="800" height="654" loading="lazy"></p>
<p>Once these values are input, click enable and that’s it!</p>
<h3 id="heading-implement-the-sign-in-flow">Implement the sign-in flow</h3>
<p>After all of the configuration, we have made it to the fun part: coding the thing and testing it!</p>
<p>Provided you have been following, the two Facebook Ionic plugins are now installed and the app is setup in Firebase and FB Dev Portal.</p>
<p>Before we can use the plugin in our code, we must import it and bring it into scope with the constructor. After this we are free to use the plugin anywhere in this provider.</p>
<pre><code class="lang-ts"><span class="hljs-keyword">import</span> { Facebook } <span class="hljs-keyword">from</span> <span class="hljs-string">'@ionic-native/facebook'</span>;

<span class="hljs-meta">@Injectable</span>()

<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> AuthProvider {

<span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">private</span> googlePlus: GooglePlus, <span class="hljs-keyword">private</span> facebook:Facebook</span>) {

}
</code></pre>
<p>The code for the login itself will seem very familiar if you’ve seen the other posts. What we are doing here is using the native Facebook plugin to do a sign-in flow. If it’s succesful, take the provided authresponse and sign into Firebase.</p>
<p>This function can be called anywhere in the app by importing the auth provider. The intended way to use this will be that some page (such as <code>home.ts</code>) will have AuthProvider in scope. When the user clicks a FB login button, we will delegate the login to our AuthProvider.</p>
<p>Now when this function is called, a native Facebook UI will pop up asking for sign-in. Or if the user is already signed in it’ll just ask for OAuth permission — and thats it! We get a token back which we can use to make a credential, and this credential is then used to sign into Firebase.</p>
<pre><code class="lang-ts">facebookLogin(): <span class="hljs-built_in">Promise</span>&lt;<span class="hljs-built_in">any</span>&gt; {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.facebook.login([<span class="hljs-string">'email'</span>])
      .then( <span class="hljs-function"><span class="hljs-params">response</span> =&gt;</span> {
        <span class="hljs-keyword">const</span> facebookCredential = firebase.auth.FacebookAuthProvider
          .credential(response.authResponse.accessToken);

        firebase.auth().signInWithCredential(facebookCredential)
          .then( <span class="hljs-function"><span class="hljs-params">success</span> =&gt;</span> { 
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Firebase success: "</span> + <span class="hljs-built_in">JSON</span>.stringify(success)); 
          });

      }).catch(<span class="hljs-function">(<span class="hljs-params">error</span>) =&gt;</span> { <span class="hljs-built_in">console</span>.log(error) });
  }
</code></pre>
<h3 id="heading-conclusion">Conclusion</h3>
<p>In this article, we have setup the Facebook sign-in API and worked through a cross platform solution for signing users into our Firebase with Facebook.</p>
<p>Same as the Google Sign-In, there was some confirguration needed (although not as much). Now the benefit is that our users can sign into any web apps we build with their existing Facebook accounts. If you followed the first article too, then the app now has Google and Facebook sign-in!</p>
<p>All the code for this tutorial (and all my other tutorials) can be <a target="_blank" href="https://github.com/Ryan-Gordon/Ionic-Firestarter">found here</a>. I am aiming to implement as many of the Firebase features as I can, and YES I am looking for contributors!</p>
<p>If you want access to the code, here again is a link to the repo :</p>
<p><a target="_blank" href="https://github.com/Ryan-Gordon/Ionic-Firestarter"><strong>Ryan-Gordon/Ionic-Firestarter</strong></a><br><a target="_blank" href="https://github.com/Ryan-Gordon/Ionic-Firestarter"><em>Ionic-Firestarter — Ionic Firestarter is a open source project showcasing different Firebase features implemented in…</em></a><br><a target="_blank" href="https://github.com/Ryan-Gordon/Ionic-Firestarter">github.com</a></p>
<p>Want some similar posts on Ionic ? Here is a couple other posts I’v done:</p>
<p><a target="_blank" href="https://www.freecodecamp.org/news/how-to-dynamically-theme-your-ionic-application-and-make-your-users-happy-ffa17e15dbf7/"><strong>How to dynamically theme your Ionic application and make your users happy</strong><br><em>Designing a sleek color scheme for your mobile application can be time consuming. Why not let the user choose their own…</em></a>  </p>
<p><a target="_blank" href="https://medium.com/@ryangordon210/alternative-sign-in-methods-for-firebase-with-ionic-52714ee9be83"><strong>Alternative Sign in Methods for Firebase with Ionic</strong></a><br><a target="_blank" href="https://medium.com/@ryangordon210/alternative-sign-in-methods-for-firebase-with-ionic-52714ee9be83"><em>In my other posts on Firebase sign ins, a focus has been put on Social providers. The main point of this emphasis is to…</em></a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I got interviews at Google, Facebook, and Bridgewater and what I learned ]]>
                </title>
                <description>
                    <![CDATA[ By Tomiwa In the summer after my 3rd year of university, I decided that I wanted to work at a top tech company such as Google or Bridgewater. There was problem, though. I didn’t go to a target school, my grades were just okay, and my work experience ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-got-interviews-at-google-facebook-and-bridgewater-590c7c669592/</link>
                <guid isPermaLink="false">66c34dc030aba6677fb9f9f3</guid>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ hedge funds ]]>
                    </category>
                
                    <category>
                        <![CDATA[ interview ]]>
                    </category>
                
                    <category>
                        <![CDATA[ jobs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Life lessons ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 06 Apr 2018 10:15:59 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/0*UJU8MZoJYCUmNIwL." medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Tomiwa</p>
<p>In the summer after my 3rd year of university, I decided that I wanted to work at a top tech company such as Google or Bridgewater. There was problem, though. I didn’t go to a target school, my grades were just okay, and my work experience consisted of being a janitor and IT Tech support. I knew if I wanted to get a chance at these top companies, I would have to get creative.</p>
<p><strong>The <a target="_blank" href="https://atila.ca/blog/tomiwa/how-i-got-interviews-at-google-facebook-and-bridgewater">original post</a> can be found on <a target="_blank" href="https://atila.ca/blog/tomiwa/">my blog</a>.</strong></p>
<p>This article details how I was able to get interviews at companies like Google, Facebook, Bridgewater, and others. If you think you have some sort of weakness or background that precludes you from getting a shot at these companies, hopefully you’ll see that you can get a chance at companies like this as well.</p>
<p>Note: I’ve also included a <a target="_blank" href="https://docs.google.com/presentation/d/1UbtDvjFmu_tkwtcO8MnXJes6aJnfCh9eJ-uNTbwBaI0/edit#slide=id.g3598deeb79_0_140">Google Slides summary</a> of this article.</p>
<p><a target="_blank" href="https://docs.google.com/presentation/d/1UbtDvjFmu_tkwtcO8MnXJes6aJnfCh9eJ-uNTbwBaI0/edit#slide=id.g3598deeb79_0_140"><strong>How I got interviews at Google, Facebook, and Bridgewater (Tech Version)</strong></a><br><a target="_blank" href="https://docs.google.com/presentation/d/1UbtDvjFmu_tkwtcO8MnXJes6aJnfCh9eJ-uNTbwBaI0/edit#slide=id.g3598deeb79_0_140">_How I got interviews at Google, Facebook, and Bridgewater (Tech Version) Advice for people who need experience to get…_docs.google.com</a></p>
<p>Here’s what we’ll cover:</p>
<p><strong>Rethink the Old School Method</strong></p>
<p><strong>Make Something Useful or Interesting</strong></p>
<p><strong>Tell People About It</strong></p>
<p><strong>Reasons Why You Won’t Do It</strong></p>
<p><strong>Case Study: Tomiwa’s Story</strong></p>
<p><strong>Appendix: Sample Email</strong></p>
<p>Ok, let’s get started.</p>
<h3 id="heading-rethink-the-old-school-method">Rethink the Old School Method</h3>
<p>When applying for jobs, most of us do the exact same thing: apply to the same postings as everyone else on the career center portal, send in a résumé that is virtually identical to all the other résumés, and if we’re feeling extra diligent, maybe even write a “customized” cover letter (you know, swap the company names).</p>
<p>Then when we ask why we aren’t getting many responses, we are told it’s because we need to use more “action words” in the cover letter or change the font size on the résumé.</p>
<p>However, this doesn’t address the real underlying issue. Only relying on résumés and cover letters is ineffective, because outside of name dropping, the school you went to, or an impressive company you worked for, it’s really hard to prove why you deserve a chance.</p>
<p>So we end up just writing a bunch of corporate jargon and buzzwords that no one actually wants to read. Which is probably why most résumés are never actually seen by humans but by computers scanning for certain “keywords” or humans scanning for certain “buzzwords” ? .</p>
<p>These strategies may have worked in the past, but in this modern internet age, there is definitely a better way to do this.</p>
<h3 id="heading-provide-tangible-proof-of-your-merit">Provide Tangible Proof of Your Merit</h3>
<p>The best way to prove how deserving you are is to make something interesting or useful and share it on the internet. When I say make, people often think that, since I am a software engineer, I expect everyone to learn how to code or be a visual artist.</p>
<p>Not necessarily. Making something can go beyond coding and artsy stuff. A blog post or slide deck is a very underrated way of quickly showing someone how smart, hardworking, and generally deserving you are.</p>
<p>Here are a few more examples of things I have recommended that people do in the past.</p>
<h4 id="heading-make-something-useful-or-interesting">Make Something Useful or Interesting</h4>
<p>I <strong>Strongly</strong> recommend <strong>writing a blog post</strong> on the topic/field that you are interested in. Easy topics to start with are taking something you learned in class or online and writing it in your own words. You can also look at a case study/stock pitch on something that you’re interested in.</p>
<p>For example, here is a <a target="_blank" href="http://blog.tomiwa.ca/austrian-quant">blog post</a> I wrote when I learned about machine learning and <a target="_blank" href="http://blog.tomiwa.ca/hedged-optimism-why-i-invested-botswana/">here is a blog post</a> from when I still thought I wanted to go into private equity (I still do, but not right now). Remember you’re not sending it to your university professor who is contractually obligated to read your 7,000 word essay. If it’s not well written, entertaining, or informative, it won’t get read (yours truly is still working on getting 2/3).</p>
<p>I recommend sites like <a target="_blank" href="https://medium.com/">Medium</a> and <a target="_blank" href="https://atila.ca/blog">Atila Blogs</a> as an easy way to get started and share your blogs with the people you want to read it.</p>
<p>Don’t know what to write about? See <a target="_blank" href="https://docs.google.com/presentation/d/1UbtDvjFmu_tkwtcO8MnXJes6aJnfCh9eJ-uNTbwBaI0/edit#slide=id.g3598deeb79_0_214">this slide</a> for more details</p>
<p>Now, for all you engineers and technical people: you probably already know the importance of having a Github account. But people may not have the time and cognitive load to read your source code. You should take the extra step of writing a short blog post explaining wat you built and how you built it. At the very least, you should have a well written <a target="_blank" href="https://gist.github.com/PurpleBooth/109311bb0361f32d87a2">README.md</a> explaining how someone should read your code: see <a target="_blank" href="https://docs.google.com/presentation/d/1UbtDvjFmu_tkwtcO8MnXJes6aJnfCh9eJ-uNTbwBaI0/edit#slide=id.g3598deeb79_0_214">this slide</a> for more information.</p>
<p>If you don’t enjoy writing, or you are a more visual communicator, you can also pretend that you are going to give a presentation on a topic you’re interested in and <strong>turn it into a slide deck</strong>. I personally really like <a target="_blank" href="https://www.google.com/slides/about/">Google Slides</a>, but <a target="_blank" href="https://www.slideshare.net/">Slideshare</a> seems to be really popular as well.</p>
<p>And lastly, if you are doing anything in the <strong>creative</strong> (fashion, music, arts) or <strong>lifestyle</strong> (fitness, cooking, travel) field, I recommend you get either a <strong>YouTube or</strong> I<strong>nstagram account</strong> and put your portfolio there. I usually recommend starting with Instagram, because it’s less intimidating to put a 30 second clip or a few photos on Instagram than creating a YouTube channel.</p>
<h4 id="heading-tell-people-about-it">Tell People About It</h4>
<p>Now that you’ve built something interesting or useful, you want to tell people about it.</p>
<p>I think everyone should have a website where you can post all your content and give people links to see it. People often feel daunted by the idea of a website. Things like like <a target="_blank" href="https://wordpress.com/">WordPress</a> (what I use) or <a target="_blank" href="https://www.squarespace.com/">Squarespace</a> make it really easy. Blogging platforms like Medium are another easy way to start.</p>
<p>If starting a dedicated website seems like overkill, setting up a Medium or Atila page is probably a good idea.</p>
<p>The mistake most people make about posting things on the internet is that they think the goal is to get traffic or “go viral.” The goal when you first start is to actually just create content specifically for the targeted people you are trying to impress and think of what brings them the most value.</p>
<p>Another benefit of posting on the internet is serendipity. If you write something interesting, people are likely to randomly come across it and share it with friends. Then the magic of the internet does the rest.</p>
<p>Another challenge I had was that I don’t have an extensive network, so it was tricky getting access to people who could provide me with an opportunity. We have the internet now, so you can just follow these steps:</p>
<ol>
<li>Make a list of all the companies you are interested in applying for and use LinkedIn to find people who are in your 1st-2nd connections that work at these companies.</li>
<li>Put their names, titles, companies, and emails into a spreadsheet</li>
</ol>
<p>Draft a brief email that’s personalized to each person. Keep in mind and provide the following things (and check out the sample email at the end of this article):</p>
<ol>
<li>Who you are and what you want from them (within the first two sentences). It should be brief, direct, and polite. The question of how direct to be is very situational, and if you are unsure, write an email draft and show various people who you think have good judgement and get their opinion</li>
<li>I used to be vague, but I realized that people are busy and they generally don’t want you to ask for a 15 minute “coffee chat” if what you really just want is an interview or a referral.</li>
<li>Include their name in the subject header</li>
<li>Share what you have done and why you deserve this opportunity.</li>
<li>Attach your resume and a link to your LinkedIn, website, blog, and so on.</li>
<li>Send the emails at about 6am in the recipient’s local time so they see it when they are going through their morning mail. There are many <a target="_blank" href="https://chrome.google.com/webstore/search/gmail">Gmail extensions</a> for this. You are using Gmail, right?</li>
<li>You can <a target="_blank" href="mailto:tomiwa@atila.ca">send me</a> any sample emails or content you have and I’d be happy to edit them for you.</li>
<li>Most people will not reply and some will only reply if you follow up with them. I recommend that every three days you send a follow up email, up to a maximum of 2–3 follow up emails (use those Gmail extensions to make it easier). The attached email also includes some sample follow ups to get you started.</li>
</ol>
<p>Many of you probably already use LinkedIn for networking but I think Twitter is lowkey another very underrated way of networking. I actually got an interview at Coinbase by sliding in the dms on Twitter. Note that networking on Twitter if very different from LinkedIn. See <a target="_blank" href="https://docs.google.com/presentation/d/1hsD1h3OWR_LiyZlgdWZyG_lDO11T_xq1riR-Z9JEhjI/edit#slide=id.g354b3028e7_0_56">this slide</a> for more details. My twitter: @<a target="_blank" href="https://twitter.com/tomiwa1a">tomiwa1a</a></p>
<h3 id="heading-reasons-why-you-might-not-follow-this-advice">Reasons Why You Might Not Follow This Advice</h3>
<p>I have given this advice enough times and I have been ignored enough times to know why people won’t try the things I suggest in this article. Here are a few of them:</p>
<h4 id="heading-im-too-busy"><strong>I’m too busy</strong></h4>
<p>This is the most common response I get, and personally the most frustrating. There is no such thing as being too busy, only priorities. So you don’t think allocating time to do this is a priority for you. You see the immediate benefit of getting good grades. But you don’t see the immediate benefit of learning something that you’re not getting a grade or getting paid for, and you don’t see the benefit of sharing something online.</p>
<p>In my opinion, this is a big mistake. In the long term, personal development and developing your network will be the best investment you can make in yourself.</p>
<h4 id="heading-posting-on-the-internet-is-bad-what-if-a-potential-employer-doesnt-like-what-i-post"><strong>Posting on the Internet is bad. What if a potential employer doesn’t like what I post?</strong></h4>
<p>A lot of us have been scared by anecdotal stories of someone doing something dumb on social media and the backlash they faced. The reality is that for every one horror story, there are 10 times more stories of people posting something useful on the internet that opens more opportunities for them. We just don’t talk about them as much.</p>
<p>Only post something positive that you think will be interesting or helpful for someone and that you are willing to stand behind. There will be a small subset of the population that will always be upset regardless. Consider that their disapproval may be a blessing in disguise, because why would you even want to work with such a person? The vast majority of people who read what you post will find it useful, and you will have built up goodwill amongst that group of people. This will be a net positive for you.</p>
<p>I put skin in the game and only recommended advice that I have taken myself. Let me tell you my story.</p>
<h3 id="heading-case-study-tomiwas-story">Case Study: Tomiwa’s Story</h3>
<p>After my 3rd year of university, I had previously worked in IT support and as a janitor for my last two summer “internships.” I really wanted to get an internship more related to software engineering, so I set my sights on Google, Facebook, and the rest.</p>
<p>All I needed was one chance to prove that I was a capable engineer that gets things done, but how could I prove I deserved that chance? I didn’t go to an Ivy league school, my “network” wasn’t that strong, I did side projects instead of extracurriculars, and my grades were just okay.</p>
<p>So I knew I couldn’t rely on the same strategies everyone else was using — I had to get creative.</p>
<p>I took a <a target="_blank" href="https://pythonprogramming.net/machine-learning-tutorial-python-introduction/">tutorial on machine learning</a> (and I really recommend that site for anyone looking to learn python). If you’re looking to learn coding, I also really recommend learning Python and JavaScript, but that’s another blog post. Most people who take the initiative to learn things online stop there. You started well by learning something by yourself, so you need to finish well by sharing what you learned with others.</p>
<p>I decided to take what I learned and <a target="_blank" href="http://tomiwa.ca/talks/ml.html">gave a tech talk</a> about it at my work. Then I created <a target="_blank" href="http://blog.tomiwa.ca/austrian-quant/">a pretty cool machine learning algorithm</a> that outperformed the sp500 over a 7-year period and <a target="_blank" href="https://github.com/ademidun/austrian-quant">wrote about how I did it</a>.</p>
<p>Finally, I did what everyone these days does when they do something noteworthy: I went on social media and told people about it. I used every single channel available to me and posted it there. I also compiled a list of recruiters and engineers in the companies I was looking for and emailed them about what I built (all like I outlined above — as I said, I only give advice that I have taken myself. Skin in the game, my friends).</p>
<p>Long story short, by the end of the fall I had interviewed with companies like Facebook, Google, and Bridgewater, amongst others.</p>
<p>Unfortunately, I only made it to the second round of both Facebook and Google, and there were visa issues with Bridgewater. I was disappointed, but overall I was happy that I at least got a chance and made it this far, considering where I started.</p>
<p>I also consider it a blessing in disguise, because that nudged me even more to start my own company, <a target="_blank" href="https://atila.ca/">Atila.ca</a>. Like I said, looking at my resume or LinkedIn, there is nothing particularly special about me. So say to yourselves “if Tomiwa can do it, so can I” and let’s get to work.</p>
<p>If you know anyone trying to get a job interview or just get noticed for an opportunity, share this article with them. I think there is some advice here that can really help. If you have any questions feel free to leave a comment or shoot me an email <a target="_blank" href="mailto:tomiwa@atila.ca">tomiwa@atila.ca</a>.</p>
<h3 id="heading-heres-that-sample-email-and-follow-ups">Here’s that Sample Email and follow-ups</h3>
<p>You can use these emails as a starting template, and feel free to leave a comment below or email me, <a target="_blank" href="mailto:tomiwa@atila.ca">tomiwa@atila.ca</a>, if you want me to review your resume, emails or any thing you’ve made.</p>
<p><strong><em>Email Subject:</em></strong> <em>Sally, Software Engineering and Business Student — Feb 9 *</em></p>
<p><em>Hey Sally**,</em></p>
<p><em>My name is Tomiwa Ademidun, I am currently a 3rd-year dual degree student in Software Engineering and Business at the Ivey Business School at Western University. I noticed that you work at Stripe, which is a company I really admire and I would really like to work for.</em></p>
<p><em>I would like to find out more about how you were able to become a Software Engineer at Stripe, your experience at Stripe and any advice you may have on software engineering internship opportunities.</em></p>
<p><em>More specifically, I know that one of the best ways of getting an interview is through the referral process. Obviously, your credibility and reputation are very important and you want to make sure that you refer someone who actually deserves to be referred.</em></p>
<p><em>I have included links to an</em> <em>article</em> <em>about a cool coding project I did this summer, my</em> <em>website</em> <em>and my</em> <em>GitHub__. Hopefully, after reviewing my work and talking with me you can decide if I am deserving of a referral.</em></p>
<p><em>Kind Regards,</em></p>
<p><em>Tomiwa Ademidun</em></p>
<ul>
<li>I Probably could have come up with a better email subject tbh. Let me know if you guys have any tips for good email subjects.</li>
</ul>
<p>**Obligatory, not their real name.</p>
<p><strong>Follow Up 1</strong></p>
<p><em>Hey I was following up on my last message to see if you have had a chance to respond.</em></p>
<p><strong>Follow Up 2</strong></p>
<p><em>Hey Sally,</em></p>
<p><em>Just following up on my last message. Looking forward to hearing back from you when convenient.</em></p>
<p>Sally ended up not replying at all, but that’s okay because Steve** replied. Most people are like Sally — but don’t give up because all you need is one Steve and then its showtime.</p>
<p><em>Originally published at <a target="_blank" href="https://atila.ca/blog/tomiwa/">atila.ca/blog/tomiwa</a> on April 6, 2018.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Updated: Airline websites don’t care about your privacy: a case study on Emirates.com ]]>
                </title>
                <description>
                    <![CDATA[ By Konark Modi I asked my wife if it is alright if her Date of Birth is known to a stranger. Only if they send me a birthday gift, she joked. What about your passport number? She lowered the book she was reading. I now had her attention. Now imagine ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-airlines-dont-care-about-your-privacy-case-study-emirates-com-6271b3b8474b/</link>
                <guid isPermaLink="false">66c34cb50f58901a62091799</guid>
                
                    <category>
                        <![CDATA[ cybersecurity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ privacy ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sat, 03 Mar 2018 00:56:18 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*61m9JVlYvpvORj2IUlp-4w.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Konark Modi</p>
<p>I asked my wife if it is alright if her Date of Birth is known to a stranger. Only if they send me a birthday gift, she joked. What about your passport number? She lowered the book she was reading. I now had her attention.</p>
<p>Now imagine this, I said “You try to check-in for your flight online, and see the error message — This booking does not exist. You try again, this surely is a mistake. Nope, still the same error message. The call center person repeats the same words. This has to be a mistake! You check your email, and there it is — staring back at you — email confirmation of cancellation. But you are sure you didn’t do it.” Whodunnit?</p>
<p>This is not a far-fetched scenario from a Sci-fi book, <a target="_blank" href="https://media.ccc.de/v/33c3-7964-where_in_the_world_is_carmen_sandiego">this really happened</a>.</p>
<p>An organisation with a primary Digital Product that lacks even the basic data security practices is living in a utopian world where people leave their safe open and never expect a burglar to walk in.</p>
<p>In the wake of full disclosure, sometime last year while booking travel for my family, I stumbled across a few data-security practices that, as a Data Security advocate, made me extremely worried. When I voiced my concerns to Emirates team, this conversation took place -</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/J98i59bZQiaHOsLcEjwt8BwljNL7iZvwi2Vt" alt="Image" width="800" height="654" loading="lazy">
<em>Conversation with Emirates support.</em></p>
<p>For a layman, when you book your flight through Emirates, Domestic or International, there are approximately <a target="_blank" href="https://pastebin.com/cAcXx2A4">300 data points</a> related to your booking.</p>
<p>The moment you click on manage preferences to select a seat or meal for your trip or to Check-in to your flight, your Booking ID and Last name is passed on to approximately 14 different third-party trackers like Crazy egg, Boxever, Coremetrics, Google, and Facebook among others.</p>
<h3 id="heading-details"><strong>Details</strong></h3>
<p>After I completed the booking on Emirates, I received an e-mail confirmation titled: Booking Confirmation — Booking Number.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/8-8XXdTlMKTutKcdyriWK1-UD4YgeZlyVGJL" alt="Image" width="800" height="229" loading="lazy">
<em>Booking confirmation email.</em></p>
<p>The body of the email contained Manage booking. I proceeded to select seats and meal by clicking on the Manage Booking button and reached the Manage Preference page. This was pretty straightforward.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/U2fdc81FxC3yRXi5ooiz2GLDMtJOS8Cks5nj" alt="Image" width="800" height="389" loading="lazy">
<em>Manage booking link in email.</em></p>
<p>While as a user, I saw the normal behaviour of clicking a link and reaching the landing page “Manage Preferences”, in the background a redirection chain took place.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/TJgXmvJ95h6sw3noBhTlGdU5OEVB7t9ZnKAQ" alt="Image" width="800" height="518" loading="lazy">
<em>Redirection chain before reaching the landing page.</em></p>
<p>While Manage Booking link was supposed to be exclusive to me (the user and the website), this link was also shared with numerous third party trackers implemented by Emirates on their webpages.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UfY2o2W4fksf1pZbNRZLXMNFjBqL6oLzQ5kU" alt="Image" width="800" height="409" loading="lazy">
<em>Manage booking page.</em></p>
<p>The cherry on the cake was the HTTP link that leads to the Manage Preferences page. The insecureness of HTTP has been <a target="_blank" href="https://medium.com/@pallavimodi/http-https-what-is-the-difference-3a97fe2f7fd8">talked</a> about over and over again, especially when it comes to maintaining the authenticity of the content and protection against interlopers. But in short, HTTP links are a Data Privacy nightmare. So, not only was Emirates passing on user information to the self-implemented third party trackers, but also allowing network adversaries to have access to the supposedly “Private” page.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/GUDfElLiP1iynwZ8AL84GTAMC27HCh8HMZqB" alt="Image" width="508" height="206" loading="lazy">
_[http://track.emirates.email/track/click/30705682/www.emirates.com?p=eMSwicCI6IntcInVcIjozM....(REDACTED)](http://track.emirates.email/track/click/30705682/www.emirates.com?p=eMSwicCI6IntcInVcIjozM....(REACTED)" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-what-kind-of-information-can-third-parties-access"><strong>What kind of information can third-parties access?</strong></h3>
<p>Links mentioned in (1) and (2) are currently being sent to the third-parties.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/blQnYPaptvr2V9k8ruJXyJGRaAmdhhrrpIgp" alt="Image" width="800" height="744" loading="lazy"></p>
<p>Following fields take home the URL, which gives access to booking details.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/S5Ah2kCOMZJznXUtFly-KRt1VltJgYrJl37d" alt="Image" width="800" height="232" loading="lazy">
<em>Fields which take home the private url.</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/CcJhlcel0E2cjrlD7WtgacQvlv4FF-4YGvbt" alt="Image" width="800" height="25" loading="lazy">
<em>Sending url in key <code>dr</code> used by Google Analytics.</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/DbuxeC1c16zWXNAguVpioFAOrfXXq0F9cdVE" alt="Image" width="800" height="304" loading="lazy"></p>
<p>Anyone who has access to these links can not only read but also edit the information that I as a user can.</p>
<p>For example, they can now -</p>
<ol>
<li>Change or Cancel flight</li>
<li>Change seat or meal preference</li>
<li>Add more products to the booking</li>
<li>Change or add Passport Information</li>
<li>Change or add Frequent Flyer Information, etc.</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/MJWQLCMrz6SWu2nMTuq3fm7swGiAfxl3hOO0" alt="Image" width="800" height="209" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-NJQfaC6PV7DtifczwFIsA0ZDRRksu-EfopD" alt="Image" width="800" height="91" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/vxvDjZC9XrDCMiaWBG-WWrs4hhWzRapLS2by" alt="Image" width="764" height="656" loading="lazy">
<em>Modify booking.</em></p>
<p><strong>Exhibit of editable personal information on this page:</strong></p>
<p><strong>a. Full Name:</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/B3TaqII7bAoKkofhVk21DY040GlpuBHQ-wQP" alt="Image" width="800" height="114" loading="lazy">
<em>Name.</em></p>
<p><strong>b. Skywards number</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Pw9KljVJmGJOZCbxPjC4R4XFYy2Id4EdJsjw" alt="Image" width="800" height="91" loading="lazy">
<em>Skywards number</em></p>
<p><strong>c. Email ID / Telephone number:</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/IXHrwJuTbuoulITQC4tADyQKdE79YKYR62DV" alt="Image" width="800" height="109" loading="lazy">
<em>Read / Change personal information</em></p>
<p><strong>d. Amount Paid, fare breakup.</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/F76wEiebLxzeqNvF1mrtmweKg9z4huZqJsby" alt="Image" width="800" height="222" loading="lazy">
<em>Amount paid, form of payment, fare break-up.</em></p>
<p><strong>e. Passport details, Nationality, Date of birth, Gender</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/0zHmM1qv8K4ZqfE6fbG4MRnAfGgKrwAEK1ms" alt="Image" width="800" height="361" loading="lazy">
<em>Passport details, DOB, Expiry, Gender, Nationality.</em></p>
<p><em>Note:</em> In October 2017, fields such as Passport Number, Email Id and Telephone number were shown to be masked on the User Interface but were not obfuscated in source code. The web app has been revamped since then and these fields are now obfuscated.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/8EbqAkIVUoJKvI6RnBvGSlDOG1hll183ivzO" alt="Image" width="800" height="121" loading="lazy">
<em>Masked fields in plain text. (October 2017)</em></p>
<p>I decided to take a peek into the mobile app and see if the past catches up with the present, and lo and behold there it was in its full glory — Passport Number, Email ID and Telephone number in plain text. What was obfuscated on the web app was easy to access on the mobile app.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/FOZAgyc668QqoBD3zh17PB6fOdh0ir4oSCD8" alt="Image" width="671" height="482" loading="lazy">
<em>Passport details in plain text on mobile API.</em></p>
<p><strong>Now, what is wrong with this?</strong></p>
<p>This issue is not only limited to Emirates, a lot of airlines like Lufthansa, KLM (last checked on October 2017) suffer from the same issues.</p>
<p>Every website uses third party trackers for improving their product and provide better web-usage experience. Data leaks are often considered collateral-damage and sometimes not even considered at all while implementation of such trackers.</p>
<p>Most of these third-parties are present on a lot of other websites and use long term identifiers like cookies etc to track users across domains. Now because one of the websites, in this case Emirates, leaks private information, these companies now potentially can not only link the user’s activity across web, but also identify who the user is.</p>
<p>The questions that need answering by Emirates (and others) are -</p>
<ol>
<li>Why was my booking information passed on to these third parties without my explicit consent.</li>
<li>Why do these third parties need to receive this information?</li>
<li>Is Emirates even aware that sensitive user information is being leaked to these third parties?</li>
<li>Who are these third parties?</li>
<li>What are they doing with user information?</li>
</ol>
<h3 id="heading-reporting-it-to-emirates"><strong>Reporting it to Emirates</strong></h3>
<p>In the wake of responsible behaviour, on discovering these serious security flaws that violate user-data privacy, I decided to flag them to Emirates through Twitter DM in October 2017. Please note that I could not find a dedicated channel for reporting security bugs on Emirates website.</p>
<p>The Social Media Team immediately responded to my Twitter DM with a canned response but I was not ready to give up hope. I also wrote an email to the Product Manager highlighting the security flaws. I was met with a deafening silence.</p>
<p>As of today (2018–03–03) lot of these issues still persists.</p>
<p>This is a serious violation of privacy, there is no point during the whole booking process, where I agreed upon sharing any of this personal information with any of these websites.</p>
<p>The <a target="_blank" href="https://www.emirates.com/english/sitetools/privacy_policy.aspx">privacy policy</a> of Emirates itself is not very clear. It does <a target="_blank" href="https://www.emirates.com/english/sitetools/cookie-policy.aspx">mention some of the of these services</a>, but not all or the what data being shared with them.</p>
<h4 id="heading-can-i-not-opt-out"><strong>Can I not opt-out?</strong></h4>
<p>Not an option. Unfortunately, I could not find a way to opt-out of this system provided by Emirates. I finally had to fall back on using privacy preserving browser extensions.</p>
<h4 id="heading-can-this-not-be-fixed-by-emirates"><strong>Can this not be fixed by Emirates?</strong></h4>
<p>As a Software Engineer who has worked for the some of the largest eCommerce companies, I understand the need to use third party services for optimising and enhancing not only the Digital Product but also how user interacts with the product.</p>
<p>It is not the usage of third party services that is of concern here in this case but the implementation of these services. Emirates has the control of their website and what the website shares with third party services. It is this control that needs to be exercised to limit the leakage of User information.</p>
<p>It is not a mammoth task, it is just a matter of commitment to preserving the basic right to privacy.</p>
<p>For example:</p>
<ol>
<li>Private pages should have <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta">noindex meta tags</a>.</li>
<li>Limit the presence of third-party services on private pages.</li>
<li><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy">Referrer-Policy</a> on pages with sensitive data.</li>
<li>Implement CSP and SRI. Even with a huge footprint of third-party services <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP">CSP</a>, <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity">SRI</a> are not enabled on Emirates.com</li>
<li>User needs to be informed when sensitive information like passport, contact details etc. is updated, edited, or deleted.</li>
<li>Domain for sending e-mails : track.emirates.email, should have a valid certificate. <a target="_blank" href="https://track.emirates.email/">https://track.emirates.email/</a></li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/n04rAIAp6Z1zBmHuWz4symTvtvVt7W-nTKOP" alt="Image" width="800" height="504" loading="lazy"></p>
<p>If you are interested in reading more about the presence of trackers on your favourite websites, I highly recommend checking out <a target="_blank" href="https://whotracks.me/">WhoTracksMe</a>.</p>
<p><strong><em>Updates:</em></strong></p>
<p><strong><em>- March 6th, 2018:</em></strong></p>
<p><em>Emirates responded with a standard statement.</em></p>
<p><em>Excerpt: “<strong>The depiction in Mr Modi’s article as to what data is being shared, or customer choice in ‘opting out’ is inaccurate.”</strong></em></p>
<p><em>Here is my response: <a target="_blank" href="https://medium.com/@konarkmodi/privacy-leaks-round-trip-emirates-com-in-denial-7f99950bcdd">Privacy leaks round-trip: Emirates.com in denial</a></em></p>
<p>Happy Hacking!</p>
<ul>
<li><a target="_blank" href="https://twitter.com/konarkmodi">Konark Modi</a></li>
</ul>
<p>Thanks for reading and sharing ! :)</p>
<p>If you liked this story, feel free to ??? a few times (Up to 50 times. Seriously).</p>
<p>_Credits: Special thanks to <a target="_blank" href="https://twitter.com/Pythux">Remi</a> ,<a target="_blank" href="https://twitter.com/Pi_Modi">Pallavi</a> for reviewing the post._</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ I figured out a way to hack any of Facebook’s 2 billion accounts, and they paid me a $15,000 bounty… ]]>
                </title>
                <description>
                    <![CDATA[ By AppSecure I am publishing this with the permission of Facebook under the responsible disclosure policy. They have fixed this vulnerability. This post is about a simple vulnerability I discovered on Facebook which I could have used to hack into oth... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/responsible-disclosure-how-i-could-have-hacked-all-facebook-accounts-f47c0252ae4d/</link>
                <guid isPermaLink="false">66c35df3c337fbd10a4b5947</guid>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 09 Feb 2018 11:41:36 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*YxD3C1C9qLsIGG4pqLv7ig.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By AppSecure</p>
<p>I am publishing this with the permission of Facebook under the responsible disclosure policy. They have fixed this vulnerability.</p>
<p>This post is about a simple vulnerability I discovered on Facebook which I could have used to hack into other users’ Facebook accounts easily and without any user interaction.</p>
<p>This gave me full access to other users account by setting a new password. I was able to view messages, their credit/debit cards stored under their payment section, personal photos, and other private information.</p>
<p>Facebook acknowledged the issue promptly, fixed it, and rewarded me with a US $15,000 bounty based on the severity and impact of this vulnerability.</p>
<h3 id="heading-how-the-hack-worked">How the hack worked</h3>
<p>Whenever a user Forgets their password on Facebook, they have an option to reset the password by entering their phone number and email address on <a target="_blank" href="https://www.facebook.com/login/identify?ctx=recover&amp;lwv=110&amp;__mref=message">https://www.facebook.com/login/identify?ctx=recover&amp;lwv=110</a>.</p>
<p>Facebook will then send a 6 digit code to this phone number or email address which the user has to enter in order to set a new password.</p>
<p>I tried to brute force the 6 digit code on <a target="_blank" href="http://www.facebook.com/?__mref=message">www.facebook.com</a> and was blocked after 10–12 invalid attempts.</p>
<p>Then I looked out for the same issue on beta.facebook.com and mbasic.beta.facebook.com. Interestingly, rate limiting was missing from forgot password endpoint.</p>
<p>I tried to take over my own account (as per Facebook’s policy, you should not do any harm any other users’ accounts) and was successful in setting a new password for my account. I could then use this same password to log into my own hacked account.</p>
<h3 id="heading-a-proof-of-concept-video-of-the-hack">A proof of concept video of the hack</h3>
<p>As you can see in the video, I was able to set a new password for the user by brute forcing the code which was sent to their email address and phone number.</p>
<h3 id="heading-vulnerable-request"><strong>Vulnerable request</strong></h3>
<p><code>POST /recover/as/code/ HTTP/1.1</code></p>
<p><code>Host: beta.facebook.com</code></p>
<p><code>lsd=AVoywo13&amp;n=XXXXX</code></p>
<p>Brute forcing the “n” successfully allowed me to set new password for any Facebook user.</p>
<h3 id="heading-disclosure-timeline"><strong>Disclosure Timeline</strong></h3>
<p>Feb 22nd, 2016 : Report sent to Facebook team.</p>
<p>Feb 23rd, 2016 : Verified the fix from my end.</p>
<p>March 2nd, 2016 : Bounty of $15,000 awarded by Facebook</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I Built And Launched A Chatbot Over The Weekend ]]>
                </title>
                <description>
                    <![CDATA[ By Mike Williams Take your idea to functional bot in hours, get real user feedback, and launch before the weekend is over! ? _[Art Chatbot](http://www.artchatbot.com" rel="noopener" target="blank" title=")- Discover, learn about, and purchase artwor... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-built-and-launched-a-chatbot-over-the-weekend-ad8efc522f33/</link>
                <guid isPermaLink="false">66c34d68a1d481faeda49b80</guid>
                
                    <category>
                        <![CDATA[ #chatbots ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 26 Dec 2017 09:01:36 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*jqRtqR-Cdozt2FjBzkY9_w.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Mike Williams</p>
<h4 id="heading-take-your-idea-to-functional-bot-in-hours-get-real-user-feedback-and-launch-before-the-weekend-is-over">Take your idea to functional bot in hours, get real user feedback, and launch before the weekend is over! ?</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*jqRtqR-Cdozt2FjBzkY9_w.jpeg" alt="Image" width="800" height="408" loading="lazy">
_[Art Chatbot](http://www.artchatbot.com" rel="noopener" target="<em>blank" title=")- Discover, learn about, and purchase artwork through Messenger</em></p>
<p>Chatbots are not new. But they are a technology that most of us have probably read about, possibly used, and yet do not truly understand simply due to the lack of both everyday and prolonged exposure.</p>
<p>For months leading up to last Friday, I had bookmarked chatbot-specific publications (such as <a target="_blank" href="https://chatbotsmagazine.com">Chatbots Magazine</a>), liked Facebook posts about chatbots, and even upvoted some on <a target="_blank" href="https://www.producthunt.com/topics/bots">Product Hunt</a>.</p>
<p>I wanted to change my understanding of chatbots and challenged myself to learn as much as I could over the weekend. I had determined it was time to really understand chatbots through mastering the fundamentals and building my own.</p>
<h4 id="heading-like-most-projects-and-companies-ive-launchedhttpsmediumcomthinkbox-io-storiessharing-economy-scaled-to-hundreds-of-users-in-hours-70e4b8cc72eb-i-began-by-defining-the-following">Like Most Projects and <a target="_blank" href="https://medium.com/thinkbox-io-stories/sharing-economy-scaled-to-hundreds-of-users-in-hours-70e4b8cc72eb">Companies I’ve Launched</a>, I Began by Defining the Following:</h4>
<ul>
<li>Timeline: Sunday was my deadline since this was a weekend project.</li>
<li>Goals: Learn about the existing tools for chatbot developers that I could use to leverage technology and build on top of (I decided on <a target="_blank" href="http://www.chatfuel.com">Chatfuel</a>). This would provide me with a fundamental understanding of chatbots.</li>
<li>Success Outcome: Build a functional chatbot that did one thing well, iterate on real user feedback, and launch.</li>
</ul>
<p>Unlike past projects, I didn’t have the exact idea in mind prior to making the decision to begin.</p>
<p>I had a window open on my laptop displaying a limited artist print I was looking at (<a target="_blank" href="https://artlife-gallery.myshopify.com/collections/alec-monopoly/products/alec-monopolys-pablo-judicial-diamonds-and-gold-serigraph-screenprint">Alec Monopoly’s “Pablo Judicial”</a>). I simply typed “art chatbot” in Google to see if there was already a chatbot to purchase artwork.</p>
<p>To my surprise, there was not. I knew that my passion for art was the perfect match for my weekend desire to master chatbots.</p>
<p>I then removed the space in my search and had the name “Art Chatbot” in front of me. $9 and a few seconds later, and I also had the <a target="_blank" href="http://www.artchatbot.com">domain</a>.</p>
<p>Since it was still early Saturday morning and the above had taken place in the matter of about 30 minutes, I had an hour or so to create the logo (using <a target="_blank" href="https://logo.squarespace.com/">Squarespace logo creator</a>).</p>
<p>I then worked on lean branding for social assets (<a target="_blank" href="http://snappa.io">Snappa</a>), and also created the <a target="_blank" href="https://www.facebook.com/Art-Chatbot-127359754533703/">Facebook page</a> (which is required to build and test the bot since it is a Facebook Messenger Bot).</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*SmZGCWKPumBbnH7km3fmMA.png" alt="Image" width="390" height="362" loading="lazy">
<em>Squarespace logo in minutes, and free!</em></p>
<p>Now that I had the logo, social cover, and also had the Facebook page live, I invited a few friends to like the page.</p>
<p>I got a few messages back asking what I was up to with the page and commenting on the name and logo. And so within minutes of my lean branding exercise, I already had some positive feedback!</p>
<p>I then told them what I was building and asked if they could test in the following hours over the course of my build.</p>
<p>This led to real user feedback as I was building so that I could create a more realistic conversational design and flow for my chatbot.</p>
<p>After getting setup on <a target="_blank" href="http://www.chatfuel.com">Chatfuel</a>, I watched some YouTube tutorials and used some of the templates provided on Chatfuel to learn through modifying (thanks <a target="_blank" href="http://personabots.com/">Persona</a>!).</p>
<p>I realized that the process is fairly straightforward, and it was all about the conversational flow and user journey.</p>
<h4 id="heading-i-then-completed-the-following-definition-exercise-to-define-what-i-was-going-to-build">I Then Completed the Following Definition Exercise to Define What I Was Going to Build:</h4>
<ol>
<li>Map out the conversational flow and user journey. In this case, it was for a user to discover artists, view artwork, and purchase artwork.</li>
<li>Define the structure of the bot. In Chatfuel, this is done by “blocks,” which I created for each main state, sub states, destinations, queries, and answers.</li>
<li>Identify and also limit the amount of content that I would display. Since I was building this in hours, it was more about the experience and validation, rather then how robust I thought it should be.</li>
</ol>
<p>Actually building the bot in Chatfuel began at the second step with the blocks. It was mid-afternoon Saturday now and I was feeling a bit overwhelmed with the ambitious complexities I initially set out to build.</p>
<p>To overcome this, I removed some of the artists, the artwork to show, and then the artwork available so that I could focus on a better experience rather then trying to account for quantity.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*wK8vVRCRUs8wN2DLySIcnw.png" alt="Image" width="800" height="468" loading="lazy">
<em>Art Chatbot being built from the Chatfuel dashboard.</em></p>
<p>Before Saturday was over, I had completed the initial version of Art Chatbot. I had friends testing the chatbot and providing real feedback, and all of the social pages and assets were prepped to launch before the end of the weekend.</p>
<p>With this initial version completed, I spent Sunday feeling a bit less time-constrained. I was able to focus more on prepping for a launch along with continual chatbot iteration.</p>
<p>I also began implementing basic AI functionality into the bot. I messaged a few art technology companies to ask what data was valuable to them (knowing I could easily collect this). This way, I could be on their radar and possibly build a chatbot that had some monetary value through data down the road.</p>
<p>I ended the day on Sunday by making a quick landing page using <a target="_blank" href="http://instapg.es/jHPw7">Instapage</a> and optimizing it for a Product Hunt launch that I would do Monday.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*CdleOwKip2abI7x4ob8xww.png" alt="Image" width="800" height="578" loading="lazy">
_Created a [landing page](http://www.artchatbot.com" rel="noopener" target="<em>blank" title=") in a few minutes using Instapage and the content I used from the chatbot blocks.</em></p>
<p>To pre-launch the chatbot, I also setup <a target="_blank" href="http://botanalytics.co">Botanalytics</a> (to help monitor, track, and analyze messages), posted in <a target="_blank" href="https://www.facebook.com/groups/aichatbots/">Facebook Groups</a> to generate initial users, and then drafted my Product Hunt intro that I would post.</p>
<p>I also used a Google doc to create all the verbiage I would share on my social channels. Then I could simply copy the text, add the Product Hunt URL, and share across channels on Monday.</p>
<p>The result is that Art Chatbot hit 100 upvotes on <a target="_blank" href="https://www.producthunt.com/posts/art-chatbot">Product Hunt</a> and had also sent over 1,800 messages by the end of the day.</p>
<p>I not only learned about chatbots, but I am more confident in my understanding of the technology through a real use case. I also refined my ability and the process I used to build and launch a product rapidly.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*1DXJ0pQAVXQcpgt7HnQ9Nw.png" alt="Image" width="800" height="410" loading="lazy">
_From idea Saturday to [Product Hunt](https://www.producthunt.com/posts/art-chatbot" rel="noopener" target="<em>blank" title=") Monday!</em></p>
<p>Overall, I consider the weekend project a success — and more importantly, it was refreshing and fun!</p>
<p>I’ve also tried to “open source” everything about Art Chatbot’s build (I documented it on my <a target="_blank" href="http://www.instagram.com/yoroomie">social</a>) and the chatbot roadmap. I will continue to keep everything publicly accessible (link below) going forward for anyone that is interested in being involved or contributing.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*J6qc7NE2cp9ITd41vtrvMQ.png" alt="Image" width="800" height="290" loading="lazy">
<em>Day 2 analytics following Product Hunt launch.</em></p>
<p>Art Chatbot Open Sourced ? b<a target="_blank" href="http://bit.ly/artchatbotopensource">it.ly/artchatbotopensource</a></p>
<p>With an eagerness to learn and using the process above, it’s certainly possible for anyone to build their own chatbot in a weekend! ?</p>
<p><em>Be sure to tweet at me with any questions you have, feedback, and also let me know when you launch your own chatbot and I’ll check it out/retweet! You can also check out my personal chatbot I made after this weekend project <a target="_blank" href="http://m.me/itsyoroomieofficial">here</a>.</em></p>
<h3 id="heading-a-special-thanks-to-avery-andonhttpswwwinstagramcomaveryandonhlen-and-art-lifehttpsartlifecom-for-the-inspiration-during-the-creation-of-art-chatbot-art-life-is-the-official-online-gallery-for-both-artists-and-artwork-that-are-linked-as-urls-in-art-chatbot">*A special thanks to <a target="_blank" href="https://www.instagram.com/averyandon/?hl=en">Avery Andon</a> and <a target="_blank" href="https://artlife.com/">Art Life</a> for the inspiration during the creation of Art Chatbot. Art Life is the official online gallery for both artists and artwork that are linked as URL’s in Art Chatbot.</h3>
<p><em>Rather see a video format of this with more details? Watch this 12 minute video where I share more:</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ When is the best time to stream on Facebook Live? I analyzed 5,000 Facebook posts to find out. ]]>
                </title>
                <description>
                    <![CDATA[ By Ofir Chakon Streaming on Facebook Live can be a powerful marketing strategy for startups and businesses. They can share knowledge, provide value, get exposure and collect high-quality leads. Prepare your Facebook Live session upfront. Researching ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-best-time-to-stream-on-facebook-live-my-analysis-5-000-facebook-posts-c8346b732d0f/</link>
                <guid isPermaLink="false">66c360e4ef766eb77cd787d1</guid>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Entrepreneurship ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ marketing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 04 Oct 2017 20:42:29 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*Mrg0GKl9ZPW_mQv2iy0DHw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Ofir Chakon</p>
<p>Streaming on Facebook Live can be a powerful marketing strategy for startups and businesses. They can share knowledge, provide value, get exposure and collect high-quality leads.</p>
<p>Prepare your Facebook Live session upfront. Researching about your target audience and build a detailed agenda. The session can boost your business dramatically.</p>
<p>I was Chief of Product and Technology of my previous startup dealing with fraud detection. I decided to try Facebook Live as a new marketing strategy.</p>
<p>It was still fairly new at the time. Once a Facebook Live session was up, relevant people got Facebook notifications to join the session. This increased the exposure even more.</p>
<p>There are many posts talking about how to better build your Facebook live session. They discuss which topics to cover, building an agenda, camera angles, session duration, and more.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZHFfsew6XVks0GRiG80lhrRnI9MYiWckGZMD" alt="Image" width="800" height="533" loading="lazy"></p>
<p>But there is one piece of the puzzle that business owners and marketers often tend to forget or do not pay attention to: <strong>When is the best time to stream your Facebook Live session?</strong></p>
<p>You can answer this question using an educated guess based on your familiarity with the target audience.</p>
<p>For example:</p>
<ul>
<li>Pregnant moms are ready to consume your Live session on Monday afternoon.</li>
<li>Teenagers at the ages of 18–22 are in the right mindset on Saturday morning.</li>
</ul>
<p>But there is so much data around us that we can use with a few clicks of a button. You actually stay behind if you don’t make a proper usage of some of the data available.</p>
<p>Almost every marketing platform or social network opens API services. You, as a technological entrepreneur, can easily consume these. This data can provide valuable conclusions that can drive your business objectives beyond your competitors.</p>
<p>This approach is often called <strong>Data-driven decisions</strong>.</p>
<p>Once you start justifying any or at least most of your business decisions using data you own or data you can collect from different resources, you can stop guessing and start making data-driven decisions.</p>
<p>I like to think of data-driven decisions as crowd-sourcing. Lior Zoref was on <a target="_blank" href="https://www.youtube.com/watch?v=din2UVvRnGU">this TED talk</a> . He invited an ox to the stage and asked the audience to guess its’ weight. If you watched this, you were probably overwhelmed by how accurate the crowd’s average was compared to the real weight of the ox: 1,792 pounds or 1795 pounds!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/IvzzdOZzotoMqgIQ33aA3O9Rr9XGA5vWCg5C" alt="Image" width="800" height="516" loading="lazy"></p>
<p>When you’re making guesses about your business objectives as individuals, you’re not different than any individual sitting in the crowd and trying to evaluate the ox’s weight. You can even be the one who guessed 300 pounds or 8000 pounds, which may cost your business a lot of unnecessary expenses.</p>
<p>But, if you’re using the wisdom of the crowd to make data-driven decisions, you’ll most likely be ahead of every other individual. In business terms, you’ll be ahead of your competitors.</p>
<p>I’m not a pure marketer. But with basic data analysis skills I can push my business forward in all aspects, including marketing.</p>
<p>I’m going to walk you through a practical step-by-step guide about how to access Facebook data. Then how to analyze it based on our needs about the optimized time to broadcast on Facebook Live.</p>
<p>To follow this guide you need:</p>
<ul>
<li>A Facebook account</li>
<li>A Facebook group you would like to analyze<br>If it’s a private group then you need to be a group member</li>
<li>Python 2.7 installed</li>
<li>Jupyter notebook installed</li>
<li><a target="_blank" href="https://facebook-sdk.readthedocs.io/en/latest/api.html">Facebook graph API Python library</a> installed</li>
</ul>
<p>A Jupyter notebook is a recommended tool for data analysis in Python. It has a lot of highlights. It enables you to run snippets of code and save the results in memory. So you won’t run all your scripts over and over again every time you implement a minor change. This is crucial when doing data analysis because some tasks can take a lot of execution time.</p>
<p>Although it’s not essential, I recommend working inside a Python virtual environment. <a target="_blank" href="https://codingstartups.com/3-best-practices-better-setting-django-project/">Here is a post I wrote</a> about the advantages of a virtual environment when using Python.</p>
<p>I recommend working in an <a target="_blank" href="https://codingstartups.com/moved-windows-linux-lessons-learned/">Ubuntu environment</a> when doing data-analysis using Jupyter notebooks.</p>
<h3 id="heading-step-1-getting-the-facebook-group-id">Step 1 — Getting the Facebook group ID</h3>
<p>To get data from Facebook API, we need to specify the ID of the entity we want to get data from, in our case, a Facebook group.</p>
<p><a target="_blank" href="https://lookup-id.com/#">Lookup-id.com</a> is a nice tool you can use to find the ID of a group based on its URL. Copy the URL of your group and paste it in the search bar.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tKkbNLOW2TP-L-N7xNrf0w4lca-mj5EKrYv9" alt="Image" width="800" height="390" loading="lazy"></p>
<p>In this article, we will use the group: <a target="_blank" href="https://www.facebook.com/groups/websworld/">Web Design and Development</a>.</p>
<p>ID: <strong>319479604815804</strong></p>
<h3 id="heading-step-2-getting-to-know-the-graph-api-explorer">Step 2 — Getting to know the Graph API Explorer</h3>
<p>To get the most out of Facebook API besides <a target="_blank" href="https://developers.facebook.com/docs/">documentation</a>, Facebook has developed a playground for developers called the <a target="_blank" href="https://developers.facebook.com/tools/explorer/">Graph API Explorer</a>.</p>
<p>The Graph API Explorer enables us to get a temporary access token and start examining the capabilities that Facebook API has to offer.</p>
<p>Click on <strong>Get Token.</strong> Don’t select any permission. Click <strong>Get Access Token</strong> .</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/EfF4faazp7CJE5KaNA0Zj8uz3hBc3DC5EujD" alt="Image" width="800" height="642" loading="lazy"></p>
<p>Facebook API has many endpoints you can use. In this guide, we are going to use two main endpoints:</p>
<ul>
<li>The <a target="_blank" href="https://developers.facebook.com/docs/graph-api/reference/v2.10/group/">group endpoint</a></li>
<li>The <a target="_blank" href="https://developers.facebook.com/docs/graph-api/reference/v2.10/object/reactions">reactions endpoint</a></li>
</ul>
<p>To figure out the structure of the response you’re expecting to get, specify the endpoint URL and click <strong>Submit</strong>.</p>
<p>Let’s examine the URL endpoint for grabbing the last posts from the group’s feed. Type this URL in the Graph API Explorer:</p>
<pre><code><span class="hljs-number">319479604815804</span>/feed
</code></pre><p>and hit <strong>Submit</strong>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/LDY1c5rCL0iwi6UCuQHoLTW8qjeqR3PGj5IL" alt="Image" width="800" height="608" loading="lazy"></p>
<p>You should now see the last posts from the group’s feed in a JSON structure. It contains the post’s content, its id and the updated time. By clicking on one of the id’s and adding to the end of the URL:</p>
<pre><code><span class="hljs-number">319479604815804</span>_1468216989942054/reactions?summary=total_count
</code></pre><p>You should see a list of the reactions for the specific post, and a summary of the total count of reactions.</p>
<p>This way you can play around with all the features the Facebook API has to offer.</p>
<p>Another tool for examining API endpoints of APIs which don’t offer a playground is <a target="_blank" href="https://codingstartups.com/8-top-must-use-tools-boost-web-development-workflow/">Postman</a>. You can read more about this tool and essential tools for <a target="_blank" href="https://codingstartups.com/8-top-must-use-tools-boost-web-development-workflow/">web developers.</a></p>
<h3 id="heading-step-3-our-plan-and-assumptions">Step 3 — Our plan and assumptions</h3>
<p>Our goal is to find the best time to have a Facebook Live session in the group that contains our target audience. To do that, we assume that the more activity there is in the group at a specific time, the most likely our Facebook Live session will gain more traction.</p>
<p>So our goal now is to figure out when there is a peak in the group’s activity over time. And by when I mean a specific weekday and time.</p>
<p>To do that, we are going to grab the last 5,000 posts from the group’s feed. Then we’ll plot the distribution of the times they were updated.</p>
<p>We assume that longer posts indicate more activity in the group because members spend more time in the group writing them. So, our next step will be to take into consideration the length of each post in the distribution.</p>
<p>Reaction on Facebook is probably a great indication of people engaging with a specific post. Thus, our last step will be to collect the total number of <code>reactions</code> for each post. Then take that into account in the distribution of activity over weekdays and hours.</p>
<p>Because <code>reactions</code> may come after the post, we should be cautious using this data analysis approach.</p>
<h3 id="heading-step-4-lets-analyze-some-data">Step 4 — Let’s analyze some data!</h3>
<p>To start a Jupyter notebook, you should execute:</p>
<pre><code>ipython notebook
</code></pre><p>and then choose New → Python 2.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/iMVyAqCTKHImyZgiNl0r9qDh4fHtENLef2af" alt="Image" width="229" height="203" loading="lazy"></p>
<p>To analyze and plot the data, we are going to use the <code>numpy</code> and <code>matplotlib</code> libraries. These are very popular Python libraries you should use to better analyze your data.</p>
<p>Let’s import all the libraries we need:</p>
<pre><code><span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> pltimport numpy <span class="hljs-keyword">as</span> npimport facebookimport urlparseimport datetimeimport requests
</code></pre><p>and specify our access token and group id:</p>
<pre><code>ACCESS_TOKEN = <span class="hljs-string">'INSERT_ACCESS_TOKEN_HERE'</span>GROUP_ID = <span class="hljs-string">'319479604815804'</span> # Web Design and Development group
</code></pre><p>Then, let’s initialize the API object with our access token:</p>
<pre><code>graph = facebook.GraphAPI(ACCESS_TOKEN)
</code></pre><p>Now we want to grab the posts from the group’s feed. To avoid errors during the API calls, we will limit each API call to 50 posts and iterate over 100 API calls:</p>
<pre><code>posts = []url = <span class="hljs-string">"{}/feed?limit=50"</span>.format(GROUP_ID)until = Nonefor i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">100</span>):    <span class="hljs-keyword">if</span> until is not None:        url += <span class="hljs-string">"&amp;until={}"</span>.format(until)    response = graph.request(url)    data = response.get(<span class="hljs-string">'data'</span>)    <span class="hljs-keyword">if</span> not data:        <span class="hljs-keyword">break</span>    posts = posts + data    next_url = response.get(<span class="hljs-string">"paging"</span>).get(<span class="hljs-string">"next"</span>)    parsed_url = urlparse.urlparse(next_url)    until = urlparse.parse_qs(parsed_url.query)[<span class="hljs-string">"until"</span>][<span class="hljs-number">0</span>]
</code></pre><pre><code>In each API call, we specify the until parameter to get older posts.
</code></pre><pre><code>Now, <span class="hljs-keyword">let</span>’s organize the posts into weekdays and hours <span class="hljs-keyword">of</span> the day:
</code></pre><pre><code>weekdays = {<span class="hljs-attr">i</span>: <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">7</span>)}
</code></pre><pre><code>hours_of_day = {<span class="hljs-attr">i</span>: <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">24</span>)}
</code></pre><pre><code>hours_of_week = np.zeros((<span class="hljs-number">7</span>,<span class="hljs-number">24</span>), dtype=np.int)<span class="hljs-keyword">for</span> post <span class="hljs-keyword">in</span> posts:    updated = datetime.datetime.strptime(post.get(<span class="hljs-string">"updated_time"</span>), <span class="hljs-string">"%Y-%m-%dT%H:%M:%S+0000"</span>)    weekday = updated.weekday()    hour_of_day = updated.hour    weekdays[weekday] += <span class="hljs-number">1</span>    hours_of_day[hour_of_day] += <span class="hljs-number">1</span>    hours_of_week[weekday][hour_of_day] += <span class="hljs-number">1</span>
</code></pre><p>and then, plot the results using <code>matplotlib</code> bar charts:</p>
<pre><code>plt.bar(weekdays.keys(), weekdays.values(), color=<span class="hljs-string">'g'</span>)plt.show()
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/MKsXvKQmZNzAN3t2AaHWkbICk55C-UQHQDUt" alt="Image" width="392" height="257" loading="lazy">
<em>0 represents Monday</em></p>
<pre><code>plt.bar(hours_of_day.keys(), hours_of_day.values(), color=<span class="hljs-string">'r'</span>)plt.show()
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/Wg7MdsofTo5ejs2dAkxn02OzqJfNyqghO41j" alt="Image" width="390" height="254" loading="lazy">
<em>All times specified in IST</em></p>
<p>With only this basic analysis, we can already learn a lot about better or worse time slots for broadcasting to this group. But it does not seem informative enough. Maybe because the data is divided into 2 graphs and missing some critical information.</p>
<p>Let’s try to present a heat map of the data, that enables us to see 3D information:</p>
<pre><code>plt.imshow(hours_of_week, cmap=<span class="hljs-string">'hot'</span>)plt.show()
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/eEL4Zx2R8ur2sBc1ym9AkxAcG4RDg7c9wAAT" alt="Image" width="370" height="135" loading="lazy"></p>
<p>Well, this is much better! We can see that the group is very active on Monday to Friday between 6:00 am and 10:00 am.</p>
<p>Now let’s take into consideration to post length and see how it affects the results:</p>
<pre><code>weekdays_content = {<span class="hljs-attr">i</span>: <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">7</span>)}hours_of_day_content = {<span class="hljs-attr">i</span>: <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">24</span>)}hours_of_week_content = np.zeros((<span class="hljs-number">7</span>,<span class="hljs-number">24</span>), dtype=np.int)<span class="hljs-keyword">for</span> post <span class="hljs-keyword">in</span> posts:    updated = datetime.datetime.strptime(post.get(<span class="hljs-string">"updated_time"</span>), <span class="hljs-string">"%Y-%m-%dT%H:%M:%S+0000"</span>)    weekday = updated.weekday()    hour_of_day = updated.hour    content_length = len(post[<span class="hljs-string">"message"</span>]) <span class="hljs-keyword">if</span> <span class="hljs-string">"message"</span> <span class="hljs-keyword">in</span> post <span class="hljs-keyword">else</span> <span class="hljs-number">1</span>    weekdays_content[weekday] += content_length    hours_of_day_content[hour_of_day] += content_length    hours_of_week_content[weekday][hour_of_day] += content_length
</code></pre><p>The heatmap we get:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/A1B6SxDiXiJIs6Ak-Moe5DH1-msmRJ0B531N" alt="Image" width="377" height="145" loading="lazy"></p>
<p>This is nice but should be treated with caution. On one hand, we can see a very specific time that is the optimized time slot to have our Facebook Live session. But, it might be an outlier of a super long post.</p>
<p>I’ll leave it to you to figure it out in your next data analysis project. Take a larger amount of posts or grab an older batch of 5000 posts from the group’s feed.</p>
<p>To take <code>reactions</code> into account when analyzing the data, we need to make another API call for each post.</p>
<p>This is because it’s a different API endpoint:</p>
<pre><code>weekdays_reactions = {<span class="hljs-attr">i</span>: <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">7</span>)}hours_of_day_reactions = {<span class="hljs-attr">i</span>: <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> xrange(<span class="hljs-number">24</span>)}hours_of_week_reactions = np.zeros((<span class="hljs-number">7</span>,<span class="hljs-number">24</span>), dtype=np.int)<span class="hljs-keyword">for</span> i, post <span class="hljs-keyword">in</span> enumerate(posts):    url = <span class="hljs-string">"https://graph.facebook.com/v2.10/{id}/reactions?access_token={token}&amp;summary=total_count"</span>.format(    id=post[<span class="hljs-string">"id"</span>],        token=ACCESS_TOKEN    )
</code></pre><pre><code>headers = {        <span class="hljs-string">"Host"</span>: <span class="hljs-string">"graph.facebook.com"</span>    }
</code></pre><pre><code>response = requests.get(url, headers=headers)
</code></pre><pre><code><span class="hljs-keyword">try</span>:        total_reactions = <span class="hljs-number">1</span> + response.json().get(<span class="hljs-string">"summary"</span>).get(<span class="hljs-string">"total_count"</span>)    except:        total_reactions = <span class="hljs-number">1</span>
</code></pre><pre><code>updated = datetime.datetime.strptime(post.get(<span class="hljs-string">"updated_time"</span>), <span class="hljs-string">"%Y-%m-%dT%H:%M:%S+0000"</span>)    weekday = updated.weekday()    hour_of_day = updated.hour    weekdays_reactions[weekday] += total_reactions    hours_of_day_reactions[hour_of_day] += total_reactions    hours_of_week_reactions[weekday][hour_of_day] += total_reactions
</code></pre><p>We used a low-level approach by specifying the exact HTTP request and did not use the Facebook Python library. This is because that library doesn’t support the last version of the Facebook API required when querying the <code>reactions</code> endpoint.</p>
<p>The heat map generated from this data:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/GLEHAw3lkvcmSTDOvMMPkVAmoiJrTCzo6PVB" alt="Image" width="386" height="151" loading="lazy"></p>
<p>We can conclude that the three approaches we used agree on Monday and Wednesday, 6:00 am to 7:00 am.</p>
<h3 id="heading-conclusions">Conclusions</h3>
<p>Data analysis can be challenging and often requires creativity. But it also exciting and very rewarding.</p>
<p>After choosing our time to broadcast on Facebook Live based on the analysis presented here, we had a huge success and a lot of traction during our Live session.</p>
<p>I encourage you to try and use data analysis to make data-driven decisions in your next business move. And start thinking in terms of data-driven decisions.</p>
<p>You can find the Github repository <a target="_blank" href="https://github.com/CodingStartups/facebook-live-data">here</a>.</p>
<p>I originally published this on <a target="_blank" href="https://codingstartups.com/">CodingStartups</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Facebook just changed the license on React. Here’s a 2-minute explanation why. ]]>
                </title>
                <description>
                    <![CDATA[ Facebook just switched several of its open source projects — including React — over to the popular MIT license. Before that, Facebook was using their own custom “BSD+Patents” license. This was similar to the widely-used BSD license, but also included... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/facebook-just-changed-the-license-on-react-heres-a-2-minute-explanation-why-5878478913b2/</link>
                <guid isPermaLink="false">66b8d31a0c9c1d363b7c4218</guid>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Thu, 28 Sep 2017 14:56:22 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*QouAPEdyLJpamtoHAIwItw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Facebook just switched several of its open source projects — including React — over to the popular MIT license.</p>
<p>Before that, Facebook was using their own custom “BSD+Patents” license. This was similar to the widely-used BSD license, but also included a clause that basically said: “you can’t sue Facebook for infringing on your patents.”</p>
<p>This license came under fire this summer. Here’s what happened.</p>
<h3 id="heading-july-15-the-apache-foundation-bans-react">July 15: The Apache Foundation Bans React</h3>
<p>The Apache Foundation <a target="_blank" href="https://issues.apache.org/jira/browse/LEGAL-303">sent out a notice</a> banning the use of any BSD+Patents licensed tools in their open source projects. (Apache has a history of banning licenses that they consider too restrictive, <a target="_blank" href="https://www.apache.org/licenses/GPL-compatibility.html">such as the GNU GPL</a>.)</p>
<h3 id="heading-august-18-facebook-says-the-bsdpatents-license-is-to-protect-them-from-meritless-patent-litigation">August 18: Facebook says the BSD+Patents license is to protect them from “meritless patent litigation”</h3>
<p>Facebook blogged that they needed the BSD+Patents license <a target="_blank" href="https://code.facebook.com/posts/112130496157735/explaining-react-s-license/">so they could develop React faster</a>, without needing lawyers to sign off on their changes.</p>
<p>This spurred communities like Reddit, Hacker News, and freeCodeCamp to discuss React alternatives.</p>
<h3 id="heading-september-14-wordpress-says-it-isnt-comfortable-with-facebooks-bsdpatents-license">September 14: WordPress says it isn’t comfortable with Facebook’s BSD+Patents license</h3>
<p>WordPress — which powers about 25% of all websites — said <a target="_blank" href="https://ma.tt/2017/09/on-react-and-wordpress/">they wouldn’t use React in future projects unless the license changed</a>.</p>
<h3 id="heading-september-22-facebook-announces-its-ditching-the-bsdpatents-license-and-switching-to-the-mit-license">September 22: Facebook announces it’s ditching the BSD+Patents license and switching to the MIT license</h3>
<h3 id="heading-september-24-wordpress-says-its-ok-with-react-now">September 24: WordPress says it’s OK with React now</h3>
<p>The founder of WordPress says <a target="_blank" href="https://ma.tt/2017/09/facebook-dropping-patent-clause/">he’s happy with the change, and WordPress may use React in future projects</a>.</p>
<h3 id="heading-september-25-facebook-officially-switches-to-the-mit-license">September 25: Facebook officially switches to the MIT license</h3>
<p><a target="_blank" href="https://www.freecodecamp.org/news/facebook-just-changed-the-license-on-react-heres-a-2-minute-explanation-why-5878478913b2/undefined">Sophie Alpert</a> made the <a target="_blank" href="https://github.com/facebook/react/commit/b765fb25ebc6e53bb8de2496d2828d9d01c2774b">commit that changed the license over to MIT</a>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*tSozxll0kj7sciY7rnuwLw.png" alt="Image" width="800" height="402" loading="lazy"></p>
<h3 id="heading-september-26-facebook-releases-react-16httpsgithubcomfacebookreactreleases">September 26: Facebook <a target="_blank" href="https://github.com/facebook/react/releases">releases React 16</a></h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*AxRQol1KSrWSZaUpdCD3yw.png" alt="Image" width="800" height="573" loading="lazy">
_React is the “most loved” developer tool, according to [64,000 developers surveyed in April 2017 by Stack Overflow](https://medium.freecodecamp.org/73-of-programmers-are-web-developers-and-other-insights-from-stack-overflows-massive-2017-survey-89a13b11e370" rel="noopener" target="<em>blank" title=").</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*gS2lLxjyWwNNMbYKRvBxgw.png" alt="Image" width="800" height="347" loading="lazy">
_React is now [the most commonly requested skill](https://medium.freecodecamp.org/trending-developer-skills-based-on-my-analysis-of-ask-hn-whos-hiring-26c02a3ca1fd" rel="noopener" target="<em>blank" title=") in Hacker News “Who’s Hiring?” posts.</em></p>
<p>Now that the uncertainty around React’s license is settled, React will most likely remain one of the most popular tools for web development.</p>
<p>Facebook is also switching to more permissive licenses for its other open source projects, too.</p>
<p>I hope you found this explanation helpful. If you want to explore open source licenses, GitHub created <a target="_blank" href="https://choosealicense.com/">this tool</a> to help you choose the right one for you.</p>
<p><strong>I only write about programming and technology. If you <a target="_blank" href="https://twitter.com/ossia">follow me on Twitter</a> I won’t waste your time.</strong></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why Facebook Like buttons account for 16% of an average website’s code ]]>
                </title>
                <description>
                    <![CDATA[ By Ben Regenspan According to data collected by BuiltWith.com, 6% of the top 10,000 most high-traffic sites load content from Facebook’s servers. For the vast majority of them, that content is likely Facebook’s Javascript SDK, a huge block of code th... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-16-of-the-code-on-the-average-site-belongs-to-facebook-and-what-that-means-68956cd731be/</link>
                <guid isPermaLink="false">66c36677139b845d61e84bcc</guid>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 03 Sep 2017 23:39:08 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*YrHFWabESezXSeFmt_Co-Q.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Ben Regenspan</p>
<p>According to <a target="_blank" href="https://trends.builtwith.com/cdn/Facebook-CDN">data collected by BuiltWith.com</a>, 6% of the top 10,000 most high-traffic sites load content from Facebook’s servers. For the vast majority of them, that content is likely Facebook’s Javascript SDK, a huge block of code that is needed to display such features as the Like button (as seen on many media sites) and Facebook comments widgets (also used on many big media sites, Buzzfeed among them).</p>
<p>This SDK code is so big that it represents about 16% of the total size of all JavaScript on the <a target="_blank" href="http://httparchive.org/trends.php#bytesJS&amp;reqJS">average web page</a>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/XTrx22wjKCYtC7DVJChFX-yLoMBdiQgGkIwa" alt="Image" width="800" height="171" loading="lazy">
<em>One of the culprits behind modern websites taking so long to download</em></p>
<p>As a sizable and widely-used software library, the Facebook SDK is a nice way of illustrating some of the answers to the questions: just why is the average site today so big? And how much does size actually matter?</p>
<h3 id="heading-why-so-big">Why so big?</h3>
<p>The Facebook SDK is very full-featured, duplicating many of the tools the average site is likely to already include for its own developers’ use: methods for retrieving data from other sites, for determining which browser and device the user is using so as to target specific features to them, and for displaying UI elements (like confirmation dialogs and buttons). If we <a target="_blank" href="https://docs.google.com/spreadsheets/d/1vdRzi-wlYNQOoAt4bGOseDMt7vgmpv9BoSfy4yM1SYY/edit?usp=sharing">categorize all of the pieces</a> of the SDK, the breakdown looks like this:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/fmjSpUO8iwQb-e-p6xHljRv5VM8Kce6m6gwT" alt="Image" width="800" height="603" loading="lazy">
_The amount that each set of features in the SDK contributes to total filesize. (Note that this is the size of the file before it has been compressed; the final package will be smaller.) [[Source data, methodology, and more screen-reader-compatible data table](https://docs.google.com/spreadsheets/d/1vdRzi-wlYNQOoAt4bGOseDMt7vgmpv9BoSfy4yM1SYY/edit#gid=873242422" rel="noopener" target="<em>blank" title=")]</em></p>
<p>Of the sets of features, three stand out the most:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZxophdegZjOmW0hweYCPJniEBJ4dmHj8fZuL" alt="Image" width="800" height="237" loading="lazy">
_The three sets of features in the SDK that are completely irrelevant to the vast majority of users on most sites. Eliminating them — if it were possible to do so — would shave off roughly 20% of the SDK filesize. [[Source data, methodology, and more screen-reader-compatible data table](https://docs.google.com/spreadsheets/d/1vdRzi-wlYNQOoAt4bGOseDMt7vgmpv9BoSfy4yM1SYY/edit#gid=873242422" rel="noopener" target="<em>blank" title=")]</em></p>
<p>“Canvas” is Facebook’s system for apps that are intended to be loaded within Facebook (Facebook made a major push in the past to encourage developers to build apps that lived within Facebook; I’m not entirely sure how widely such apps are used today, but either way, a regular website does not use any of the Canvas-related features.) The cost of including them in the SDK is pretty marginal: only 1.5% of total size.</p>
<p>After that, we have legacy feature support. This reflects the fact that an API will accumulate multiple interfaces for handling the same features over time. For example, developers can write code that calls either <strong>FB.getLoginStatus()</strong> (the legacy approach to requesting the user’s current Facebook login status) or <strong>Auth.getLoginStatus()</strong> (the new, encouraged approach). The way to get around needing to include both sets of methods is releasing them in separate versions of the SDK, but Facebook opted not to do this, likely to simplify the experience for developers and to maximize the number of sites using the exact same file (to increase the likelihood that the average user already has it downloaded). This decision comes at a small cost: roughly 3.5% of the SDK code is for handling features that are explicitly marked as “legacy” (and it’s quite possible that there are many more “legacy” features that just aren’t explicitly marked as such).</p>
<p>Most significantly, the SDK includes a number of polyfills and polyfill-like utilities, which make up over 15% of its code. Polyfills are used to supply features that are found in newer browsers to older browsers, and sometimes also to supply newer features that are upcoming but haven’t been added to any browsers yet. Most of the polyfills included by the Facebook SDK are for features that are already included in browsers used by the vast majority of internet users. They serve only to make the SDK work for the <a target="_blank" href="http://gs.statcounter.com/browser-version-market-share">&lt;</a> 1% of global internet users who are using old browsers like Internet Explorer 8, which many (if not the vast majority of) major sites have given up on supporting.</p>
<p>Of the remaining ~80% of the SDK, it’s a bit more difficult to untangle which features are needed for which purpose. This is because it is written such that, to use a simple feature like the Like button, one must also include code that is used only for comments, video embeds, login buttons, and other unrelated features. Facebook could have opted to distribute much smaller files for including only single features such as Like buttons, but has a business goal of encouraging sites to use as many FB-provided features as possible.</p>
<h3 id="heading-does-size-matter">Does size matter?</h3>
<p>Due to the widespread use of Facebook’s SDK, and the fact that it changes <a target="_blank" href="https://github.com/nfriedly/facebook-js-sdk">relatively infrequently</a>, many users are likely to have already downloaded it before they load a site. In fact, this is a big part of the rationale for why Facebook would distribute such a huge file, rather than smaller ones for specific features such as Like buttons. And on most users’ network connections — at least those in developed countries — the time it takes to download the file is marginal.</p>
<p>But regardless of whether the user’s browser already has the SDK downloaded, there is still overhead involved in running a large block of Javascript, especially on mobile devices. On the relatively new MacBook Pro I’m writing this on, Facebook’s SDK takes around 50ms (1/20th of a second), to run on a site like Buzzfeed. Not bad — especially when taken in context with the rest of the JS code, including ad-related code that takes far longer to execute — but still a non-trivial cost for something that is only used to display comments on the very bottom of the page.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/NKYO49MdQzV4gQmTtpw3llLD1za7M61faSFy" alt="Image" width="800" height="294" loading="lazy">
<em>Script evaluation in Chrome on a recent MacBook Pro</em></p>
<p>On a very new smartphone (Google Pixel), the JS execution time is doubled, now taking over 1/10th of a second:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/7AiXlQH2A-fsvhsNZP8M1R2mSqAqekWUyg5D" alt="Image" width="800" height="495" loading="lazy">
<em>Script evaluation on a Google Pixel smartphone</em></p>
<p>When looked at in context, this is a tiny fraction of the total code execution time on the page. But it adds to the amount of time during which scrolling or otherwise interacting with the page can be a choppy and unpleasant experience. And this gets at an important point: this particular SDK has a marginal cost, but modern websites — especially media sites — often include similar code from a large number of third parties (<a target="_blank" href="http://ben.regenspan.com/your-script-loader-is-killing-you/#/4/4">this example I captured from Gawker before it was killed by a billionaire vampire</a> shows just how many such requests there can be).</p>
<p>Even setting aside the privacy impact of sending some user information to each of these third parties, the cost of all these features adds up quickly. Each third-party script that a site adds comes at a cost, both in terms of performance and in helping to rationalize the addition of the next “relatively harmless” chunk of third-party code later on. Besides the immediate performance impact of the additive cost of all of this code, this impacts developer morale: imagine working for days to shave off 10% of your own code’s load time, only to see a giant block of third-party code added that dwarfs the impact of that painstaking effort. And then (if you work for a media site), seeing this same pattern repeat itself over and over again every few months.</p>
<h3 id="heading-should-you-include-it">Should you include it?</h3>
<p>If you need to use a feature like Facebook Comments, there’s no getting around the need to load the Facebook SDK. But depending on how your site is structured, you may be able to limit the SDK’s performance impact by only loading it when needed (e.g. once the user has scrolled down to the point where comments should become visible).</p>
<p>If you want to use the Like button, stop and reconsider. Facebook no longer displays Likes of a page prominently (or, in most cases, at all) on user timelines. It’s better to <a target="_blank" href="https://jonsuh.com/blog/social-share-links/#use-share-urls">use a simple custom Share button or link</a>, and as a side benefit, doing so will prevent Facebook from tracking all visits to your page and interfering with the privacy of your users. Sites that have eliminated the Like button have failed to identify any negative impact of doing so when it comes to Facebook traffic referrals.</p>
<p><em>CORRECTION to title: Originally I titled this “Why 16% of the code on the average site belongs to Facebook, and what that means”. As some rightly pointed out, this implies that a full 16% of the Javascript on all sites on the Internet (or at least of all the top sites), consists of the Facebook Javascript SDK. This was not my intent and I can see how it came across as overly sensationalist.</em></p>
<p><em>Hopefully the new title makes clearer that the Facebook SDK measures up at 16% of the size of the average site’s Javascript, and no longer implies that it represents 16% of total site Javascript across the internet. As <a target="_blank" href="https://medium.com/@david.gilbertson/maybe-i-missed-something-but-isnt-your-article-s-title-100-false-d2dcc51fc9ed">David Gilbertson notes here</a>, the actual global number would be much smaller — 0.96%. He also raises a good point re: caching: the Facebook Javascript SDK is not cached optimally at all, it only gets cached in the most ideal fashion for up to 20 minutes, after which the user’s browser checks back with Facebook’s servers to verify that it already has the latest version.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to convert blog posts into Facebook Instant Articles — no coding required ]]>
                </title>
                <description>
                    <![CDATA[ By Nicholas Walsh A friend of mine asked me to help convert articles that were previously posted to their site into Facebook Instant Articles. Afterwards, I decided to compile a guide to help nontechnical people convert their old articles, blog posts... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-convert-blog-posts-into-facebook-instant-articles-no-coding-required-fefea28c8701/</link>
                <guid isPermaLink="false">66c350c9a7aea9fc97bdfb8a</guid>
                
                    <category>
                        <![CDATA[ Facebook ]]>
                    </category>
                
                    <category>
                        <![CDATA[ social media ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sat, 29 Jul 2017 14:20:30 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*KILZRpvD0Ew9jU3NuZ_FnQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Nicholas Walsh</p>
<p>A friend of mine asked me to help convert articles that were previously posted to their site into Facebook Instant Articles. Afterwards, I decided to compile a guide to help nontechnical people convert their old articles, blog posts, or online content.</p>
<p>Even if you don’t know what Facebook Instant Articles are, you may already be using them. According to Facebook IA’s <a target="_blank" href="https://developers.facebook.com/docs/instant-articles/faq#FAQ-basics">FAQ</a> page:</p>
<blockquote>
<p>“Instant Articles is a mobile publishing format that enables news publishers to distribute articles to Facebook’s app that load and display as much as 10 times faster than the standard mobile web.”</p>
</blockquote>
<p>IA’s dictate a content publishing standard that results in both a pleasing design, and optimized performance for articles opened from within the Facebook mobile app. You can read more about the <a target="_blank" href="https://contently.com/strategist/2015/05/13/7-things-you-need-to-know-about-facebook-instant-articles/">benefits</a> of IA’s.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*6YgOYg7b5kWoEAHSlmxT1Q.jpeg" alt="Image" width="800" height="645" loading="lazy"></p>
<p>Facebook offers a plethora of ways to fast-track IA production and conversion. Yet it seems the current guides are for developers or larger enterprises that have a more complex publishing ecosystem.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*SNzwqk3Mi1jyvycLcKutUA.jpeg" alt="Image" width="640" height="516" loading="lazy"></p>
<p>It is hard to find guides for converting previously posted articles that don’t involve using the Facebook IA API, PHP SDK, or the WordPress <a target="_blank" href="https://media.fb.com/2016/03/07/instant-articles-wordpress-plugin/">plugin</a>. For non-developers, most of these tools require too much technical experience. Even when one tries to find the WordPress plugin tutorial, one has to dig into the documentation in Facebook’s developer portal . This is not ideal for non-developers who become dissuaded before they can ever find this page.</p>
<p>Let’s work together to convert any article already published on the web into a Facebook Instant Article! For our tutorial, we’ll be using the article about a celebrity dog from the movie ‘<a target="_blank" href="https://www.theatlantic.com/entertainment/archive/2013/12/15-minutes-life-celebrity-dog-baxter-anchorman/356235/">Anchorman</a>’.</p>
<h3 id="heading-lets-groove">Let’s Groove!</h3>
<p><strong>Step 0: Prep</strong></p>
<p>We won’t need to install any plugins or integrations, but we will need a text editor to work with the HTML source code. There are a lot of different code-oriented text editors, but for the sake of this example, I recommend <a target="_blank" href="https://www.sublimetext.com/"><strong>Sublime</strong></a>. It has all the features we’ll need, and is easy to use out of the box with a fresh install.</p>
<p>Once you install Sublime, we’re going to want to download the code <a target="_blank" href="https://gist.github.com/nmwalsh/e67c8474b038a5286c95d15e2ad82285#file-template-html">template</a> that we’ll be using from GitHubGist.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*Dv4DscHL7Tj7lPseAyHTAQ.png" alt="Image" width="800" height="294" loading="lazy"></p>
<pre><code>On the right side <span class="hljs-keyword">of</span> the screen: <span class="hljs-number">1.</span> Right click the <span class="hljs-string">"Raw"</span> button2. Click <span class="hljs-string">"Save link as..."</span> By <span class="hljs-keyword">default</span>, it should save <span class="hljs-keyword">as</span> an HTML file <span class="hljs-keyword">with</span> the name <span class="hljs-string">"template"</span>.
</code></pre><p>Now we’ve got the code editor and the template code that we’ll be editing!</p>
<pre><code>For the last step <span class="hljs-keyword">of</span> setup:<span class="hljs-number">1.</span> Boot up Sublime2. Open the template file we downloaded
</code></pre><h4 id="heading-step-1-getting-the-banner-image">Step 1: Getting the Banner Image</h4>
<p>Hop back over to your internet browser and find the article you wish to convert on its’ live site. We’re going to first grab the <strong>banner image</strong>, which we’ll use at the top of the Facebook Instant Article.</p>
<p>To do this, right click the image, and select _“<em>Copy image address</em>”._</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*28BtD-UWNCtTxNGvtjnoTw.png" alt="Image" width="705" height="727" loading="lazy"></p>
<p>Switch back to the template that we have open in Sublime. Search for the </p><figure> tag in the code, located on line 35 (line number is visible on the left edge).<p></p>
<pre><code>Highlight the original URL located between quotes on line <span class="hljs-number">36</span>, and replace it by pasting the image address that we copied <span class="hljs-keyword">from</span> the banner image. Make sure there are double quotes on each side <span class="hljs-keyword">of</span> the URL to preserve the format. And make sure to not <span class="hljs-keyword">delete</span> the “ /&gt;” at the end <span class="hljs-keyword">of</span> the line.
</code></pre><pre><code>Edit the text inside <span class="hljs-keyword">of</span> &lt;figcaption&gt; &lt;/figcaption&gt; <span class="hljs-keyword">with</span> the caption that you will want to appear below the image. This is often where the image attribution goes.
</code></pre><p>Notice how we’re careful not to change any of the formatting of the code. Messing around with the tags themselves will cause errors later on when we try to render the website. Sublime colorizes our code, which helps us recognize mistakes or mismatching HTML tags.</p>
<p>Pay extra close attention to how we replaced the text for the figure caption. We’re going to be editing lots of other values in exactly the same way.</p>
<h4 id="heading-step-2-retrieving-the-metadata">Step 2: Retrieving the Metadata</h4>
<p>There’s a bit of info we’ll need to collect now. Since most of this data should be retrievable without digging through the source code, manually copying this info works well. We’ll need this source code later though, so there’s no harm in opening it now.</p>
<ul>
<li>Original Article URL</li>
<li>Article Title</li>
<li>Article Subtitle</li>
<li>Article Author(s)</li>
<li>Date &amp; Time article was originally published</li>
<li>Date &amp; Time article was last updated</li>
</ul>
<p>If it’s difficult to get this info, we can use the source code from the website. How you access this data will depend on which browser you’re using.</p>
<pre><code>Chrome: CTRL + U, or Right Click → View Page SourceFirefox: Right Click → View Page SourceSafari: Safari menu → Preferences → Advanced, Enable <span class="hljs-string">"Show Develop menu in menu bar"</span>, then Develop menu → Show Page Source
</code></pre><p><img src="https://cdn-media-1.freecodecamp.org/images/1*mgIdjQwtEYQTFGYMCXwApQ.png" alt="Image" width="800" height="266" loading="lazy">
<em>The source code should resemble this</em></p>
<p>Now that we’ve got the source code and original website up, let’s start looking for our info.</p>
<p><strong>Title:</strong> Copy the title of the article, and use it to replace “Article Title” within the </p><h1 id="heading-ia"> </h1> tag<strong>s</strong> on line 14 of the template. In the source code, this is usually within the   tags. For example,<p></p>
<pre><code>&lt;h1&gt;Article Title&lt;/h1&gt;
</code></pre><pre><code>becomes
</code></pre><pre><code>&lt;h1&gt;<span class="hljs-number">15</span> Minutes <span class="hljs-keyword">in</span> the Life <span class="hljs-keyword">of</span> Celebrity Dog Baxter <span class="hljs-keyword">from</span> <span class="hljs-string">'Anchorman'</span>&lt;/h1&gt;
</code></pre><p><strong>Subtitle:</strong> Same as above, but with the subtitle. Use this to replace “Article Subtitle” within the </p><h2 id="heading-ia"> </h2> tag<strong>s</strong> on line 15 of <strong>t</strong>he template.<p></p>
<p><strong>URL:</strong> Copy the URL of the live website’s article. Use this to replace the URL that appears on line 7 of the template. For example:</p>
<pre><code>&lt;link rel=<span class="hljs-string">"canonical"</span> href=<span class="hljs-string">"http://example.com/article.html"</span>&gt;
</code></pre><pre><code>becomes...
</code></pre><pre><code>&lt;link rel=<span class="hljs-string">"canonical"</span> href=<span class="hljs-string">"https://www.theatlantic.com/entertainment/archive/2013/12/15-minutes-life-celebrity-dog-baxter-anchorman/356235/"</span>&gt;
</code></pre><p><strong>Publication Time:</strong> On line 18 of the template, you can name the date and time the article was originally published. Be mindful that the “datetime” parameter takes a very specific format. The data inside of <strong>datetime=</strong>_” ”_determines metadata (not displayed), whereas the text between the “<strong>&gt; &lt;</strong>/time&gt;” tags will dictate what date is shown (can be in any format here).</p>
<pre><code>For example, <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">time</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"op-published"</span> <span class="hljs-attr">datetime</span>=<span class="hljs-string">"2014-11-11T04:44:16Z"</span>&gt;</span>November 11th, 4:44 PM<span class="hljs-tag">&lt;/<span class="hljs-name">time</span>&gt;</span></span>
</code></pre><pre><code>Displays <span class="hljs-keyword">as</span>: November <span class="hljs-number">11</span>th, <span class="hljs-number">4</span>:<span class="hljs-number">44</span> PMLet<span class="hljs-string">'s change it to: July 24th, 2017. 6:30 PM</span>
</code></pre><pre><code>&lt;time <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"op-published"</span> datetime=<span class="hljs-string">"2017-7-24T06:30:16Z"</span>&gt;July <span class="hljs-number">24</span>th, <span class="hljs-number">2017.</span> <span class="hljs-number">6</span>:<span class="hljs-number">30</span> PM&lt;/time&gt;
</code></pre><pre><code>Last Update Time: Same plan <span class="hljs-keyword">as</span> above, but on line <span class="hljs-number">21</span> <span class="hljs-keyword">of</span> the template.
</code></pre><p><strong>Author(s):</strong> Lines 24–27 of the template represent an author whose name links to somewhere on the web. Lines 28–31 represent an author whose name is not linked. You can copy the entire block of code for that respective author, and paste it consecutive to the prior block, then edited as needed. You can also do this for multiple authors. See the example below for multiple authors with simple name + captions.</p>
<h4 id="heading-step-3-copying-the-body-content">Step 3: Copying the Body Content</h4>
<p>Now we’ll retrieve the article content that we want converted. There’s a large range of content types, such as mixed media, fancy JavaScript, embedded content. With more complicated content, the chance is higher that things won’t work without troubleshooting, so your mileage may vary.</p>
<p>I’m going to explain how to work with text, images (static or gifs), and video, since those are the basis for most Instant Articles that I’ve seen.</p>
<p>The source code is likely hundreds (or even thousands) of lines. An easy to trick for finding the start of the body content is to do a “Find” for the first few words of the article’s body text. We’ll want to copy from the </p><p> tag at the start of our body text until (and including) the </p> tag that follows the closing words of the article.<p></p>
<p>Next, we’re going to need to dump this into our template. Near Line 58 in the template, there should be a line with the following:</p>
<pre><code>&lt;p&gt; Article content &lt;/p&gt;
</code></pre><p>Highlight this entire line, and paste over the body content that we copied from the live article source code. Note: we copied the opening </p><p> and closing </p> from the source code, which is why we’re pasting over them in the template here. There is some code within another set of <p></p> tags following the body text, but it’s styling — be careful not to copy this with your body text.<p></p>
<p>*Have a video you’d like to incorporate in your IA? Change the URL between the  and  tags beginning around line 64, like we did with the Banner Image URL back in Step 1.</p>
<p><strong>Legal Notes:</strong> Line 84. This text will be very small, and at the very end of your article.</p>
<h4 id="heading-step-4-bells-and-whistles-ads-analytics-trackers-and-more">Step 4: Bells and Whistles (Ads, Analytics Trackers, and more)</h4>
<p><strong>I recommend skipping this step for now.</strong> If you’d like to confirm what we’ve done so far works, or if you don’t have custom ads or trackers, skip ahead to Step 5.</p>
<p>One of the best things about Facebook Instant Articles, compared to other proprietary article conversion tools, is that you can keep the custom analytics trackers and advertisements that you already use on your own site.</p>
<p>Every custom integration will be different, and will likely vary in difficulty. For this example, we’ll be using <a target="_blank" href="https://chartbeat.com/">ChartBeat</a>, a traffic analytics and tracking tool. We can use a quick Google search for “ChartBeat Documentation”, to find the <a target="_blank" href="http://support.chartbeat.com/docs/">Getting Started Guide</a>.</p>
<p>Some companies’ documentation page may be geared towards developers. If that doesn’t work for you, search for a tutorial instead.</p>
<p>ChartBeat gives us all the code and instructions for how to add their integration.</p>
<p>In the guide, it tells us the following, so that’s what we’ll do:</p>
<pre><code>Insert <span class="hljs-built_in">this</span> script right before the closing &lt;/body&gt; tag:
</code></pre><p>Now that we’ve add our ChartBeat tracker, we’ll need to make a few quick edits so that the tracker knows how to sync to our ChartBeat account.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*Il0_cROfPT6hQZtBbdmkdQ.png" alt="Image" width="800" height="219" loading="lazy">
<em>Code from the ChartBeat snippet that we’ll need to customize</em></p>
<p>Each highlighted line (except the “.useCanonical” one) will need an edit so that it can log the data.</p>
<pre><code>CHANGES (to the right <span class="hljs-keyword">of</span> the <span class="hljs-string">"="</span>).uid - The unique ID <span class="hljs-keyword">for</span> your ChartBeat account.domain - The full domain <span class="hljs-keyword">of</span> the original article.sections - The name <span class="hljs-keyword">of</span> the <span class="hljs-string">'section/genre/tags'</span> your article belongs to.authors - The name <span class="hljs-keyword">of</span> the author to associate <span class="hljs-keyword">with</span> <span class="hljs-built_in">this</span> piece
</code></pre><p>Bingo! You’ve added the tracker and it will associate the data it’s sending with your unique ChartBeat account. Save your edited template file, and let’s get ready to publish.</p>
<h4 id="heading-step-5-deploying-your-instant-article">Step 5: Deploying your Instant Article</h4>
<p>On Facebook, go to the dashboard for the page you manage that you wish to post from. Navigate to Publishing Tools, and to the list of articles. Click the blue “+Create” button on the top right.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*2b43jAg0QkdNaoyRMMqwwA.png" alt="Image" width="800" height="596" loading="lazy">
<em>IA Dashboard</em></p>
<p>You should now be prompted to paste the code for your new article.</p>
<p>Select all the code from the template that we’ve been editing, and paste it in here. Hit save! You can publish that draft when you see fit, or schedule it to post at a predetermined time using the dashboard.</p>
<h4 id="heading-congrats-youre-done-i-cant-wait-to-read-the-awesome-articles-youre-about-to-publish">Congrats, you’re done! I can’t wait to read the awesome articles you’re about to publish.</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/0*0dsNUILlWp9u8hCF.gif" alt="Image" width="268" height="268" loading="lazy"></p>
<p>Hey, I’m <a target="_blank" href="http://twitter.com/thenickwalsh"><strong>Nick Walsh</strong></a>.</p>
<p>I’m a Technical Evangelist for <a target="_blank" href="http://wolfram.com">Wolfram Research</a> and a Hackathon Coach for <a target="_blank" href="http://mlh.io">Major League Hacking</a>, with a passion for technology, eSports, and empowering student developers.</p>
</figure> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
