La FNAC, viens prendre ton bonnet d’âne du SAV

En novembre 2015, j’ai fait l’erreur d’acheter le dernier Google Nexus 5X qui venait de sortir sur le site de la FNAC au lieu de le commander sur le Play Store, pour profiter du retrait en magasin dans les jours à venir au lieu d’attendre l’importation des US qui allait durer plus longtemps… jusque là j’étais plutôt content… mais maintenant que le téléphone a un problème et ne s’allume plus (ça peut arriver, pas de soucis de ce côté là), je me rends compte de l’importance que peut avoir un SAV au moment de l’achat…

Eh oui, on est en 2016 et vous savez quoi ? Les entreprises qui se foutent du “service client” existent encore et la FNAC en est une! Ils ont un pseudo-monopole et ils se permettent donc de négliger l’après-vente. Ils vendent et après y’a plus personne, en cas de problème, c’est l’enfer.

A titre de comparaison et pour mieux comprendre le retard de service qu’ils ont, voilà le SAV Google vs le SAV Fnac concernant la prise en charge, le prêt, le niveau d’information etc. pour un Nexus 5X.

Fnac Google
Prise en charge NON, à ramener en magasin OUI, retrait à domicile gratuit
Test(s) NON, emballage, feuille à signer, au revoir OUI, plusieurs tests/manipulations par téléphone
Prêt de matériel NON, “ah nan désolé, on n’a pas” OUI, prêt téléphone identique au moment du retrait de l’appareil défectueux
Feedback/Statut NON, après 15 jours, toujours aucune nouvelle JE NE SAIS PAS

En gros :

  • Délai interminable
  • Prêt de matériel ? Connais pas
  • Des infos sur le statut de la réparation ? On s’en fout il a déjà payé
  • etc.

UNE VRAI BOITE NOIRE LEUR SAV!

Avant de faire cet article, j’ai remonté mon mécontentement et le mauvais service après-vente de leur enseigne mais aucune nouvelle de leur part. Ils ont autre chose à faire.

Et quand je vois le nombre de gens frustrés par un tel service après-vente, je me dis qu’il y a réellement un problème…

Capture d’écran 2016-08-21 à 12.28.06 AM

Capture d’écran 2016-08-21 à 12.28.29 AM

Capture d’écran 2016-08-21 à 12.28.54 AM

Capture d’écran 2016-08-21 à 12.29.19 AM

Capture d’écran 2016-08-21 à 12.29.37 AM

Capture d’écran 2016-08-21 à 12.30.00 AM

Capture d’écran 2016-08-21 à 12.31.08 AM

Set up Google Cloud Platform + MEAN stack in 5mins

I believe in Google products, so it’s thus quite naturally that I use Google Cloud Platform to host my websites, apps, etc. GCP proposes a lot of pre-configured images for all your needs: blog, os, database, crm, or developer tools and infra like:

  • Jenkins
  • GitLab
  • Trac
  • NodeJS
  • MEAN
  • MySQL
  • Ruby
  • Cassandra

Images are delivered with all the tools you need to work efficiently! For example, the MEAN stack came with MongoDB, NodeJS, Express, Git, etc.

Well 🙂

But, a little configuration is needed to make your app listening on your custom port (3000 for example)

Steps

  1. Launch your server SSH console from Google Cloud Platform (Bitnami)
  2. Clone the project under /home/user/apps/
  3. Open up port 3000 in your Google Compute Network Firewall : Your VMs > Edit > Network > Click on default network_google_clud_mean_settingup
  4. Launch your own project on port 3000 (using your favorite grunt/node server command) and test if http://SERVER_IP:3000 works ? If it’s OK, go to step 5
  5. Edit the file opt/bitnami/apache2/conf/bitnami/bitnami.conf and replace the content with the configuration below (it’s only a proxy pass to route your server to the 3000 port)

