index.html
file from Github and make it available using rawgit. Here is the link created for famo.us examples: http://rawgit.com/Famous/famous/master/examples/index.html.
29 déc. 2014
Access all famo.us examples without downloading the starter kit
One neat trick that we have used on famous-views to set some links to famo.us examples is to use rawgit. A nice service that allow exposing a Github page. Simply choose an
28 déc. 2014
Debugging server side REST calls with mitmproxy in Meteor
Introduction
Isomorphic javascript offers a great flexibility for developper letting them choose where the code will get executed. On the clients or on the servers. While the Chrome DevTools have evolved at an impressive pace allowing to easily debug and see what is going on with your client's REST calls, the state of server side debugging may be a little bit deceptive in this field. Hence, when you need to put data fetching within your server, checking the flows of requests / responses could be a bit cumbersome if you solely rely on transaction logs or node-inspector. You could use technics like packet sniffing using Wireshark but setting a proper environment when using TLS with your REST call is a huge configuration process.
This is where mitmproxy comes to the rescue. Its name says it all: Man In The Middle PROXY. This incredible tool relies on the same technics as the infamous security attack, this time, for a greater purpose. For this article, I'm using mitmproxy as a local proxy server allowing me to trace all outgoing and incoming transactions from my server side Meteor app. Note that it is not the only use case that mitmproxy offers. Actually, this tool is incredibly agile allowing you to debug your mobile apps with great ease. Let us put our white hat on.
Installation on OSX
Using homebrew for installing mitmproxy is a one command line call:brew install mitmproxyNote that this steps actually installs 2 tools
mitmproxy
and mitmdump
as well as a set of certificates in ~/.mitmproxy
. We only use the first tool in this article but the second one could be handy when you need a lightweight display of your transaction flow and an easy way to save them in a replayable log. Note also that if you also intend to use mitmproxy for debugging other applications like native client ones, you can accept the certificate ~/.mitmproxy/mitmproxy-ca-cert.pemcertificate
in OSX that mitmproxy has created just for you. Just a caveat here. When you set your proxy settings in OSX, be sure to remove the local filters that Apple gently put for you if you want to see your native apps talking to your local servers.
Here's a little screenshot of a debugging session using mitmproxy:
Not that isomorphic
For REST calls, Meteor comes with its own isomorphic library: HTTP. On the client, it acts as basic AJAX calls, while on the server, it relies on the request module. Like all isomorphic libraries, this allows you to put your code logic in your clients or in your server with a nice and uniform API. But this comes at a price, it only covers the features that makes sense for both the clients and the server.
A server is not a browser. Indeed, while having cookies on the browser make sense for retaining states in your application for each user, cookies on the server starts to be a weird concept. Are these cookies used for the clients that you will serve or should the server could be seen as a client to another server? The same goes for the proxy settings on a server. Why would you need a proxy on a production server? Therefore, what is available on the client side of your app may not be available on the server side.
Unfortunately, you could have use cases where the REST API that you are using within your server may need cookies (which is a bit weird when speaking of REpresentational State Transfer which should rely on state-less operations ☺). Additionally, for debugging our flows, we also need the proxy capabilities that are offered out of the box by our browsers. This is where comes the nice package http-more from dandv. It exposes some already baked in feature of the request module for your server side REST calls.
You install it by replacing Meteor's default package like so:
For orienting your request to the proxy, play nice with your TLS layer and setting a cookie jar:
Once saved, you can reread it and modify it to only spare the relevant parts of your flows:
You install it by replacing Meteor's default package like so:
meteor remove http meteor add dandv:http-more
Proxyfy your REST calls in your server
Now that our toolbox is setup, it is time to orient our server so that it takes advantages of mitmproxy. This is achieved via the freshly exposed options in the HTTP library.For orienting your request to the proxy, play nice with your TLS layer and setting a cookie jar:
HTTP.get url, proxy: 'http://127.0.0.1:8080' strictSSL: false jar: true , (e, r) -> console.log 'GET sent through the proxy :-)'Now, you should see all your flows of your server on mitmproxy.
Some nice mitmproxy shortcuts and moves
mitmproxy's documentation is clear and very helpful. But before let you dive in, I'm sharing some of my most used shortcuts:- C to clear the list of flows.
- ↑ and ↓ for selecting a flow.
- ↵ for seeing the details of an exchange and q to go back to the list.
- ⇥ in detail of a flow to switch between the request and the response.
mitmproxy -w FILENAME
Once saved, you can reread it and modify it to only spare the relevant parts of your flows:
mitmproxy -nr FILENAMEWhere:
n
prevents to launch a proxy server.r
read the previous saved file.
- d for deleting flows.
- e for editing a request or a response.
- w then a for saving your all your modifications of the flows for the session.
- q then y for quitting edition mode.
mitmproxy -c FILENAME
14 déc. 2014
Put your HTML, CSS and JS in a single file using Meteor
It could be a bit cumbersome to switch from your HTML template file to your JS logic to your CSS stylesheets. I consider that the method exposed hereafter isn't tailored for novice users. Still, it can help you understanding how Meteor works.
Actually, the method is quite simple. It all drills down to how the HTML files are generated using Blaze, the reactive UI. During the build process of your app, Meteor builds JS file out of your HTML template file and exposes / sends them to your clients. This method short-circuits the build process. If you write directly your HTML using Blaze, the reactive UI, you remove the HTML file. The second step is to use JS to write your CSS. Here, I use the CSSC package for Meteor.
Here is the results for an equivalent of the default Meteor app.
You could think of it as a small component into a larger app.
And now, here is the code to create this small component. As promised, a single file, in CoffeeScript for brevity:
If you want to test it yourself, here is the set of required commands:
At the beginning, it may look a bit weird. But this could be useful from time to time. Note that you can put some nice additions to this sample. For instance, instead of using the events helpers which will scan you DOM for the button, you could directly affect the click event logic when you are creating the button element. If you are looking for performances on some parts of your app, this could be an interesting technic.
Actually, the method is quite simple. It all drills down to how the HTML files are generated using Blaze, the reactive UI. During the build process of your app, Meteor builds JS file out of your HTML template file and exposes / sends them to your clients. This method short-circuits the build process. If you write directly your HTML using Blaze, the reactive UI, you remove the HTML file. The second step is to use JS to write your CSS. Here, I use the CSSC package for Meteor.
Here is the results for an equivalent of the default Meteor app.
You could think of it as a small component into a larger app.
And now, here is the code to create this small component. As promised, a single file, in CoffeeScript for brevity:
# Render the body when Meteor is ready Meteor.startup Template.body.renderToDocument # HTML # ---- # Instantiate a main template Template['main'] = new Template 'Template.main', -> # Return a table of DOM elements [ # A 'p' tag with a reactive variable HTML.P 'Count ', Blaze.View => Spacebars.mustache @lookup 'count' # A 'button' tag HTML.BUTTON '+1' ] # JS logic # -------- # Declare a reactive variable Session.set 'count', 0 # Expose the reactive variable to the template Template.main.helpers 'count': -> Session.get 'count' # Handle template events Template.main.events 'click button': (e,t) -> e.preventDefault() Session.set 'count', 1 + Session.get 'count' # Add the template to the document's body Template.body.addContent -> Spacebars.include @lookupTemplate 'main' # CSS # --- # Instantiate a stylesheet css = new CSSC # Style the body and the text css.add 'body', margin: CSSC.px 20 backgroundColor: CSSC.navy color: CSSC.aqua # Style the button .add 'button', width: CSSC.px 50 border: "#{CSSC.px 1} #{CSSC.maroon} solid" borderRadius: CSSC.px 3 backgroundColor: CSSC.red color: CSSC.yellow
If you want to test it yourself, here is the set of required commands:
# Start by creating a simple app. meteor create singlefile cd singlefile # Remove the Meteor's default app. rm * # We are going to focus only on the front. # Our single file is being placed in the client directory. mkdir client # Add the necessary packages. meteor add coffeescript pierreeric:cssc pierreeric:cssc-colors pierreeric:cssc-normalize # Create your single file and start editing it. touch client/main.coffee
At the beginning, it may look a bit weird. But this could be useful from time to time. Note that you can put some nice additions to this sample. For instance, instead of using the events helpers which will scan you DOM for the button, you could directly affect the click event logic when you are creating the button element. If you are looking for performances on some parts of your app, this could be an interesting technic.
10 déc. 2014
The fastest loading screen for Meteor
Introduction
Meteor offers a great way to build web apps at an incomparable speed. It leverages the power of Javascript anywhere. In production, its powerful server side build system named Isobuild transpiles all your HTML files into JS files, thanks to Blaze, and packs them with your JS files. This operation leads to a single JS file loaded by a tiny initial HTML loader that bootstraps your app.Depending on your development strategy, this single JS file can end up very fat. This could seriously annoy your first time users who will wait many seconds before seing something on their screen. Of course, proxying your servers with Gzip or SPDY capable fronts greatly helps lowering this initial loading. Truncating this JS file could also help. Using a multiple domains strategy and CDNs also offer great loading time cuts. Still, on mobile, with a bad network access like GPRS, these several seconds rapidly become a problem. To understand the ins and outs of web performance optimization, WPO, I strongly recommend reading the book High Performance Browser Networking by Ilya Grigorik.
What is this about?
Not to be confused with the great masterpiece fast render from Arunoda Susiripala which is used for fastening the initial data required from your collections, the technic that I expose hereafter tackles the initial page load time, PLT. The first paints on the screen, if you prefer. This first paint comes even before the tiny initial HTML loader is fully loaded by your users's terminal.On a regular Meteor app, while your users connect to your site and till the initial load of the JS file, their browser remains blank. Of course, they could see that something is happening. Almost all browser display at least a progress indicator. But users may not notice it and think that your site is either dead or hosted on a distant other planet. That is just very bad for user acquisition, isn't it? If you want to better understand how this affects user's perceptions as well as your search engine optimization strategy, SEO, Paul Irish has covered this in great details in his incredibly informative talk: Fast enough (check the comments for the slides and the Youtube video). What you need to know is that your PLT will be nice if your initial screen painting is under 14k. That seems like an impossible goal to achieve with an out-of-the-box Meteor app with an average weight of ~50k of compressed initial JS file.
But Meteor is far from being a classic website approach and is definitely not a low end build tool. You can use the raw power of its Isobuild to ask your servers for an injection of your initial screen content directly within the tiny initial HTML loader. It is the key to unlock the 14k barrier.
Performing the injection
This could be a bit scary for the majority of Meteor devs. But once again, Arunoda has you well covered. By using another great masterpiece from Arunoda and Gadi Cohen, this injection process is a no brainer: inject initial. Let us jump in the code.In your app, installing inject initial is the one step classical stance:
meteor add meteorhacks:inject-initialFor the sake of brevity, the codes hereafter are in CoffeeScript.
In your server code, you can perform the initial injection. Hereafter, I'm just putting a little CSS spinner. Nothing fancy.
/server/startup.coffee
Inject.rawHead 'loader-style', # Force the initial scale for Android and iOS as our spinner may be # distorted by their default viewport values. '<meta name="viewport" content="width=device-width,maximum-scale=1,' + 'initial-scale=1,user-scalable=no">' + # The loading spinner needs some theming. '<style>' + 'html{background-color: #36342e;}' + 'body{color:#ddd;overflow:hidden;width:100%;}' + '.spinner {' + 'bottom:0;height:80px;left:0;margin:auto;position:absolute;' + 'top:0;right:0;width:80px;' + '-webkit-animation: rotation .6s infinite linear;' + 'animation: rotation .6s infinite linear;' + 'border-left:6px solid rgba(255,194,0,.20);' + 'border-right:6px solid rgba(255,194,0,.20);' + 'border-bottom:6px solid rgba(255,194,0,.20);' + 'border-top:6px solid rgba(255,194,0,.9);' + 'border-radius:100%;' + '}' + '@-webkit-keyframes rotation {' + 'from {-webkit-transform: rotate(0deg);}' + 'to {-webkit-transform: rotate(359deg);}' + '}' + '@-moz-keyframes rotation {' + 'from {-moz-transform: rotate(0deg);}' + 'to {-moz-transform: rotate(359deg);}' + '}' + '@-o-keyframes rotation {' + 'from {-o-transform: rotate(0deg);}' + 'to {-o-transform: rotate(359deg);}' + '}' + '@keyframes rotation {' + 'from {transform: rotate(0deg);}' + 'to {transform: rotate(359deg);}' + '}' + '</style>' # The loading spinner is a CSS animation. # /!\ WARNING: The trick is to create a fake body by injecting data # in the HTML's head as Meteor is requesting JS file in a blocking # fashion and mobile only allow 1 HTTP request at a time on a GPRS network. Inject.rawHead 'loader-body2', '<body><div class="spinner"></div></body>'Here we have somewhat altered, the DOM structure of our app. Indeed, we have just created a body while the head of your your initial HTML loader wasn't even finished to get build. Is that a big problem? No. Your server will carry on filling the rest of your app in the body section that you have created (the styles, the scripts, ...).
At this point, you could tell me: "But wait? There is now a title and meta tags in the body of my app. That's just a disgusting code.". You are right. But the browsers are really not impacted by this. I could reply back: "Who care?". But, indeed, I care. Simply because one of the biggest interest of web technology is that all your codes are readable. It is important to let other developers having the possibility to understand how stuff works. It is part of the learning legacy that we owe to the web. So let us put things in the correct order.
Cleaning our loaded codes is done directly on the client side. We do that once everything is loaded. No hurry as it has no impact except a good readability of our DOM structure.
/client/startup.coffee
Meteor.startup -> # Reshape DOM: put back title and meta elements in the head. # style and script tags can leave in the body tag. $head = $ 'head' for tag in ['meta', 'title'] $tags = $ tag $head.append $tags.clone() $tags.remove()That's it. Nice and clean.
Testing it
There are several ways of testing these results and their behavior. On Mac, I use Network link conditionner, a handy tool provided by Apple. It allows you to modify the behavior of you TCP stack and use GPRS, 3G, ... profiles. Very neat when you are testing hybrid or native apps.If you are testing full web apps, I strongly recommend using Chrome DevTools. The mobile emulator as a special feature allowing to change the network throttling.
Some constraints you need to be aware of
When your initial HTML loader and your initial JS file are being loaded, the JS engine and the SVG rendering engine are paused. I've always been annoyed by this browser behavior but we have to live with it. Thus, you can't put JS loaders or SVG animated loaders. You should favor CSS loader and choose the one that will be the less CPU intensive. Here, you should favor CSS3 animated loader which are animated by the GPU as the CPU will be intensively interpreting what it is finishing pumping from you servers.A side note to finish this little article. This technic is not here to bypass the necessary work of making your app as lightweight as possible. It is still a good practice to ensure that your app will avoid consuming the data subscription of your users ;-)
8 déc. 2014
7 déc. 2014
3D hardware accelerated SVG using famo.us and Meteor
One of the main problem with SVG for Android or Chrome, desktop and mobile, is the lack of hardware acceleration. Multiple issues also prevents some nice effects like skewing for instance. Making smooth animated SVG in a browser or in Cordova tends to be tricky.
As stated in one of my former blog post, famo.us makes a good candidate for removing this pain and Meteor, with its famous-views package, makes a good candidate for tying up everything together.
This weekend, I've started working on a famous-views's plugin named fview-svg. Basically, it reads your SVG as template and create famo.us's
Here is a little video that demonstrates my first demo with fview-svg:
As you can check it in the source code, without the comments, this demo is less than 20 lines of codes. And there is room for improvements.
I've deployed a live demo and you can play with it: fview-svg.
I've tested on desktop in Safari, Chrome, Firefox and Opera. On iOS8, I've tested it, an iPad Mini, an iPad 2, an iPhone 5S. On Android, I've tested it on release 4.4.2 on a Samsung Galaxy Tab and on release 4.0.3 on an HTC Desire C. And this is this last test that just surprised me. You may not even know what this terminal is. It's a low end smarphone. Very cheap. A single core under 1GHz. What Android call a
The source codes of the plugin as well as a tutorial for recreating this demo are available on Github: fview-svg.
Note: The plugin is not already available on Atmosphere, the official Meteor repository. I wand to test it against several additional demos to check which API would be good to export for easing the integration. Still, you can start cloning it and import it in your project if you want to contribute or cannot wait few days.
As stated in one of my former blog post, famo.us makes a good candidate for removing this pain and Meteor, with its famous-views package, makes a good candidate for tying up everything together.
This weekend, I've started working on a famous-views's plugin named fview-svg. Basically, it reads your SVG as template and create famo.us's
Surface
and StateModifier
out of it. One of the sensitive parts of the process was the inverted coordinate system of SVG compare to DOM and SVG's responsive nature. But the beauty of making it a plugin with famous-views is that it will be available for anyone. Nice.Here is a little video that demonstrates my first demo with fview-svg:
As you can check it in the source code, without the comments, this demo is less than 20 lines of codes. And there is room for improvements.
I've deployed a live demo and you can play with it: fview-svg.
I've tested on desktop in Safari, Chrome, Firefox and Opera. On iOS8, I've tested it, an iPad Mini, an iPad 2, an iPhone 5S. On Android, I've tested it on release 4.4.2 on a Samsung Galaxy Tab and on release 4.0.3 on an HTC Desire C. And this is this last test that just surprised me. You may not even know what this terminal is. It's a low end smarphone. Very cheap. A single core under 1GHz. What Android call a
midpi
. These terminals still equip a large portion of Android's market share. Just to give you a glimpse on these terminals, it doesn't even run the first Angry birds properly... And here, the SVG animation was perfect. Fluid. I almost shed a tear.The source codes of the plugin as well as a tutorial for recreating this demo are available on Github: fview-svg.
Note: The plugin is not already available on Atmosphere, the official Meteor repository. I wand to test it against several additional demos to check which API would be good to export for easing the integration. Still, you can start cloning it and import it in your project if you want to contribute or cannot wait few days.
1 déc. 2014
Some Famo.us demo with Meteor
Lately with famous-views, a package for Meteor, we have added some plugins for easing developments. To better demonstrate how to use them and what they bring, I've added some live demo for each one that I've created.
Here is a fast access to these demo:
Here is a fast access to these demo:
- fview-bksurfaceimage: Adaptive images.
- fview-devices: Responsive SVG devices working as container for demoing apps.
- fview-dotloader: Simple and customizable loader.
- fview-slidedeck: Slide deck engine à la Bespoke, Reveal, Impress, Prezzi.
- fview-flexgrid: Flexible grid.
Inscription à :
Articles (Atom)