<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Zouhir on Medium]]></title>
        <description><![CDATA[Stories by Zouhir on Medium]]></description>
        <link>https://medium.com/@_zouhir?source=rss-1ea4ac63ade6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*aQAue-bl-fUJiJc_ph6rlg.png</url>
            <title>Stories by Zouhir on Medium</title>
            <link>https://medium.com/@_zouhir?source=rss-1ea4ac63ade6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 05 Nov 2026 18:32:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@_zouhir/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Swipe Views with CSS Snap Points: Building a More Efficient Mobile Web Navigation]]></title>
            <link>https://medium.com/@_zouhir/swipe-views-with-css-snap-points-building-a-more-efficient-mobile-web-navigation-f9ac8c53dbc0?source=rss-1ea4ac63ade6------2</link>
            <guid isPermaLink="false">https://medium.com/p/f9ac8c53dbc0</guid>
            <category><![CDATA[good-stuff]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[css]]></category>
            <dc:creator><![CDATA[Zouhir]]></dc:creator>
            <pubDate>Sat, 31 Mar 2018 10:29:26 GMT</pubDate>
            <atom:updated>2018-08-15T14:35:23.046Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kKSLMXu7LoKU2tG9_ihS2g.png" /></figure><p>Update 15 — August — 2018: Chrome has shipped CSS Scroll Snap Points specs and will be enabled by default as of Chrome 69, Web Developers can now use this feature on all of Edge, Chrome, Firefox and Safari 🎉.</p><p>Update 01 — April — 2018: Fixed some typos — Broke down the problems of traditional carousel into clearer points — broke down the advantages of Snap Points into clearer points — Added future work I will be doing on this topic.</p><p>The mobile web has been making a lot of progress in the last year or two and I have happily replaced few native apps on my phone with their web alternatives and today I’m a full-time user of Twitter Lite and Instagram PWA.</p><p>For a long time the responsive mobile web has been hierarchical however, native apps has flattened the vertical hierarchies in their main views and implemented a very popular pattern sometimes called “horizontal paging” which provides the users with an efficient horizontal navigation from one tab to another using a simple left or right gestures and makes the relevant data or content in different app screens more accessible.</p><p>Not to my surprise, Twitter and Instagram PWAs — that I use daily as I mentioned earlier and they are 2 of my all-time favourite web apps — have brought in their native apps like navigation bars. Also not to my surprise, there is no swipe gesture and the absence of swipe gestures is not an app limitations but unfortunately a web platform limitation in my opinion.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TRoWJfD64CeUOxPWIpPq5w.png" /><figcaption>Instagram PWA left, Twitter PWA right — Navigating twitter tabs is extremely difficult with 1 hand as the nav bar is further away on larger screen devices.</figcaption></figure><h4>Traditional Web “Carousel” Problems</h4><p>The traditional, cross-browser carousel problems starts with the implementation requirements:</p><ul><li>A wrapper with overflow hidden.</li><li>A wide wrapper of (number of screens*screen width) pixels.</li><li>A minimum of 7 different events listeners: mousedown, mouseup, mouseleave, mousemove, touchstart, touchend, touchmove.</li><li>On mouse or touch move we translate the wider container.</li><li>CSS will-change:transform and whatever other magic we got and can add there to make that transition as smooth as possible.</li></ul><p>Following those steps should give us a decent carousel with 50 bugs or so that is probably good enough for a hero banner but if we want to use it for an app views that have complex children layout, posts lists, comments, images, etc.. it will not do an amazing job for many reasons:</p><ul><li>Code complexity caused by having to deal with 7 different mouse and touch JavaScript events.</li><li>If any children elements are meant to receive mouse or touch events, deciding if the parent should propagate or act first can be tricky and a further assistance form pointer-events and touch-events might be helpful to allow or block specific elements from receiving mouse or a touch events at some cases.</li><li>Determining where the transition has to stop can also be tricky especially for different size children or on the container’s resize where the children size might change in which case a JavaScript recalculation is required.</li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2F3o7WIAdge8gFkJifbq%2Ftwitter%2Fiframe&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2F3o7WIAdge8gFkJifbq%2Fgiphy.gif&amp;image=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2F3o7WIAdge8gFkJifbq%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="435" frameborder="0" scrolling="no"><a href="https://medium.com/media/5822137b9db323f59930877f53c47133/href">https://medium.com/media/5822137b9db323f59930877f53c47133/href</a></iframe><h4>CSS Scroll Snap Points To The Rescue</h4><p>CSS scroll snap points module helps us specify where a container’s scroll port should stop after the scrolling operation has been completed, read more about it on <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Scroll_Snap_Points">MDN</a> and check <a href="https://caniuse.com/#feat=css-snappoints">Can I Use</a> for browser compatibility. It is coming along nicely in all major browsers, the only no-support flags are in Chrome but the good news it’s being actively and almost daily worked on, check out the bug smashing progress <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=497851">here</a> <em>(Go Chrome!)</em>.</p><h4>Few Problems CSS Scroll Snap Points Will Solve</h4><ul><li>Reduce the JavaScript code complexity as there’s no need to listen to mouse or touch events anymore.</li><li>More efficient way to respond to children elements mouse &amp; touch events since the parent does not require them anymore, there is no need to check on whether the parent wrapper has to respond or propagate.</li><li>Ability to deal effortlessly with different size children or after children widths changes due to a container resize for example. CSS Snap Points will always snap to the begging of the child element or to any point we specify using scroll-snap-coordinate property without needing to calculate the element’s widths.</li></ul><h4>Simple CSS Only Swipe Views Demo</h4><p>If you using Edge, Safari or FireFox you can try my swipe views pen with CSS Snap Points:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fzouhir%2Fembed%2Fpreview%2FjzZygZ%3Fheight%3D600%26slug-hash%3DjzZygZ%26default-tabs%3Dcss%2Cresult%26host%3Dhttps%3A%2F%2Fcodepen.io%26embed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2Fzouhir%2Ffull%2FjzZygZ%2F&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F601590.jzZygZ.small.23776c4a-ccd4-48fc-85af-20029846dbd8.png&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/5e49381923a46a1f85cbaf6685551a80/href">https://medium.com/media/5e49381923a46a1f85cbaf6685551a80/href</a></iframe><p>Alternatively, you can check out this video I recorded of that pen:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FVmyF9S-sRhc%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DVmyF9S-sRhc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FVmyF9S-sRhc%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7765f48f9b11f156b693f2b72ea402bd/href">https://medium.com/media/7765f48f9b11f156b693f2b72ea402bd/href</a></iframe><h4>CSS Snap Points Look Promising</h4><p>Snap Points seem to have everything I need to replace a 100 lines of carousel code that needed 7 different JavaScript events and a bunch of math and logic with literally 4 lines of CSS and the results are certainly more natural and performant.</p><pre>overflow-x: auto;<br>scroll-snap-coordinate: 0 0;<br>scroll-snap-points-x: repeat(100%);<br>scroll-snap-type: mandatory;</pre><h4>Advanced Usage: CSS Grid with CSS Snap points</h4><blockquote>CSS Grid + CSS Snap Points = 0 JavaScript, 0 CSS Media Query Responsive Swipe Views</blockquote><p>CSS Grid has brought a lot of flexibility and magic to the way browser layout works, here’s a pen where I made a fully responsive Swipe Views (Carousel) with CSS Grid and Snap Points where neither JavaScript nor CSS media queries are required to achieve the responsiveness.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fzouhir%2Fembed%2Fpreview%2FRMMvGZ%3Fheight%3D600%26slug-hash%3DRMMvGZ%26default-tabs%3Dcss%2Cresult%26host%3Dhttps%3A%2F%2Fcodepen.io%26embed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2Fzouhir%2Fpen%2FRMMvGZ&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F601590.RMMvGZ.small.42961074-54fb-4d07-8d6c-c84ea7a89d4c.png&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/d5dbc7c796713e6ae92d57c4cc52a943/href">https://medium.com/media/d5dbc7c796713e6ae92d57c4cc52a943/href</a></iframe><h4>Thumbs Up</h4><p>In my opinion, Snap Points seems to be an option for building Swipe Views that can make browsing a lot of web apps’ home screens and consuming their content a more fluent experience and can also help us get rid of tens of lines of JavaScript code if all we needed was a simple minimal web carousel.</p><p>I have plans to experiment further more with them in the near future and learn more about their “cons” in real-world applications. I will also experiment with building a performant dynamic carousel and then will most likely publish a part 2 post as a follow-up.</p><p>Until then, if you have experimented with CSS Snap Points module, have a comment or anything to add to this post please comment below!</p><p>Thank you for reading 💚.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f9ac8c53dbc0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Preact meets CMS: Building Lightweight Portable Widget Components]]></title>
            <link>https://medium.com/@_zouhir/preact-meets-cms-building-lightweight-portable-widget-components-e151622e2ac6?source=rss-1ea4ac63ade6------2</link>
            <guid isPermaLink="false">https://medium.com/p/e151622e2ac6</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[cms]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[preact]]></category>
            <dc:creator><![CDATA[Zouhir]]></dc:creator>
            <pubDate>Mon, 26 Mar 2018 10:12:56 GMT</pubDate>
            <atom:updated>2019-10-04T04:52:58.755Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UjAv4CDDw5tljSAV71BMDQ.png" /></figure><p>A Content Management System (CMS) is one of the very first tech investments a lot of companies make, and no matter how large the business is or what kind of CMS they choose, product &amp; marketing teams need an effortless and safe way to author new components with their ever evolving ideas in order to serve their customers better and deliver more value.</p><p>Traditionally, this is done by building those components as styled Java or PHP templates depends what CMS you have, which I believe is still the best way to deliver most of the typical content blocks where there’s lot of words and images and a minimal amount of UI interactions, but when a CMS component is rich with UI interactions building that in vanilla JavaScript with the server rendered HTML can be a little tedious and modern JavaScript UI libraries like Preact, React, Svelte, Vue can actually be a better way to tackle this problem and improve the Developer Experience, Productivity and Testability.</p><h3>The Advantages of Client Side Widgets</h3><p>Building a client side widgets and deploying it as a static file make a lot of sense in some use cases that look similar to those:</p><h4><strong>Rich UI Interactions</strong></h4><p>If a widget is big on fetching data from external or 3rd party APIs and has a very dynamic interface and possibly client side data filters, dropdowns, sliders etc.. utilising a modern UI library will keep you highly productive by providing a functional approach to build and reuse elements, also by giving you a bunch of compatible off the shelf open source modules to import and use or just get some inspiration from.</p><h4><strong>Domain-wide Reusability</strong></h4><p>Client side widgets can be served through your CDN and can be reused not only across the CMS pages, but also across the business’ different websites and web apps.</p><h4><strong>Lazy Loading</strong></h4><p>CMS pages are rendered on the server and that gives us a quick fast first paint with ready content, loading client side rendered widgets asynchronously that will progressively enhance the page without being a blocker.</p><h4><strong>Fast Independent Releases</strong></h4><p>Releasing a feature or a fix to my employer’s CMS for example takes a lot of time as there are release slots you have to check and book one a few days in advance, while a client side widget deployed as a static file and served over the CDN has helped us deploy as much and as often as we wanted.</p><h4><strong>Build in Isolation and Leverage Modern Tools</strong></h4><p>Some enterprise CMS are a few years old, and it’s very common to see a lot of JS files, grunt tasks and the answer to what’s your existing front-end architecture question is “No architecture really, just jQuery and stuff”. Building in isolation with all what modern tools has to offer such as hot module reloading, es harmony modules tree shaking is a win for both of the developers and the project.</p><h4><strong>Utilise a Shared Component Library</strong></h4><p>There are few popular Open Source frameworks like Storybook and Styleguidist for building, documenting and showcasing a set of elements and components that can be reused across all your widgets.</p><h3>Progressive Widgets Architecture (PWA) with Preact</h3><p>There are many reasons that make Preact an ideal library to build those widget, some of them are:</p><h4>Tiny Library Size (Portability)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SJo05jQzMtMbfWno8ic4Bw.png" /></figure><p>Preact’s tiny size will leave you a lot of room for your app’s code even when it’s bundled in your widget. It is only 3Kb, just around the size of the fetch polyfill.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*idOYw9FiLzOa5BfJDMNfLw.png" /></figure><h4><strong>Great Performance on Mobile</strong></h4><p>Preact provides some very satisfying results when testing and benchmarking its performance on mobile devices where JavaScript libraries usually struggle the most. Preact is light weight in size and engineered as a browser-first library, where there is minimal abstraction and no browser events rewrites, all those combined have helped Preact reduce the overhead and improve the performance for mobile browsers.</p><p>Size and performance are quite important as the CMS host page might be fast or slow, might contain a ton of other JavaScript, render blocking tracking scripts, etc.. so providing a widget that is as light and as fast as possible is a critical key in progressively enhancing the CMS pages and the whole experience.</p><h4><strong>Easy to Pick Up</strong></h4><p>It doesn’t matter if a frontend developer is experienced in P\React or not, what makes picking up Preact fairly easy is the identical ES6 API to React’s API and lifecycle methods (up until latest stable) and there are some excellent blog posts, examples and tutorials developers can learn from.</p><h4><strong>Ecosystem</strong></h4><p>Preact ecosystem has a lot of packages and modules to support a lot of common needs, it is also worth mentioning that you can utilise all react ecosystem modules and they will be fully compatible with your preact code via <a href="https://github.com/developit/preact-compat">preact-compat</a>. <em>(PS: preact-compat will add 4.8 KBs).</em></p><h3>Rendering in the CMS Page DOM</h3><p>Looking at this simple widget as an example, you can easily tell we need to give ourself a better API and more flexibility:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/393110a584294864fa29d5877a7854cb/href">https://medium.com/media/393110a584294864fa29d5877a7854cb/href</a></iframe><h4><strong>And Then There Was Preact-habitat</strong></h4><p><a href="https://github.com/zouhir/preact-habitat">Preact-habitat</a> is just an extension to Preact’s render function where I decided to provide more API. The concept of Preact habitat is pretty straight forward and can be summarised as</p><ul><li>Scan the DOM when the widget’s script is loaded.</li><li>Re-scan again when DOM is fully loaded.</li><li>Allow host CMS page to pass props via HTML.</li><li>Stay &lt; 1KB.</li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fzouhir%2Fembed%2Fpreview%2FbrrOPB%3Fheight%3D600%26slug-hash%3DbrrOPB%26default-tabs%3Dhtml%2Cresult%26host%3Dhttps%3A%2F%2Fcodepen.io%26embed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2Fzouhir%2Fpen%2FbrrOPB%3Feditors%3D1000&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F601590.brrOPB.small.3ffa5c1c-d0c6-4b4f-8bd3-89b476c09667.png&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/50a7aba02e44e82a2d8f8df74f4c4161/href">https://medium.com/media/50a7aba02e44e82a2d8f8df74f4c4161/href</a></iframe><h4>Preact-habitat Implementation Details</h4><p>Walking through the implementation details of preact-habitat, here’s a code snippet for our simple HelloWidget component with an option I have exposed inline the widget and mount it inside the script tag’s direct parent</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f19c5673a523a6aa361e33194dfd1651/href">https://medium.com/media/f19c5673a523a6aa361e33194dfd1651/href</a></iframe><p>Now that we have option inline set to true, to integrate this widget in your host CMS all we need to do is… use the script!</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8ec040e210eccc1063f7ec31afb52ec7/href">https://medium.com/media/8ec040e210eccc1063f7ec31afb52ec7/href</a></iframe><p>There are few other API options like like <em>`clean:true`</em> in case there was a default loading animation provided by the host CMS and you want to clear it before the widgets mounts:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e99ed97baf433ab078aeac0231ea53a9/href">https://medium.com/media/e99ed97baf433ab078aeac0231ea53a9/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3d8075e8cc2608a4b1d891c447973979/href">https://medium.com/media/3d8075e8cc2608a4b1d891c447973979/href</a></iframe><h4>Passing Props, Preact.h Trick &amp; Render Function</h4><p>The host CMS page developers will certainly love to be able to pass down some custom data that are relevant to that specific page, in preact-habitat all you need to do is add a script tag of type text/props with a valid JSON in it, just like the following:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d0405f407059a575a339887885dc96e6/href">https://medium.com/media/d0405f407059a575a339887885dc96e6/href</a></iframe><p>The first step of implementing this feature from scratch is getting the text/props script’s content and parse the JSON to JS object</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fafbe47f43a30abb60a80adfe3f4ba85/href">https://medium.com/media/fafbe47f43a30abb60a80adfe3f4ba85/href</a></iframe><p>What makes passing the JS Object pretty easy is Preact’s pragma h function that accepts 2 parameters, first one is the function or ES6 Class component we want to render and the 2nd one is you might have guessed, the props! <em>(You can learn more about Preact’s h function </em><a href="https://preactjs.com/guide/api-reference#preact-h-preact-createelement-"><em>here</em></a><em>)</em></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/48e95699e7aa9cf63728f2ae9a5d37e2/href">https://medium.com/media/48e95699e7aa9cf63728f2ae9a5d37e2/href</a></iframe><p>and the previous snippet is what I have utilised in preact-habitat as the following:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/44f41daf8af87f00cd745c9c42f668b2/href">https://medium.com/media/44f41daf8af87f00cd745c9c42f668b2/href</a></iframe><h4><strong>Thumbs Up</strong></h4><p>Rewriting is expensive and progressive enhancements are a good way to go around improving both of the user and developer experience, there are few ideas I look forward to bringing later this year like rendering in the Preact widgets in a shadow root which offers a pretty neat CSS encapsulation, but since Shadow DOM haven’t landed in all major browser and the polyfills are a little expensive I chose to wait a little longer, another thing you might want to look at if you are going to use Preact widgets extensively in your project is dynamic widget imports via <a href="https://webpack.js.org/guides/dependency-management/#require-context">webpack contextual require</a>, this is a very neat trick <a href="https://twitter.com/_developit">Jason Miller</a> has introduced to me once and I believe it is quite useful.</p><p>Some resources I recommend looking at:</p><ul><li>Preact Shadow Root: <a href="https://github.com/developit/preact-shadow-root">https://github.com/developit/preact-shadow-root</a></li><li>Preact with React Styleguidist: <a href="https://github.com/styleguidist/react-styleguidist/tree/master/examples/preact">https://github.com/styleguidist/react-styleguidist/tree/master/examples/preact</a></li><li><a href="https://github.com/developit/preact-cli">Preact CLI</a> and Preact CLI’s <a href="https://github.com/preactjs-templates/widget">widgets template</a></li></ul><p>Follow me on <a href="https://twitter.com/_zouhir">twitter</a> or star <a href="http://github.com/zouhir/preact-habitat">preact-habitat</a> on Github if you would like to keep up to date with my latest work on this!</p><p>Thank you for reading 💜.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e151622e2ac6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Decided to Teach Arabic-speaking Refugees an Essential Skill: JavaScript Programming]]></title>
            <link>https://medium.com/@_zouhir/how-i-decided-to-teach-arabic-speaking-refugees-an-essential-skill-javascript-programming-b5fbf263c96f?source=rss-1ea4ac63ade6------2</link>
            <guid isPermaLink="false">https://medium.com/p/b5fbf263c96f</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[refugees]]></category>
            <dc:creator><![CDATA[Zouhir]]></dc:creator>
            <pubDate>Wed, 25 May 2016 13:13:29 GMT</pubDate>
            <atom:updated>2016-05-25T13:47:13.410Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vvHKr_0d6y22amtXRKDBXg.jpeg" /><figcaption>Munich, Germany -September 10th, 2015: Refugees from Syria at the main station in Munich.</figcaption></figure><h4>The beginning</h4><p>At first, I considered teaching Syrian refugees from all over the world a skill that they could easily monetize as employees or even as freelancers. But then I thought all Syrians could benefit from this course (even those who still live in their home country that’s been plagued by war for the past six years). Then I went even further and decided everyone who wants to be a JavaScript programmer and speaks Arabic could join in, irrespective of the country they’re from and of where they are currently located.</p><h4>Why JavaScript?</h4><p>The first reason for this is that I am completely in love with JavaScript. Building applications in JavaScript is basically what I’ve been doing every day for the past few years and I’m enjoying it even more as I’m witnessing it evolving and getting bigger and better. Secondly (and perhaps the more important reason) is that JavaScript is incredibly versatile and it is the FUTURE. With it, you can write apps for web, iOS and Android mobile platforms as well as OSX, Linux, and Windows computers.</p><p>Nowadays, almost no one asks web application developers about their university degree: all that employers want to know is what you can actually do and whether you’ve got some apps in your portfolio to show. And when you can write a clean JavaScript code, even as a beginner, you’re halfway in through the door. Plus, JavaScript can not only land you a full-time job, but also countless freelancing lucrative gigs. According to a recent 2016 <a href="http://stackoverflow.com/research/developer-survey-2016">StackOverflow survey</a>, up to 69% of software developers are self-taught and they still make more money than some computer science graduates.</p><h4>Leveraging the power of learning</h4><p>Today’s worldwide social crisis started by the Arab revolutions seems to be hopeless, especially for the people who had to flee their homes and acclimate to new countries where they don’t speak the language and they find it hard to get employment.</p><p>But anyone can become fluent in JavaScript — it’s a universal language in a very high demand right now. My plan is to empower people with a fundamental skill and thus help them reach their true potential. I know that after a few lessons, most of the passionate students will fall in love with JavaScript just like I did and will continue this journey with me.</p><p>Last, but not least, I am convinced that learning is the engine that will set things in motion for people who can’t seem to find their way in the brand new world they’ve been thrown in. Acquiring such an in-demand skills is the best and fastest way for them to get jobs and integrate in their new societies.</p><h4>Meet the teacher</h4><p>My name is Zouhir, I was born and raised in Syria. I’m currently a Consultant Software Engineer based at the Commonwealth Bank of Australia, the country’s leading bank. But more important than my job is my passion for science and for education. At the age of 17, I won a national web programming award and I was a physics pioneer for two years in a row before that.</p><p>I strongly believe that my passion for the right kind of education is what put me on the path that I am now and that I absolutely love, so it is time for me to give something back. I am a fluent Arabic, English and JavaScript speaker and I am more than happy to combine these three skills in order to help people who desperately need some stability in their lives right now.</p><h4>The process</h4><p>When I first had this idea, I didn’t think that I would get such an amazing and overwhelming response.</p><h3>Zouhir on Twitter</h3><p>I&#39;ll be teaching Syrians\Syrian refugees JavaScript remotely for free, explained mostly in Arabic. please RT http://zouhir.org/js-classes</p><p>My initial announcement was re-tweeted over 185 times in the first 24 hours. People that I admire a lot supported my initiative: the<a href="https://twitter.com/s1m0nw"> founder of Elasti</a>c, <a href="https://twitter.com/janl">CouchDB and JSConfeu maker</a> and O’Reilly book author <a href="https://twitter.com/_ericelliott">Eric Elliott</a> are just three of them — thank you, guys, your support means the world to me!</p><p>In the same 24 hours, I already got 35 responses from people who are serious about learning JavaScript and want to commit. I am so happy to see the interest this has generated, more than I had ever hoped it would. So, my initiative seems bound to turn into something much bigger. I plan to setup a platform where we can all communicate, exchange information and get to know each other — I can no longer simply rely on Skype, as I had planned. Plus, I will create video courses in Arabic, I’ll translate some must-see ones in English and create written scripts, as well.</p><p>Please know that I’ve already started working on this, it just might take a bit more than I initially anticipated. I will keep you posted with my progress on this blog, so be sure to check in frequently.</p><p>Thanks again for all your support!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5fbf263c96f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hello, World!]]></title>
            <link>https://medium.com/@_zouhir/hello-world-41ab675ecab5?source=rss-1ea4ac63ade6------2</link>
            <guid isPermaLink="false">https://medium.com/p/41ab675ecab5</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Zouhir]]></dc:creator>
            <pubDate>Sun, 24 Apr 2016 07:29:23 GMT</pubDate>
            <atom:updated>2017-04-20T13:05:39.173Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2iINDBNFUdqD752CYeBRtA.jpeg" /></figure><p>I’ve finally arrived here on Medium and I’m really excited to share with you all some of my random JavaScript &amp; Software Engineering thoughts, my code experiments, challenges I face and work I do.</p><p>In a very brief introduction about myself, my name is Zouhir Chahoud and it happens that I’m writing this post from Sydney, Australia. I crafted my first HTML page when I was 14 and fell in love with the JavaScript snippets I pasted into my website (I still remember the add to homepage snippet, add to bookmarks one and animated shapes around the cursor too!). I built a bunch of personal, local and high school websites while learning JavaScript on my dial up connection and earned a national award in Web Development when I was 17, added it to the shelf where I had 2 other national awards in physics for school students. Work wise, My JavaScript code can be found in many high profile websites and web applications for McDonalds Arabia, Dubai International Film Festival and many others.. Currently I’m working on one of the enterprise systems at Australia’s leading bank.</p><p>Finally, the main reason I’m here is the JavaScript community. I have learned a lot from them and found myself inspired by some of their work as well as getting more creative when bouncing my ideas off theirs, so thank you JS community and looking forward to our future work, collaboration and discussions!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=41ab675ecab5" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>