Virtual Host Configuration

    <IfVersion < 2.3 >
      NameVirtualHost *:80
      NameVirtualHost *:443
    </IfVersion>

    <VirtualHost _default_:80>
    #  DocumentRoot "/opt/bitnami/apache2/htdocs"
    #  <Directory "/opt/bitnami/apache2/htdocs">
    #    Options FollowSymLinks MultiViews
    #    AddLanguage en en
    #    LanguagePriority en
    #    ForceLanguagePriority Prefer Fallback

    #    AllowOverride All
    #    <IfVersion < 2.3 >
    #      Order allow,deny                          
    #      Allow from all
    #    </IfVersion>
    #    <IfVersion >= 2.3 >
    #      Require all granted
    #    </IfVersion>
    #  </Directory>

    # Error Documents
      ErrorDocument 503 /503.html

    # Bitnami applications installed with a prefix URL (default)
    #  Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf"

    # Redirect to port 3000 (proxy pass)
      ServerAdmin youremail@gmail.com
      ServerName yourservername.fr
      ProxyPass / http://localhost:3000/
      ProxyPassReverse / http://localhost:3000/
      ProxyPreserveHost On

    </VirtualHost>

    # Default SSL Virtual Host configuration.

    <IfModule !ssl_module>
      LoadModule ssl_module modules/mod_ssl.so
    </IfModule>

    Listen 443
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !EDH !RC4"
    SSLPassPhraseDialog  builtin
    SSLSessionCache "shmcb:/opt/bitnami/apache2/logs/ssl_scache(512000)"
    SSLSessionCacheTimeout  300

    <VirtualHost _default_:443>
      DocumentRoot "/opt/bitnami/apache2/htdocs"
      SSLEngine on
    SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
    SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"

      <Directory "/opt/bitnami/apache2/htdocs">
        Options FollowSymLinks MultiViews
        AddLanguage en en
        LanguagePriority en
        ForceLanguagePriority Prefer Fallback
        AllowOverride All
        <IfVersion < 2.3 >
          Order allow,deny                          
          Allow from all
        </IfVersion>
        <IfVersion >= 2.3 >
          Require all granted
        </IfVersion>
      </Directory>
      # Error Documents
      ErrorDocument 503 /503.html

      # Bitnami applications installed with a prefix URL (default)
      Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf"
    </VirtualHost>
    # Bitnami applications that uses virtual host configuration
    Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf"
    # Status
    ExtendedStatus on
    <VirtualHost _default_:80>
    ServerName local-stackdriver-agent.stackdriver.com
    <Location /server-status>
      SetHandler server-status
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1
    </Location>
    </VirtualHost>
  1. Restart apache with this command sudo /opt/bitnami/ctlscript.sh restart apache
  2. Now check your server IP in your favorite browser (chrome probably?), and your project should run there.

W31Y16 – Twitter REST API, Speech recognition for your web app, Angular DOM loaded and nice web switch animation

Twitter REST API

One of the REST API that I very like simply because it’s well explained, with samples, etc. The official Twitter REST API. If you would like to use it on a web project using NodeJS, there’s the plugin you need, twit.

Before using the Twitter API, you need to follow some instructions for the app creation but it’s pretty simple… Here, I found a good tutorial or on the official documentation.

An example of use if you want to make a search about the word “android”

var Twit = require('twit');

var T = new Twit({
  consumer_key:         '...',
  consumer_secret:      '...',
  access_token:         '...',
  access_token_secret:  '...',
  timeout_ms:           60*1000,  // optional HTTP request timeout to apply to all requests.
});

T.get('search/tweets', { q: 'android', count: 100 }, function(err, data, response) {
  console.log(data);
});

Speech recognition

If you want to make your web app more interactive, just add the annyang library to your project! It allows you to call your actions with the voice instead of clicking buttons. For exmaple, if you have to control. Just test to the online demo. Import the lib and add your own commands is pretty simple… just take a look.

Import the lib

<script src="//cdnjs.cloudflare.com/ajax/libs/annyang/2.4.0/annyang.min.js"></script>

Implement your own commands

var commands = {
  'go to google': function() {
    redirect('http://google.com');
  }
};
annyang.addCommands(commands);
annyang.start();

You have some additional options like debug or language settings who could be very useful to see what is really captured and be more precise.

annyang.debug();
annyang.setLanguage('en');

Angular, DOM loaded ?

For some reasons, you need to know when your DOM is loaded to start actions, right? The easiest solution to do this with Angular is to add the code below in the controller of your view. As you can see, the controller will print in the console and the loader will be hidden.

// Execute after DOM loaded
angular.element(document).ready(function () {
    console.log('loading finished');
    $('#loading').hide();
});

Design of the week

I love this animation designed by Oleg Frolov. It would be nice to implement this to switch a night/light mode for an interface for example… The source code is available here, let me some minutes to add it in my own project! 🙂

enable

And now, holidays:

  • Translate My Sheet update
  • DIY projects.

W30Y16 – Script to auto forward emails, custom loading GIFs, Google Add-On free ebook, set up / remove proxy settings from your command prompt

Autoforward emails

For those who wants to auto forward emails received in Outlook (work) to their personnal Gmail account, there is a common solution using “Rules” in Outlook but this feature may be disabled by your IT center.

The solution is to add a rule based on a script coded in VBA in your Outlook macros.

First, press Alt+F11 to access to the VBA tool and in the left panel, click on Project1 > Microsoft Outlook Object > This Outlook Session and paste the code below:

Sub SendNew(Item As Outlook.MailItem)

