<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Full stack development - Medium]]></title>
        <description><![CDATA[Articles related to development with PHP7, Laravel, Symfony, MySQL, AWS/EC2/RDS/ELB/CloudWatch/Lambda, Javascript/D3/Node.JS, CSS3, Docker/Laradock, Serverless - Medium]]></description>
        <link>https://medium.com/full-stack-development?source=rss----10703dce1305---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Full stack development - Medium</title>
            <link>https://medium.com/full-stack-development?source=rss----10703dce1305---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 30 May 2026 16:47:19 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/full-stack-development" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Bleedin’ edge JavaScript: ES6/ES2015, transpiling and an arrow function example]]></title>
            <link>https://medium.com/full-stack-development/bleedin-edge-javascript-es6-es2015-transpiling-and-an-arrow-function-example-1e3ba6a77e20?source=rss----10703dce1305---4</link>
            <guid isPermaLink="false">https://medium.com/p/1e3ba6a77e20</guid>
            <category><![CDATA[arrow-functions]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[ecmascript-6]]></category>
            <category><![CDATA[babeljs]]></category>
            <category><![CDATA[es6]]></category>
            <dc:creator><![CDATA[Lauri Jalonen]]></dc:creator>
            <pubDate>Fri, 09 Feb 2018 11:03:57 GMT</pubDate>
            <atom:updated>2018-02-09T11:03:56.635Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/188/1*qsMH3spHzOErEBvK0-fKWw@2x.jpeg" /></figure><p>Of late, I’ve been updating my JavaScript knowledge and thought I’d share some tidbits and goody gumdrops. Here we go.</p><blockquote>If you’re already knee-deep in ES6, this article is <strong>not</strong> for you. If you’re already proficient in JavaScript and are wondering what the ES6 fuss is about, this article is <strong>definitely</strong> for you :)</blockquote><h3>What frickin’ ES6??</h3><p><strong>ES6, ECMAScript 6, ES2015, ECMAScript 2015.. </strong>I’m sure you’ve already heard these terms being whipped around or seen them in job ads of companies that want to seem “disruptive”. Well, maybe not, but regardless, those terms are confusing at best.</p><p>So yeah, JavaScript is steadily evolving just like everything else. The confusing bit is that the naming conventions have changed of late. Read on.</p><h3>Why do I care about ES6?</h3><p>Well, you care because some guys are hard at work to make your Javascript development work more productive, your code more intuitive, manageable and readable, reducing headache and making you look cooler to your boss and your clients. Why not reap the benefits? <a href="http://es6-features.org/#Constants">Look at these features to get an idea.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/620/1*QtGtlzd0rpBg-c5107hBSQ.png" /><figcaption>Yeap, that familiar feelin’</figcaption></figure><p>New stuff is being added to JavaScript continuously by a group called <a href="https://www.ecma-international.org/">ECMA</a> using an <a href="https://tc39.github.io/process-document/">approval process</a> for each feature. That’s where the name ECMAScript comes from.</p><p>Guys from Google, Microsoft, Apple and the Mozilla foundation read the ECMA’s memos and debate about what cool things Chrome, IE, Firefox and Safari should support next. I’m suspecting that from their perspective, they‘re asking questions like “will consumers increase their preference for our browser over others, thus exposing them to our mind control techniques through an enhanced, personalised browsing experience if we support [cool functionality]?”. From my perspective, I don’t know about you but I just wanna work less and more effective :)</p><h4>Weird naming conventions of ECMA and some history</h4><p>As an example, ES6 is also called these things, and <strong>all of them mean the exact same thing</strong>:</p><ul><li>ECMAScript 6</li><li>ECMAScript 2015</li><li>ES2015</li></ul><p>This will hopefully become more consistent in the future. <a href="https://benmccormick.org/2015/09/14/es5-es6-es2016-es-next-whats-going-on-with-javascript-versioning/">Here’s a short history of the ECMA standards evolution so far.</a> Not that anyone gives a hoot :) Anyway, on to the cool stuff: transpiling and the arrow function.</p><h3>Transpiling with Babel</h3><p>Now that you know browser support for bleeding edge JS stuff is inconsistent, but you’ve seen a cool ES6 feature you want to use, you might be frustrated because browsers haven’t kept up with the cool kids? Not to worry, <a href="https://babeljs.io">Babel’s</a> got your back.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kpJ3eftJESwS-94f5ut_TQ.png" /><figcaption>Yeah, the logo looks like an 80s Glam Rock band.</figcaption></figure><p>Eventually all browsers end up supporting all the features introduced in new ECMAScript standards, but in the meantime you can get away with using these new functions by something called <strong>transpiling. </strong>Not to ne confused with compiling. Whereas <em>compiling</em> takes your code and creates something entirely different and unrecognizable (usually to binary from text), <em>transpiling</em> takes your code and <em>translates it to a different dialect of that same language</em>. Anyway, what you need to know is that</p><blockquote>the current thingamajingy capable of transpiling bleeding edge to browser-supported Javascript is <a href="https://babeljs.io">Babel</a>.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/912/1*0nPYjXhYP1vcLGMuls7gxw.png" /></figure><p>Just go and test the <a href="https://babeljs.io/repl/">playground</a> and see for yourself what coolness you can get browsers to support with Babel. Then, <a href="https://babeljs.io/docs/setup/">read the setup section of the docs</a> and discover that Babel is supported by a thousand build systems and frameworks such as <a href="https://gulpjs.com/">Gulp</a>, <a href="https://gruntjs.com/">Grunt</a> or <a href="https://webpack.js.org/">Webpack</a>.</p><p>Noteworthy about Babel is also that it translates something called <strong>JSX </strong>into Javascript as well. Outside the scope of this article, but <a href="https://jsx.github.io/">read about JSX here.</a></p><h3>ES6 by example: Arrow function and no prototype</h3><p>Okay, so <a href="http://es6-features.org/#Constants">ES6 has way more features</a> than this one below, but I’m hoping that as one example of many, you can get an idea of the difference ES6 makes.</p><p>There are two benefits to arrow functions.<br><strong>First</strong>, they are less verbose than traditional function expressions.</p><p>Compare the two versions below:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6159ca45536bf96b37145610cc98e4c6/href">https://medium.com/media/6159ca45536bf96b37145610cc98e4c6/href</a></iframe><p><strong>Second</strong>, they pick up their “this” from their surroundings. Looking at this example from <a href="https://leanpub.com/exploring-es6/">Exploring ES6 by Axel Rauschmayer</a>. Not just using arrow function to simplify things, but you don’t even need to use prototype anymore.</p><p>See below:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bcaf2b8bb1e2b2176be161ed5f7f806d/href">https://medium.com/media/bcaf2b8bb1e2b2176be161ed5f7f806d/href</a></iframe><p>Well, that’s it for me. Hopefully this post made ES6 less intimidating.</p><p>What cool new features have you discovered in ES6? Let me know in the comments.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1e3ba6a77e20" width="1" height="1" alt=""><hr><p><a href="https://medium.com/full-stack-development/bleedin-edge-javascript-es6-es2015-transpiling-and-an-arrow-function-example-1e3ba6a77e20">Bleedin’ edge JavaScript: ES6/ES2015, transpiling and an arrow function example</a> was originally published in <a href="https://medium.com/full-stack-development">Full stack development</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Make BitBucket work harder for you in 2018: five productivity boosters]]></title>
            <link>https://medium.com/full-stack-development/make-bitbucket-work-harder-for-you-in-2018-five-productivity-boosters-1ccc30aefe3f?source=rss----10703dce1305---4</link>
            <guid isPermaLink="false">https://medium.com/p/1ccc30aefe3f</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[sourcetree]]></category>
            <category><![CDATA[bitbucket]]></category>
            <category><![CDATA[hipchat]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Lauri Jalonen]]></dc:creator>
            <pubDate>Thu, 01 Feb 2018 03:02:26 GMT</pubDate>
            <atom:updated>2018-02-01T03:01:07.271Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/269/1*Ki5bwIyvu0ywgA9LV_4CLw.png" /><figcaption>Yes, you can.</figcaption></figure><p>Okay.. BitBucket isn’t a cure for cancer. But it does offer a few nice hidden perks that are easy to set up and increase your productivity. Here they are.</p><p><em>NOTE: if you’re a swashbuckling BitBucketer that has done everything already, you probably know most, if not all, of this stuff. So, TL;DR: I’m touching on </em><strong><em>Pipelines, HipChat / SourceTree integrations, branch permissions and account-wide code search.</em></strong></p><h3>What frickin’ BitBucket?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*dW0eczk0QCLueFob1BDfqQ.png" /><figcaption>Dwight’s got a beet båcket.. okay, I give up.</figcaption></figure><p>An intro of BB for newcomers. Hint: nothing to do with Dwight and his beets as stated above. You might have heard of Git, GitHub, Subversion or code versioning before? <em>This is up that same alley.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/296/1*7osAE_UR1wiu6CrHR73cdA.png" /><figcaption>storing is boring, sharing is caring.</figcaption></figure><p>BitBucket helps you to <strong>store your code</strong>, and any version of your code that you’ve deemed worthy of saving. It also lets you <strong>share your code</strong> with others, and lets you control how others can <strong>contribute to your code</strong>, with any amount of approval bureaucracy that you may deem necessary.</p><p>It’s all about “your code” becoming shared code, but just how that happens is controlled by you. There are <a href="https://www.atlassian.com/git/tutorials/comparing-workflows">various workflows</a> that have become a way of working amongst the community, although today, modern DevOps practices have begun to re-encourage an <a href="https://trunkbaseddevelopment.com/">alternative, simplified approach</a> that has been around for years. These workflows, their pros and cons and alternatives are subject to a fair bit of debate, which I won’t go into right now. If you’re up for it, grab some popcorn and<a href="https://team-coder.com/from-git-flow-to-trunk-based-development/"> read the comments thread at the bottom of this article</a> or this Stack post, for example.</p><p>BitBucket supports both Git and Mercurial source control systems, and packs a ton of features, a few of which I’m about to reveal to you, free of charge :) Speaking of free, BitBucket is free (for smaller teams).</p><p>Looking at the fancy bagel below, BitBucket fits into a <a href="https://www.atlassian.com/">whole family of product development, task management, wiki, Continuous Integration and similar tools from the company Atlassian</a>, hailing from Sydney. Go Aussies!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*heEg69z5i8ZNDVZIM2FE6Q.png" /><figcaption>Bitbucket within the Atlassian family of productivity gumdrops.</figcaption></figure><h3>Feature 1: Pipelines</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4JkpxjupCTCYyOvJwFh3pA.png" /><figcaption>Pipelines run when you push code (and while you get coffee).</figcaption></figure><p>If you know <a href="https://travis-ci.org/">GitHub’s Travis</a>, then I can tell you that <a href="https://bitbucket.org/product/features/pipelines">Pipelines</a> are BitBucket’s answer to Travis. If you don’t know Travis, then just ask yourself this:</p><blockquote>As a developer, if I had BitBucket grant one wish for me, what would it be?</blockquote><p>At the top of my list is definitely “help to roll my code straight onto a staging and production server, just by me pushing it to a certain branch”. Right? Well, <a href="https://bitbucket.org/product/features/pipelines">BitBucket Pipelines</a> supports exactly that. The cool thing about it is that it’s integrated straight into your repository. All you need to do to activate this feature is to set up a <strong>bitbucket-pipelines.yml</strong> file in the root of your repository. Here’s <a href="https://confluence.atlassian.com/bitbucket/get-started-with-bitbucket-pipelines-792298921.html">a simple starter</a>.</p><p>You can use <a href="https://bitbucket-pipelines.atlassian.io/validator">BitBucket’s config validator</a> to make sure it’s alright (YML files are crazy about whitespace). Here’s a simple example of a config file:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/318a1c8910fb8e7e89b48fea79aad868/href">https://medium.com/media/318a1c8910fb8e7e89b48fea79aad868/href</a></iframe><p>So, in the above file, “dep deploy” would point to a PHP Deployer script which has further instructions on what to do within the Docker container.</p><p><strong><em>NOTE: </em></strong><em>To complete the release process and get Continuous Delivery going, you will also need to set up a deployment server, choose or create a Docker container for your server environment and set a deployment script using a framework such as </em><a href="https://deployer.org/"><em>PHP Deployer</em></a><em>, topics which are beyond the scope of this post. Maybe I’ll post an article dedicated to that later in the year.</em></p><p>Anyway, sailing on to the next productivity tips: <strong>HipChat and SourceTree integration.</strong></p><h3>Feature 2: get BitBucket notifications into your HipChat rooms</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IH9gBMq-PMLEAFjqp3Mvtw.png" /><figcaption>Good talk, Pipeline.</figcaption></figure><p>If you’re a true Atlassianite and therefore are pro- <a href="https://www.businessinsider.com.au/photos-atlassians-family-fun-day-looked-like-a-blast-2017-2">stuff like this</a>, you’ll probably already be hip to <a href="https://www.hipchat.com/">HipChat</a>. Or <a href="https://slack.com/">Slack</a> for that matter, this works for both. It’s just a tad easier for HipChat since BitBucket has native support, so you can just tick a few boxes and you’re done.</p><p>Go to your BitBucket repo Settings, choose HipChat Integration. If you’re logged into your HipChat account, you’ll get a list of rooms to pick from. Choose your room and tick some boxes on what’s notification worthy as shown in the choices below. No more flooding your emails, having to go peek in your repo or do <em>git fetches</em> to check whether that commit you’re waiting for your colleague in another country to finish has been pushed or not.. you’ll get pinged the second the code arrives in the repo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lC7aeyO-_arLa5L1n48fkg.png" /><figcaption>Go to Settings -&gt; HipChat integration, choose room and pick your notifications</figcaption></figure><h3>Feature 3: see your pipeline progress in SourceTree</h3><p>Again, if you’re an Atlassianite, you’re already using <a href="https://www.sourcetreeapp.com/">SourceTree</a>. It’s hard to live without it once you, er.. git going :) It’s 100% free and works on both OS X and Windows, so download that thing and try it for yourself already!</p><p>The intricacies of using SourceTree warrant a separate post, so I won’t go into that much detail. What I want to point out is a really nice feature in SourceTree: you can see the progress of your currently running pipeline (Feature #1 in this article) right in your SourceTree branch view. <em>How neat is that?</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0ATju2JhMZjCE83TifNpPA.png" /><figcaption>How nice of you to tell me, SourceTree.</figcaption></figure><h3>Feature 4: branch permissions</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pSn73dMeTMD-NLVh7OEsZw.png" /><figcaption>Which user gets to push, merge, delete on which branch?</figcaption></figure><p>Have you ever had a team that’s dispersed over a large geographic area, and has had different levels of authority over code? I have.</p><p>Like, some devs shouldn’t be allowed to push stuff in the master branch, which would initiate a deployment into the production server, and some devs should. Some devs should have the authority to delete branches, some not. Enter branch permissions: it allows you to define each and every user’s access per branch, just how you want it. <a href="https://confluence.atlassian.com/bitbucket/branch-permissions-385912271.html">Read more about BitBucket’s branch permissions here.</a></p><h3>Feature 5: account-wide code search</h3><p>This thing is a beauty, especially if you’ve already been on BitBucket for a long time and have like 300 repos on your account.. You can search for a snippet of code within all those repos from one location! It’s hard to explain how awesome this is, you just need to try it for yourself. Just type in a search string on the Code Search page and BitBucket (after it has indexed all code in every repo on your account) will go scouring your repos for occurrences of that string. I know, sounds trivial, but it’s pretty sweet to find that snippet of code you needed, in some project you didn’t even remember existed.</p><p>From <a href="https://confluence.atlassian.com/bitbucket/code-search-in-bitbucket-873876782.html">the search documentation page</a>, it’s clear that you can choose an account as the search scope, which is what I’ve done in the below screenshot. I looked for a string and it went off on a quest to find it within all the repositories it had previously indexed and peppered up for an account-wide search.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aKfKgCL4V7nmpTFwkyEzKA.jpeg" /><figcaption>Account-wide code search, anyone?</figcaption></figure><p>Well, have fun and may you be more productive with these little tips.<br>Share with your fellow BitBucketeers!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1ccc30aefe3f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/full-stack-development/make-bitbucket-work-harder-for-you-in-2018-five-productivity-boosters-1ccc30aefe3f">Make BitBucket work harder for you in 2018: five productivity boosters</a> was originally published in <a href="https://medium.com/full-stack-development">Full stack development</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vue.js, Angular, React, Mithril.js.. GitHub love and Native Mobile Apps]]></title>
            <link>https://medium.com/full-stack-development/vue-js-angular-react-mithril-js-github-love-and-native-mobile-apps-b4af7aa7123c?source=rss----10703dce1305---4</link>
            <guid isPermaLink="false">https://medium.com/p/b4af7aa7123c</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nativescript]]></category>
            <category><![CDATA[vuejs]]></category>
            <category><![CDATA[angularjs]]></category>
            <category><![CDATA[mithril]]></category>
            <dc:creator><![CDATA[Lauri Jalonen]]></dc:creator>
            <pubDate>Sun, 28 Jan 2018 17:02:12 GMT</pubDate>
            <atom:updated>2018-01-28T17:03:31.518Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cSAPyfPcNTV6N7F3YJh8Dg.png" /><figcaption>Three currently popular JS frameworks, plus one up-and-comer</figcaption></figure><p>If you’re a front end or full stack developer, you’ve surely come across this question: <strong>what Javascript framework would you go with if you had to pick one to build a JS application?</strong> There are many at first glance, but four of them stand out at the moment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/982/1*Vq6hiwb_uzo4rvvI_mYQKw.png" /><figcaption>Okay, I’m an old fart. No one gets this reference.</figcaption></figure><p>I’m not going to repeat what has been said in the excellent articles by <a href="https://medium.com/u/689eb0518dc9">Jens Neuhaus</a> in his <a href="https://medium.com/unicorn-supplies/angular-vs-react-vs-vue-a-2017-comparison-c5c52d620176">Angular vs. React vs. Vue comparison article</a>, or the equally informative <a href="https://mithril.js.org/framework-comparison.html">Mithril.js vs. React vs. Vue vs. Angular comparison on Mithril’s own site</a>. Both of them go deep into history, file size, performance, documentation and other aspects of each framework in detail. The only copy/paste I’d add from that article here is the list of questions Jens summarises. It does highlight most of the important things:</p><blockquote>How <strong>mature are the frameworks / libraries</strong>?<br>Are the frameworks likely to <strong>be around for a while</strong>?<br>How <strong>extensive and helpful are their corresponding communities</strong>?<br>How <strong>easy is it to find developers</strong> for each of the frameworks?<br>What are the <strong>basic programming concepts</strong> of the frameworks?<br>How easy is it to use the frameworks <strong>for small or large applications</strong>?<br>What does the<strong> learning curve</strong> look like for each framework?<br>What kind of <strong>performance</strong> can you expect from the frameworks?<br>Where can you have a <strong>closer look under the hood</strong>?<br>How <strong>can you start developing </strong>with the chosen framework?</blockquote><p>I’d rather attempt to complement these articles by highlighting a few aspects that I saw in the comments below those articles as well as something that I saw missing in both of them:</p><ol><li>What are the Github stats of each framework as of January 2018?</li><li>Can my JS compile into a <strong>native mobile app? (spoiler: YES!)</strong></li></ol><h3>Github stats of React, Angular ,Vue.js and Mithril.js</h3><p>Here they are, as of 28th January:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vZPk9D_0Lu_Scz0BL4fTOw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5n3PrN5adNIxES7gQQrmEA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y0JFLRFVfl5cK1XpcqraCw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bUJJTHuc1kEHhQCbuLeuJg.png" /></figure><p>Stars show general appreciation, forks show involvement, watch shows interest.</p><p>So, at the time of this writing, in terms of GitHub love, React and Vue are en par, Angular is falling behind, and Mithril.js is still up and coming. Whatever. This is just one way to look at it, and probably will change throughout</p><p>Anyway, let’s look at the second question.</p><h3>Can my JS compile into a native mobile app?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*muc0oVQDpEHGfVj6UFuWqg.png" /><figcaption>Angular and Vue use NativeScript, React has its React Native</figcaption></figure><p><strong>Short answer:</strong> yes, if you’re on React, Angular or Vue. If you’re on Mithril.js, good luck my friend, I have no idea :D keep an eye out.</p><p><strong>Long answer:</strong> To clarify, there are are currently <strong>four ways to create a native mobile application for Android and iOS</strong>, in chronological order:</p><ul><li>Many years back, there was only one way: a <strong>truly native app</strong>. Java for Android and Objective-C/Swift for iOS. Developers, for various reasons, legacy being one, still take this approach to date. It’s an established practice, so why not? Well, today developers have made a web app and would like to benefit from that time investment in the mobile device world as well, recycling all that code somehow. Along came hybrid apps.</li><li>As the next alternative, frameworks like the <a href="https://ionicframework.com/">Ionic framework</a> would create an app wrapper with a browser window and encapsulate your web app. This being a <strong>hybrid app</strong>, a combination of a web application and a nativer app. Ionic and its buddies are still around. However, recently (within the past 2 years) an even cooler way was born: compiled apps<strong>.</strong></li><li>Today, with the help of tools such as <a href="https://www.nativescript.org">NativeScript</a> and <a href="https://facebook.github.io/react-native/">React Native</a>, JS apps get a few added components and compile straight into native mobile apps. Hence the name <strong>compiled app.</strong> Or whatever you want to call it. The main point is that a significant amount of Javascript business logic and functionality code can be directly recycled, and still benefit from the native performance and components of mobile devices.</li><li>In the background, workbenches like <a href="https://unity3d.com/">Unity</a> can spit out mobile applications. Ignore that approach for now, that’s a whole separate article, and surely Medium will have what you need if Unity’s your bag.</li></ul><p>All of these approaches have their pros and cons. To get an understanding of them, watch <a href="https://www.youtube.com/watch?v=rb8smP_xTTY">Academind’s highly informative video and thorough comparison of ways to create native mobile apps.</a></p><p>Now, the tools. <a href="https://www.nativescript.org/">NativeScript</a> and <a href="https://facebook.github.io/react-native/">React Native</a> do pretty much the same thing. They take Javascript and compile it into a native mobile app. It’s up to you to decide which one of those two to use, really. If you’ve got existing React, Angular or Just make sure you try both <a href="https://snack.expo.io/">Expo for React Native</a> and <a href="https://play.nativescript.org/">NativeScript Playground</a>.</p><h3>Expo for React Native</h3><p>React Native is a no-brainer especially if you’re already down the React path. Expo is a natural next step in that evolution. You can read <a href="https://medium.com/u/3e0af129613a">Jani Eväkallio</a>’s <a href="https://medium.com/@jevakallio/react-native-do-it-do-it-now-e3a4704a80b0">plug on React Native</a> and Expo and then, head on down to the <a href="https://snack.expo.io/">Expo test area</a> and have a go. It’s a pretty fun place to be.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1U7q1stbUeW32rrAGMjl-w.png" /><figcaption>Download an app and scan the QR, and you’re good to go.</figcaption></figure><h3>Playground for Nativescript</h3><p>Originally, <a href="https://www.nativescript.org/">NativeScript</a> made it easy for JavaScript developers to create mobile apps for both platforms, from one JavaScript codebase, using standard components. That codebase was then compiled into actual native app packages that could be released in the App Store and Google Play. As time went by, it also started supporting Angular code, so Angular code could be recycled. Today, it supports NativeScript, Javascript, Angular and (experimentally) Vue.js. I warmly recommend to <a href="https://play.nativescript.org/">check out the NativeScript Playground</a>, it’s pretty awesome to see the native app update immediately on publishing the Javascript you write into the Playground window.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2cVe7w8ABi6pue8f1i-jnQ.png" /></figure><p>Anyway, happy trails with Expo or Playground. I hope this article increases awareness to your evaluation of JS frameworks: <em>keep an eye out for GitHub love, and check out native mobile app possibilities of each framework.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b4af7aa7123c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/full-stack-development/vue-js-angular-react-mithril-js-github-love-and-native-mobile-apps-b4af7aa7123c">Vue.js, Angular, React, Mithril.js.. GitHub love and Native Mobile Apps</a> was originally published in <a href="https://medium.com/full-stack-development">Full stack development</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A few AWS CloudWatch tips]]></title>
            <link>https://medium.com/full-stack-development/a-few-aws-cloudwatch-tips-e8d459609264?source=rss----10703dce1305---4</link>
            <guid isPermaLink="false">https://medium.com/p/e8d459609264</guid>
            <category><![CDATA[amazon-web-services]]></category>
            <category><![CDATA[aws-cloudwatch]]></category>
            <category><![CDATA[incident-reporting]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[dashboard]]></category>
            <dc:creator><![CDATA[Lauri Jalonen]]></dc:creator>
            <pubDate>Tue, 23 Jan 2018 12:50:13 GMT</pubDate>
            <atom:updated>2018-01-23T12:50:13.233Z</atom:updated>
            <content:encoded><![CDATA[<h3>A few AWS CloudWatch productivity tips</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KcuC2i-QZO64FAoH6MiSjQ.png" /></figure><p>For those getting into AWS CloudWatch dashboards, I thought I’d share a few productivity tips on changing to your local timezone, using reference lines and comparing averages to peaks.</p><h3>Tip 1: yes, you can get metrics using your timezone</h3><p>Is this a relief or what! I spent too much time calculating what my time is compared to UTC so I could figure out when my latency peak is, until I found this little jewel at the top of the dashboard, in time selection. It’s not so easy to spot so here it is:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vaD1aqvSCwiyjZ0whsNPEg.png" /><figcaption>Open the custom menu in the right hand corner</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nJstE26bnX3e6tIbOzs8eA.png" /><figcaption>Select UTC in the top right corner of the custom menu, which will give you the option of Local Timezone. Voilà!</figcaption></figure><h3>Tip 2: Put some reference (annotation) lines in there</h3><p>Metrics in your charts change over time, so it’s helpful to set a few reference lines. AWS calls them annotations. You can set them in the Graph Options tab in the metric edit view.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qXzPMP_ei2gyRDys3C4PDw.png" /></figure><p>You can choose the value, which axis to put them on, and whether to fill the graph above or below the reference line.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/564/1*mQbmNyWhyezB1MkE4jKAGw.png" /><figcaption>A permanent reference line.</figcaption></figure><p>Very helpful when looking at a high-level view of several metrics on a page: is this thing over or under what I consider acceptable?</p><h3>Tip 3: Look at peaks instead of averages</h3><p>By default, the metrics you create in the AWS CloudWatch dashboards are averages. This is good information, but what if you need to identify peaks, for example CPU peak times? They don’t show up in the averages at all. Consider this visualisation:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mpOrKtZ4L6MirvjVPiW32A.png" /><figcaption>This graph actually has four values in it: peaks for all servers and individual averages for each server.</figcaption></figure><p>In this graph, four things are displayed: The Latency Peaks for all three servers, as well as the average latency per server. As you can see (or can hardly see, by the looks of it), average latency is extremely low, sub-second low actually, whereas the servers do have occasional latency peaks, even up to 24 seconds at times! Huge difference, yeah?</p><p>So, it’s important to look at both averages, but also consider peaks. Combined with tip #1, you’ll know exactly at what time your peas occur. That’s useful information for example for CPU, disk throughput or in the above case, latency metrics.</p><p>This is how the above graph is set up. It’s measuring the latency metric for an Elastic Load Balancer:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9oHTpaNsPBtoxANE01Hcdw.png" /><figcaption>Graphed Metrics section, select “Maximum” as the Statistic for the overall metric.</figcaption></figure><p>Anyway, that’s all the AWS CloudWatch tips for today. Thanks for the read, please share with your AWS friends!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8d459609264" width="1" height="1" alt=""><hr><p><a href="https://medium.com/full-stack-development/a-few-aws-cloudwatch-tips-e8d459609264">A few AWS CloudWatch tips</a> was originally published in <a href="https://medium.com/full-stack-development">Full stack development</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Is your Linux server disk space maxing out, but still isn’t? Check your iNodes!]]></title>
            <link>https://medium.com/full-stack-development/is-your-linux-server-disk-space-maxing-out-but-still-isnt-check-your-inodes-f5e77b5736d8?source=rss----10703dce1305---4</link>
            <guid isPermaLink="false">https://medium.com/p/f5e77b5736d8</guid>
            <category><![CDATA[admin]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[servers]]></category>
            <dc:creator><![CDATA[Lauri Jalonen]]></dc:creator>
            <pubDate>Mon, 22 Jan 2018 05:05:34 GMT</pubDate>
            <atom:updated>2018-01-22T05:12:36.206Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*otcOgDPrY36xuK3xHbjryA.jpeg" /><figcaption>You might just be maxing out your iNodes, not your disk space!</figcaption></figure><p>Just a handy money-saving tip here.</p><p>Ever had a mysterious problem on your Linux server where you’re getting “disk space full” but don’t seem to have maxed out your disk space? Do you have a bunch of small files on your drive? You may be maxing out your iNode usage.</p><p>This maxing out is a question of quantity, rather than size. There is an iNode allocated to each file in the Linux filesystem, so if you’ve got a very large number of small files (we’re talking hundreds of thousands or more), the iNode allocation will start to suffer. Obviously one solution is to increase your volume size, but before you dish out those $$, consider that you may just need to remove some 100,000 redundant files and you won’t need to invest more money into a bigger volume.</p><p>When you’re checking your disk, use df -ih instead of df -h.</p><p>I discovered that iNodes, not disk space, were actually the reason my disk was full.</p><blockquote>/$ df -ih</blockquote><p><em>Filesystem Inodes IUsed IFree </em><strong><em>IUse%</em></strong><em> Mounted on<br>/dev/xvda1 512K 512K 0 </em><strong><em>100%</em></strong><em> /</em></p><p>When iNode usage is 100%, the amount of options to investigate this are slightly limited as the server considers disk space completely unavailable. You can’t apt-get install tools of any kind to assist you with your quest to find all those files.</p><p>I ended up trying this command, to look for the directories with most files:</p><blockquote>/$ sudo find . -xdev -type f | cut -d “/” -f 2 | sort | uniq -c | sort -n</blockquote><p>However, as disk space is full, sorting doesn’t work, so I added this:</p><blockquote>/$ find . -xdev -type f | cut -d “/” -f 2 | sort <strong>— buffer-size=10G</strong> | uniq -c | sort -n</blockquote><p>The buffer-size parameter attempts to put the whole search in memory instead of saving it to a temp file. This quickly gave me a list of root folders and recursively the total amount of files within those folders. Going into that folder under / and re-running the command gave me a nice list of folders, each which had thousands of files. I could safely delete a bunch of those folders as I knew they were old and redundant (actually left there by the previous server guy) so, after removing some 30,000 files from that directory my df -ih command looked like this instead:</p><blockquote>/$ df -ih</blockquote><p><em>Filesystem Inodes IUsed IFree </em><strong><em>IUse%</em></strong><em> Mounted on<br>/dev/xvda1 512K 304K 209K </em><strong><em>60%</em></strong><em> /</em></p><p>Voila! Problem solved. Only 60% usage, and that was just by deleting a few redundant directories that had thousands of unneeded files.</p><p>So, when you see your disk is full, but df -h doesn’t agree, remember to <strong>check your iNode usage</strong> before you increase your disk space.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f5e77b5736d8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/full-stack-development/is-your-linux-server-disk-space-maxing-out-but-still-isnt-check-your-inodes-f5e77b5736d8">Is your Linux server disk space maxing out, but still isn’t? Check your iNodes!</a> was originally published in <a href="https://medium.com/full-stack-development">Full stack development</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laradock + XDebug + MS Code? No problem!]]></title>
            <link>https://medium.com/full-stack-development/laradock-xdebug-ms-code-no-problem-35a4338deb3f?source=rss----10703dce1305---4</link>
            <guid isPermaLink="false">https://medium.com/p/35a4338deb3f</guid>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[xdebug]]></category>
            <category><![CDATA[visual-studio-code]]></category>
            <dc:creator><![CDATA[Lauri Jalonen]]></dc:creator>
            <pubDate>Sun, 17 Dec 2017 09:39:44 GMT</pubDate>
            <atom:updated>2017-12-17T09:48:04.400Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t_igGbjRW92nLn4f0bFlVg.png" /><figcaption>This tutorial will have you tasting the sweet fruit of your XDebug labor in no time!</figcaption></figure><p>I recently got Laradock’s XDebug and MS Code to talk to each other. Setting it up, was a slightly crooked path and a discovery that getting it to work is a sum of its parts. Sharing is caring, ladies and gents, so I figured I’d give you all the bits and pieces here in one place.</p><p>What you’ll need:</p><ul><li>Laradock set up and already running an Nginx server and PHP. Soz, setting up Laradock is too lengthy to cover in this tutorial. There are plenty of resources out there, mainly <a href="http://laradock.io/getting-started">Laradock’s own installation tutorial</a>.</li><li>basic knowledge of OSX terminal commands</li><li>MS Code installed</li><li>You also need the excellent <a href="https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug">Php-debug for MS Code extension by Felix Becker</a> installed.</li></ul><p>Assuming you’ve got Laradock up and running, this tutorial should take you about 30 min to complete.</p><h3>Laradock</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n_1pKTZQlx3NNk19Tg4c3Q.png" /><figcaption>Oh, that sweet Docker magic..</figcaption></figure><p>Just a brief section for those who ended up in this tute and don’t yet know about <a href="http://laradock.io/">Laradock</a>.. I won’t spend much time advertising it, just a little :) If you’re a PHP dev, you already know about it or at least have heard about it. If not, take a look. Laradock is basically a collection of Docker containers that can be orchestrated to build into a PHP/Nginx/MySQL environment with minimal effort. It provides every developer with the same basic environment, regardless of whether they’re on Linux, OSX or Windows. Goodbye, “works for me”. And because it’s running off Docker, it won’t mess up your system defaults and you get to decide how much system resources its virtual machine uses. Pretty neat. Laradock is actually a lot more than a PHP stack: it comes with Symfony, Laravel, Redis, Mongo and goshdarn what else bundled. And, with a little tender love and care, you can base your Continuous Deployment setup on the same containers. Nerdalicious.</p><h3>XDebug</h3><p>Have you ever needed to find out some variables within a whole nested array of other variables, and confirm some variable gets updated? And, have you had to use var_dump or print_r or echo to see your vars? Painful and time-consuming. Enter XDebug. It integrates with the code in your MS Code environment and gives you the option of stopping a PHP script mid-stream and examining all the system and user set variables, as well as step forward, into and out of functions. You’ll see, wondrous events doth transpireth before thy very eyes.</p><h3>How this thing works</h3><p>For those who have done a local setup and used XDebug in the past and have just recently started using Docker, here’s a short explanation to why this is slightly different:</p><blockquote>A virtual container, in this case Laradock’s PHP-FPM container, is an entity that’s separated from your machine’s native environment. Therefore, when you’re wanting XDebug to do something useful from a container, you need to make sure that XDebug (running in the Laradock container) can reach your MS Code environment (running on your machine), which is now listening to incoming connections. That’s why you need to define the rules of this connection differently to running everything on your localhost.</blockquote><p>Just wanted to get that off my chest :)</p><h3>Step 1: Activate XDebug in Laradock</h3><p>In your Laradock .env file (the one with all the central configs) set</p><p><strong>WORKSPACE_INSTALL_XDEBUG=true</strong></p><p>Then, edit the Laradock xdebug.ini files. Yeap, it’s in two places, don’t ask why. The locations are Laradock/PHP-FPM/xdebug.ini and Laradock/workspace/xdebug.ini. Insert this config:</p><p><strong>xdebug.remote_enable=1<br>xdebug.remote_host=docker.for.mac.localhost<br>xdebug.remote_port=9000<br>xdebug.remote_autostart=1<br>xdebug.remote_connect_back=0<br>xdebug.remote_handler=dbgp<br>xdebug.max_nesting_level=250<br>xdebug.remote_log=”/var/www/xdebug_log/xdebug_docker.log”</strong></p><p>What’s happening in the above config is that you’re:</p><ul><li>enabling remote debugging</li><li>defining the remote host to be your localhost’s IP address (yeap, special namespace defined for macs, see <a href="https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host">https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host</a>)</li><li>setting remote debugging to start automatically and</li><li>using the dbgp handler (you don’t need to know what that is)</li><li>The max_nesting_level has to do with the depth of variable/array structure that XDebug drills into, I think. I’ve never needed to change that.</li></ul><p>Lastly, I’ve enabled XDebug logging, so I can.. debug XDebug :) For that to work, create an <strong>xdebug_log</strong> folder for the log file into what you’ve defined as your synced workspace, i.e. what folder /var/www/ is mapped to in your folder structure. Mine is Users/lauri/code/xdebug_log. That will make sure that everything XDebug does (or fails trying to) is logged into that folder.</p><p><em>All done configuring Laradock!</em> Now it’s time to rebuild and restart your Laradock PHP-FPM container, since you’ve made some fundamental changes. Normally you’d just restart, but since you’re including a new module, you need to actually build the container so Xdebug gets added.</p><p>So, run this from the terminal in your Laradock root:</p><p><strong>laradock $ docker-compose build php-fpm</strong></p><p>You’ll get a bunch of building output. You’ll see some red, but the reds I’ve gotten are notification only.</p><p>After that, restart:</p><p><strong>laradock $ docker-compose down &amp;&amp; docker-compose up -d nginx mysql</strong></p><p>Alrighty, moving on to MS Code.</p><h3>Step 2: MS code setup</h3><p>We’re using the excellent php-debug plugin built by Felix Becker. Props!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*516VrbAOOl0tafMAPktQuA.png" /><figcaption>You know what to do.</figcaption></figure><p>Here’s the <a href="https://gitter.im/felixfbecker/vscode-php-debug">Gitter forum for the MS Code php-debug extension</a>, full of like-minded individuals, more knowledgeable than yours truly, many of who have gone through the same process of setup and are glad to offer advice. As a matter of fact, they inspired me to write this tutorial :)</p><p>Then set up MS Code to listen to incoming connections from Laradock:</p><ol><li>Go to Debug view</li><li>Add a config</li><li>Fire up Debug with that config</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XSN_EdreZaAjuxzTNuh4gg.png" /></figure><p>Adding a config creates a launch.json file that MS Code uses for its settings (all configuration of the MS Code environment is by using JSON files). Here’s what launch.json needs to contain:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fa919606ad1f1f4e8a2d89f758aadb3a/href">https://medium.com/media/fa919606ad1f1f4e8a2d89f758aadb3a/href</a></iframe><p>So, explaining the above:</p><ul><li>I’m logging what happens in my launch config</li><li>This launch config is specifically for PHP</li><li>An incoming request (from Laradock) launches the MS Code debugger,</li><li>Those requests are expected to be coming from port 9000 as previously defined in xdebug.ini.</li><li>The code xdebug is supposed to be using for the session is mapped into this folder.</li></ul><p>About the last item: you need to explain to XDebug where it can find its equivalent Laradock-synced files on your local system so it can open them up in the editor and allow stepping forward, in and out. This is achieved by the <strong>pathMappings array in your launch.json</strong>. Remember, for each project you need to set up one entry here. Think of this as the holy union between your project workspace files and MS Code.</p><p>Example: I work on project1 that’s in folder Users/lauri/code/project1. Laradock is set up to /var/www which is mapped to my directory Users/lauri/code. Therefore a project that’s in Users/lauri/code/project1 has a mapping that looks like this:</p><p><strong>“pathMappings”: {<br> “/var/www/project1”:”/Users/lauri/code/project1&quot;<br>}</strong></p><p>Now, after you’ve added the config and fired up MS Code debug, an orange bar should appear at the bottom of your MS Code environment:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zlH4sB886gWTFkBhYeelgg.png" /></figure><p>What you can also look out for when reloading your page is output in the debug console of MS Code. You should be seeing incoming request threads like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IYebVnGaECdCg687E2OcvQ.png" /></figure><p>Okay, time to place some breakpoints.</p><h3>Step 3: place a breakpoint</h3><p>Add a breakpoint to your file. For the purpose of this tute, I’ve created a simple file, which contains just one line. The important thing is that you place the breakpoint onto a legit line of PHP, such as a function execution or a variable declaration. Make sure you validate the breakpoint by reloading the ms code XDebug listener.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*iFDaWfn-UdtZrTGBxWY2Ag.png" /></figure><p>If the breakpoint is a hollow circle, that means you need to refresh the debugger to validate that breakpoint. You can do so in the debug bar that’s now appeared when you started listening to incoming connections.</p><h3>Step 4: toggle XDebug on and off</h3><p>Laradock provides a simple way to add or remove XDebug to or from your project. It’s handy, because you don’t always need XDebug and it slows down things slightly so you’ll want to switch it on only when you’re actually debugging. Laradock has provided these handy commands, which are run from the Laradock folder:</p><p><em>laradock $ ./php-fpm/xdebug start<br>laradock $ ./php-fpm/xdebug stop<br>laradock $ ./php-fpm/xdebug status</em></p><h3>Step 5 (optional): adjust your Nginx timeout</h3><p>As an additional thingy for your xdebugging pleasure, you may want to adjust your <strong>keepalive_timeout in your nxing.conf file. </strong>That’s optional, but I’ve found it to be helpful to set that to something like 300 seconds, so your script doesn’t time out while you’re debugging. Remember to restart (no need to rebuild) your Laradock instance after changing that.</p><p>Here’s a <a href="https://go.microsoft.com/fwlink/?linkid=830387">tutorial on using the MS Code debugger.</a> That’s a good read on how to get the most out of your new setup.</p><p>Happy XDebugging!</p><p>Kind Regards,<br>Lauri Jalonen</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35a4338deb3f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/full-stack-development/laradock-xdebug-ms-code-no-problem-35a4338deb3f">Laradock + XDebug + MS Code? No problem!</a> was originally published in <a href="https://medium.com/full-stack-development">Full stack development</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>