Dim objMsg As MailItem
Set objMsg = Application.CreateItem(olMailItem)

objMsg.Body = Item.Body
objMsg.Subject = "FW: " & Item.Subject
objMsg.Recipients.Add "joeybronner@gmail.com"

objMsg.Send

End Sub

Save and close the VBA tool.
Now, you’ll have to apply this script to a rule, so, just follow this few steps…

  1. Select in top ruban Home > Rules > Manage Rules & Alerts
  2. Click New Rule
  3. Click on Apply rule on message I receive, Next
  4. Next (Yes on prompt)
  5. Check Run a script and select the script that you have created above, Next
  6. Finish

Now, you emails will be automatic forwarded.

Custom loading GIFs

If you have to add a loading GIF on your own app, you probably would like to have a custom one. If you type on google for a loading GIF you have the choice between the old style loading or some famous like Google+ loading… Loading.IO is a website where you can choose a loading style and customize for your app colors. And you can export your work in different format:

  • SVG
  • CSS
  • GIF

The Ultimate Guide to Google Sheets

The Zapier team has pulled all of their Google Sheets content together—including the very complete post from earlier this month that included my Translate My Sheet add-on—and turned it into a new free ebook: The Ultimate Guide to Google Sheets. It takes readers first through a detailed intro Google Sheets tutorial, then dives into deeper features that help readers build their own custom tools and apps using Google Sheets’ most powerful features.

You can download this free ebook on these platforms:

ultimate_google_sheets_book

Proxy settings

Because it’s something that we have to do some times (in my case it’s especially when I’m working on Raspberry boards), it’s useful to keep these few commands in mind:

set http_proxy=http://your_proxy:your_port
set http_proxy=http://username:password@your_proxy:your_port
set https_proxy=https://your_proxy:your_port
set https_proxy=https://username:password@your_proxy:your_port

And to remove the proxy settings, you only have to launch the same commands, without values:

set http_proxy=
set http_proxy=
set https_proxy=
set https_proxy=

Ladies and Gentlemans, Jack Ma

His career vision is very nice. I like his way of thinking. For young people who are 25 years old (and others!), you must make enough mistakes –you fall, you stand up

Design of the week: Google search

That’s a very nice Google search redesign. Good user experience with a modern user interface; This is only a concept created by Juan C. Fresno.

google_search

W29Y16 – Perforce plugin for Sublime, ignoring files, Node.JS prompt and map directions from your Android app

The .gitignore equivalent with Perforce

Easy as Git, you could ignore some files, directories on your code submit. You only have to create a new file named .p4ignore on your workspace root. This file contains a list of rules for ignoring files when adding these to the depot. Example of .p4ignore file:

# Ignore .p4ignore files
.p4ignore

# Ignore object files, shared libraries, executables
*.dll
*.so
*.exe

# Ignore all HTML files except the readme file
*.html
!readme.html

# Ignore the bin directory
bin/

# Ignore the build.properties file in this directory
/build.properties

# Ignore all text files in test directories
test/**.txt

Sublime & Perforce

Due to a team switch I need to use Perforce instead of Git for the source code versionning… and that’s why I was looking for a Perforce plugin for Sublime Text (my favourite IDE for web development).

The only plugin I found is developped by Eric Martel and works fine. It allows you to add, checkout, delete, diff, rename, revert, diff (using p4diff) and list all checked out files. Changelist management is also supported and that’s a very good point.

Node.JS prompt

I’ve found a nice project on Github who allows you to interact with your Node.JS server through your command line. For example, if you have to enter credentials on launching, you only have to import prompt, initialize it and use the get function… Take a look on the repo, there are a lot of functionality.

var prompt = require('prompt');

//
// Start the prompt
//
prompt.start();

//
// Get two properties from the user: username and email
//
prompt.get(['username', 'email'], function (err, result) {
  //
  // Log the results.
  //
  console.log('Command-line input received:');
  console.log('  username: ' + result.username);
  console.log('  email: ' + result.email);
});

Prompt on Github

Get directions from your own app

android_map_intent_google

Implement a navigation in your own app will be expensive in days of development. So, if you want to offer an alternative solution, it’s possible in few code lines (below). This new intent will launch the Google Maps application with start and destionation GPS coordinates. Good solution for a POC in which the navigation is not the main feature.

String from = "20.344,34.34";
String to = "20.5666,45.345";
String endpointURL = "http://maps.google.com/maps?saddr=" + from + "&daddr=" + to;
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(endpointURL));
startActivity(intent);

Dribble login

What a nice Dribble login concept. Based on Material Design with some animations (a lot!). The most interesting animation is maybe these when you switch from login in to sign in with the pink logo who slides to the rectangular submit button. Nice! dribbble_login