<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>Le blog de Niums</title>
	<atom:link href="https://www.blog.niums.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://www.blog.niums.com</link>
	<description>musique, javascript et web.</description>
	<lastBuildDate>Wed, 31 Jul 2019 14:43:16 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.5</generator>

<image>
	<url>https://www.blog.niums.com/wp-content/uploads/2017/10/cropped-banner-1-e1506946919809-1-32x32.jpg</url>
	<title>Le blog de Niums</title>
	<link>https://www.blog.niums.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
		<title>Appli mobile Hybride – tips</title>
		<link>https://www.blog.niums.com/appli-mobile-hybride-tips/</link>
					<comments>https://www.blog.niums.com/appli-mobile-hybride-tips/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Wed, 20 Mar 2019 08:41:36 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Mobile Hybride]]></category>
		<guid isPermaLink="false">https://www.blog.niums.com/?p=2322</guid>

					<description><![CDATA[Voici quelques infos ui pourraient vous aider à débuger vos applis hybride. Ionic &#8211; cordova Erreur [crayon-69cbba270ec96511578609/] Solution [crayon-69cbba270ec9c682415396/] &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;]]></description>
										<content:encoded><![CDATA[<p>Voici quelques infos ui pourraient vous aider à débuger vos applis hybride.</p>
<h2>Ionic &#8211; cordova</h2>
<p>Erreur</p><pre class="crayon-plain-tag">Failed to install 
/Users/path/platforms/android/app/build/outputs/apk/debug/app-debug.apk: 
Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: 
Package package-name signatures 
do not match previously installed version; ignoring!]</pre><p>Solution</p><pre class="crayon-plain-tag">adb uninstall package-name</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/appli-mobile-hybride-tips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[nodejs] Faire des requêtes par lot, en parallèle et avec une pause</title>
		<link>https://www.blog.niums.com/nodejs-faire-des-requetes-par-lot-en-parallele-et-avec-une-pause/</link>
					<comments>https://www.blog.niums.com/nodejs-faire-des-requetes-par-lot-en-parallele-et-avec-une-pause/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Mon, 26 Nov 2018 12:03:13 +0000</pubDate>
				<category><![CDATA[Developpement web]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[es6]]></category>
		<category><![CDATA[nodejs]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=2148</guid>

					<description><![CDATA[Objectifs Pouvoir Requêter en masse une API (jusqu'à 30 000 requêtes) en faisant n requêtes en parallèle en donnant la possibilité de créer des lots de requêtes en donnant la possibilité de pouvoir pauser l'envoie des lots Prérequis nodejs axios pour gérer les requêtes et l'asynchrone async await pour gérer l'asynchrone See the Pen Javascript &#8230; <p class="link-more"><a href="https://www.blog.niums.com/nodejs-faire-des-requetes-par-lot-en-parallele-et-avec-une-pause/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;[nodejs] Faire des requêtes par lot, en parallèle et avec une pause&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<div class="fl-builder-content fl-builder-content-2148 fl-builder-content-primary" data-post-id="2148"><div class="fl-row fl-row-fixed-width fl-row-bg-none fl-node-5c1f700628d76 fl-row-default-height fl-row-align-center" data-node="5c1f700628d76">
	<div class="fl-row-content-wrap">
						<div class="fl-row-content fl-row-fixed-width fl-node-content">
		
<div class="fl-col-group fl-node-5c1f70062b5b3" data-node="5c1f70062b5b3">
			<div class="fl-col fl-node-5c1f70062b76e fl-col-bg-color" data-node="5c1f70062b76e">
	<div class="fl-col-content fl-node-content"><div class="fl-module fl-module-rich-text fl-node-5c1f70062d3c2" data-node="5c1f70062d3c2">
	<div class="fl-module-content fl-node-content">
		<div class="fl-rich-text">
	<h2>Objectifs</h2>
<p>Pouvoir Requêter en masse une API (jusqu'à 30 000 requêtes)</p>
<ul>
<li>en faisant n requêtes en parallèle</li>
<li>en donnant la possibilité de créer des lots de requêtes</li>
<li>en donnant la possibilité de pouvoir pauser l'envoie des lots</li>
</ul>
<p>Prérequis</p>
<ul>
<li>nodejs</li>
<li>axios pour gérer les requêtes et l'asynchrone</li>
<li>async await pour gérer l'asynchrone</li>
</ul>
<p><iframe style="width: 100%;" title="Javascript Batchprocessing request with Axios" src="//codepen.io/sampow/embed/bQKmYQ/?height=265&amp;theme-id=dark&amp;default-tab=js,result" height="265" frameborder="no" scrolling="no" allowfullscreen="allowfullscreen">See the Pen <a href="https://codepen.io/sampow/pen/bQKmYQ/">Javascript  Batchprocessing request with Axios</a> by sampow (<a href="https://codepen.io/sampow">@sampow</a>) on <a href="https://codepen.io">CodePen</a>.<br />
</iframe></p>
<p>&nbsp;</p>
<h2>Le code</h2>
<p><strong>La vue</strong></p>
<pre>&lt;div class="btn-container"&gt;
&lt;a id="btn" class="waves-effect waves-light btn"&gt;Get all URLS&lt;/a&gt;
&lt;/div&gt;
&lt;hr&gt;

&lt;div id="container"&gt;&lt;/div&gt;

&lt;pre id="result"&gt;&lt;/pre&gt;</pre>
<p><strong>Le style</strong></p>
<pre>body {
  margin: 0;
  min-height: 100vh;
  background: #004d4d;
}
#container &gt; div {
  width: 150px;
  margin: 10px;
  padding: 10px;
  line-height: 12px;
  background: #ededed;
  display: inline-block;
  border: 2px solid #fff;
  
  animation-name: fade-in;
	animation-fill-mode: both;
	animation-duration: .3s;
}
.teal {
  background: #008080;
}

.btn-container {
  margin: 10px;
}

.card-title {
 font-size: 14px !important; 
}

@keyframes fade-in {
  0% { opacity: 0; }
  100% { opacity: 1; }
}


</pre>
<p><strong>Le js</strong></p>
<p>Pré-requis:<br />
- crée un package.json en local avec npm init<br />
- installer axios avec npm install axios --save<br />
- coder dans votre fichier nomdefichier.js<br />
- tester le resultat dans le terminal avec `$ node nomdefichier.js`<br />
- tester le resultat dans le navigateur en ouvrant celui-ci</p>
<pre>// on importe axios
const axios = require('axios');

let AllDatas = [],
    AllDatasInError = [],
    urls = [],
    waitTime = 500, // the amount of time we wait between each batch of request
    start = 0,
    step = 2, // number of url we request
    position = 0,
    nbRequest = 12; // number of request 

AllDatas['total'] = 0; // total of data

let btn = document.getElementById('btn');

btn.addEventListener('click', function() {
  batchProcessing(urls);
});

function createUrl() {
    for (let i = 1; i &lt;= nbRequest; i++) { urls.push(`https://jsonplaceholder.typicode.com/photos/${i}`); } } createUrl(); // timer const waitFor = (ms) =&gt; new Promise(r =&gt; setTimeout(r, ms));

// parallel REQUEST with AXIOS
async function getData(links) {
    try {
        const res = await axios.all(links.map(link =&gt; axios.get(link)));
        console.log('GetData Start time', new Date());
        return res;
    } catch (error) {
        console.log('------------------------------------------');
        console.log(error);
    }
}

//
async function batchProcessing(urls) {
    const len = urls.length / step;
    // let result = [];
    console.time('batchProcessing');
    console.log('batchProcessing Start time', new Date());

    // use of an interceptor to edit every response
    axios.interceptors.response.use(function (response) {
        // Do something with response data        
        let responseData = response.data;

        // const newVal = {};
        if (responseData.id) {
          responseData['position'] = `${position}/${len}`;
            // create html element
            addElement(responseData);
          
            AllDatas['total'] += 1;
            AllDatas.push(responseData);
        }
        
        console.log('responseData', responseData);
        return responseData;
    }, function (error) {
        // Do something with response error
        return Promise.reject(error);
    });
  
  
  // batch processing

    for(let index = 0; index &lt; len; index ++) {
      var processingUrl  = urls.slice(start, start + step);
      start += step;
      position += 1;
    
      console.log('position', position + ' / ' + len);
      console.log('processingUrl',  processingUrl);
      
      // make the requests
      const res = await getData(processingUrl);
      
      AllDatas = AllDatas.concat(res);
      // break time
      await waitFor(waitTime);
    }
    
    // we are now done
    console.log('End timer', new Date());
    console.timeEnd('getData');
    // console.log('Final AllDatas', AllDatas);
  
  // document.querySelector('pre').innerHTML = AllDatas;
}



</pre>
<pre>/******
RENDERING THE HTML
*****/

function addElement (data) { 
console.log('element added', data);
let mainDiv = document.getElementById("container"); 
let newDiv = document.createElement("div");

let newContent = `
&lt;div class="card"&gt;
&lt;div class="card-image"&gt;
&lt;img src="${data.thumbnailUrl}"&gt;
&lt;span class="card-title"&gt;
Element ${data.id} 
&lt;/span&gt;
&lt;/div&gt;
&lt;div class="card-content"&gt;
&lt;p&gt;${data.title}. (batch ${data.position})&lt;/p&gt;
&lt;/div&gt;
&lt;div class="card-action"&gt;
&lt;a href="${data.url}"&gt;See the source&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;`;


// console.log('newContent', newContent);
newDiv.innerHTML = newContent; 
mainDiv.appendChild(newDiv); 
}</pre>
</div>
	</div>
</div>
</div>
</div>
	</div>
		</div>
	</div>
</div>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/nodejs-faire-des-requetes-par-lot-en-parallele-et-avec-une-pause/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Humeur] Vie privée vs Apple, Google, Facebook, et autres</title>
		<link>https://www.blog.niums.com/vie-privee-vs-apple-google-facebook-et-autres/</link>
					<comments>https://www.blog.niums.com/vie-privee-vs-apple-google-facebook-et-autres/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Mon, 26 Nov 2018 11:41:37 +0000</pubDate>
				<category><![CDATA[Net]]></category>
		<category><![CDATA[Quoi de neuf sur le web]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Vie privée]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=1004</guid>

					<description><![CDATA[Les polémiques sur la gestion des informations relatives à la vie privée des internautes ou utilisateurs par certaines entreprises sont de plus en plus récurrentes. En lisant les commentaires sur les blogs ou site traitant de ce sujet, je me suis rendu compte que beaucoup de personnes n&#8217;accordaient pas d&#8217;importance à leurs données privées. Et &#8230; <p class="link-more"><a href="https://www.blog.niums.com/vie-privee-vs-apple-google-facebook-et-autres/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;[Humeur] Vie privée vs Apple, Google, Facebook, et autres&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>Les polémiques sur la gestion des informations relatives à la vie privée des internautes ou utilisateurs par certaines entreprises sont de plus en plus récurrentes.</p>
<p>En lisant les commentaires sur les blogs ou site traitant de ce sujet, je me suis rendu compte que beaucoup de personnes n&rsquo;accordaient pas d&rsquo;importance à leurs données privées. Et lorsque les questions relatives à la vie privée sont posées, je lis souvent des commentaires comme :<br />
&#8211; Et alors ? Vous avez des choses à vous reprocher, vous ?</p>
<p>Qu&rsquo;un site connaisse leur habitude de navigation et puisse leur proposer des publicités ciblées (ce qui à mon avis est le moins grave) ou encore qu&rsquo;une appli lampe torche, par exemple, nécessite l&rsquo;accès à leur carnet d&rsquo;adresse et à la liste des comptes connus sur leur mobile : rien ne les effraie.</p>
<p>Même si je pense faire attention à mes données transmises sur le net activement (via réseau social, blog&#8230;) ou passivement (navigation, téléphone&#8230;), je me dis qu&rsquo;il est quasi impossible de ne pas se faire tracer. Prenons les entreprises avec lesquelles j&rsquo;échange le plus de données quotidiennement : Google et Apple.</p>
<p>J&rsquo;ai un compte compte Gmail et un Androphone. Je navigue de temps en temps avec google chrome et j&rsquo;ai du matériel Apple qui se synchronise via iCloud&#8230; Lorsque je pars en vacances mon Ipad se synchronise et alerte Apple et Google de mes déplacements et de ce que je cherche dans le moteur de recherche (restaurant par exemple).<br />
Après cet exemple grossier, je pourrais être fataliste et me dire que je suis damné et que rien n&rsquo;y fera, je ne pourrais pas garder mes informations pour moi. Mais non, j&rsquo;y crois et je me suis dit autant faire une recherche sur les problèmes de vie privée au niveau numérique et voir ce que je peux faire pour ne pas trop délivrer d&rsquo;informations.</p>
<h4>Apple</h4>
<p>Chez la Pomme, l&rsquo;Iphone et l&rsquo;Ipad collectent la position spatiale des utilisateurs. Ce qui n&rsquo;est pas dérangeant sauf quand 2 experts en informatique découvre qu&rsquo;ios 4 collecte tous les déplacement de l’utilisateur à son insu et que ceux-ci sont regroupés dans un fichier caché nommé consolidated.db&#8230; mais accessible en clair car non crypté.</p>
<h4>Google</h4>
<p>Plus le temps avance et plus Google est présent un peu partout : recherche, mails, tâches, agenda, cartes terrestres (géolocalisation), navigation web, etc&#8230;</p>
<p>Est-il possible de ne pas utiliser un seul de leur service ?</p>
<p>Même si c&rsquo;était le cas, j&rsquo;avais entendu parler du recoupage d&rsquo;informations par google afin de créer des comptes fantômes.</p>
<p><img fetchpriority="high" decoding="async" class="alignleft size-full wp-image-1015" title="facebook-android" src="http://www.blog.niums.com/wp-content/uploads/2012/02/facebook-android.jpeg" alt="Autorisation Facebook Android" width="240" height="400" srcset="https://www.blog.niums.com/wp-content/uploads/2012/02/facebook-android.jpeg 480w, https://www.blog.niums.com/wp-content/uploads/2012/02/facebook-android-180x300.jpg 180w" sizes="(max-width: 240px) 100vw, 240px" /></p>
<h4>Android</h4>
<p>Première chose : Android c&rsquo;est Google donc si comme moi (et beaucoup d&rsquo;autres) votre téléphone Android est paramétré avec votre compte Gmail, il faut se dire que quoi qu&rsquo;on fasse Google <em>is watching you</em>&#8230; Sauf si celui ci est rooté et que vous installez une rom telle que Cyanogen qui n&rsquo;inclut pas les applications google par défaut.</p>
<p>Tout comme ios, Android collecte aussi les informations sur les déplacements de l&rsquo;utilisateur.</p>
<p><strong>Applications Android et autorisations</strong></p>
<p>Lors de l&rsquo;installation d&rsquo;une application via l&rsquo;Android Market, les autorisations demandées par l&rsquo;appli sont annoncées et détaillées afin de permettre à l&rsquo;utilisateur de savoir quel seront les droits et les éléments auxquels aura accès l&rsquo;application. Cependant la « transparence » de la procédure d&rsquo;installation est quelque peu inutile étant donné qu&rsquo;il n&rsquo;est pas possible de refuser un accès que vous trouver non nécessaire. Ceci dans le cas où votre téléphone n&rsquo;est pas rooté car avec la rom alternative Cyanogenmod 7, il est possible de choisir les permissions laissées aux applications, ou pas !</p>
<h4>Facebook</h4>
<p>Au mois de février 2012, le Sunday Times accuse Facebook via son application android d&rsquo;accéder en lecture et écriture aux SMS et MMS de ses utilisateurs. Facebook ne dément pas cette accusation mais explique que c&rsquo;est tout à fait normal dans la mesure où l&rsquo;autorisation est clairement demandée dans les termes d’utilisation et que l&rsquo;accès à ces informations servirait à des tests pour développer des services qui nécessitent l&rsquo;accès aux SMS.</p>
<p>Plus récemment, on a pu voir concrètement comment l&rsquo;accès à des données Facebook par Cambridge Analytica ont pu influencer une élection. Comment ?<br />
Le consultants travaillant pour la campagne présidentielle de Donald Trump ont pu avoir accès aux données de plusieurs millions de personnes via une application facebook. Sachant que Facebook permet l&rsquo;utilisation des données personnelles par d&rsquo;autres personnes ou organismes extérieurs à Facebook, cela n&rsquo;a pas été très compliqué. (<a href="https://www.cnetfrance.fr/news/scandale-facebook-ce-qu-il-faut-savoir-pour-comprendre-l-affaire-et-proteger-ses-donnees-39865776.htm" target="_blank" rel="noopener">Plus d&rsquo;info ici</a>)</p>
<h4>et consort&#8230;</h4>
<p>Le Sunday Times indique aussi les sociétés qui créent des applis qui demandent des autorisations qui n&rsquo;en ont normalement pas besoin.</p>
<p>Il est étonnant de voir qu&rsquo;Angry Bird (jeux) a accès à votre carnet d&rsquo;adresse.<br />
Flickr, YouTube, Foursquare, Yahoo! Messenger</p>
<p>Personnellement, il m&rsquo;est arrivé de ne pas faire de mises à jour d&rsquo;appli lorsque celle-ci demandait des droits abusifs&#8230;<br />
Par exemple l&rsquo;appli Le monde demandait lors d&rsquo;une mise à jour l’accès aux infos privées du téléphone avant de faire marche arrière.</p>
<h2>Comment préserver sa vie privé : la demie solution</h2>
<p>Demie solution car, quoi que nous fassions (pour les personnes « normales », c&rsquo;est-à-dire qui ne sont pas des génies de l&rsquo;informatique), il est, je pense, impossible de ne pas se faire tracer.</p>
<p>Avant tout <strong>quel que soit le support,</strong> faites attention aux <strong>autorisations</strong> que vous accordez aux sites internets, aux apps, etc&#8230;</p>
<p>Concernant vos <strong>mots de passe</strong>, essayez d&rsquo;avoir des mots de passe un peu plus compliqués que maison, toto, 12346, etc&#8230; et de ne pas utiliser le même mot de passe pour vos comptes important (google, facebook (réseaux sociaux), banque, etc&#8230;)</p>
<h3>Site Internet</h3>
<p>De façons générales, bloquez les <strong>cookies</strong> tiers et configurez le navigateurs pour qu&rsquo;il les supprime automatiquement à la fermeture du navigateur.</p>
<h3>Moteurs de recherche</h3>
<p><strong>A éviter</strong> : Google, Yahoo, bing : les données personnelles sont récoltées à des fin publicitaires</p>
<p><strong>Conseillé</strong> : Qwant, DuckDuckGo</p>
<p>PS: pour être honnête, j&rsquo;ai tenté pendant un mois d&rsquo;utiliser Duck Duck Go et malheureusement les résultats ne sont vraiment pas à la hauteur :-(</p>
<h3>Réseaux sociaux</h3>
<p><strong>Facebook (et autres réseaux sociaux)</strong>:<br />
&#8211; ne pas rendre sa page publique sauf si c&rsquo;est voulu et contrôlé<br />
&#8211; ne pas accepter les gens qu&rsquo;on ne connait pas sur un compte plutôt familial  et faire un tri sur ses followers ou abonnés.<br />
&#8211; supprimer l&rsquo;accès aux applications externes à Facebook</p>
<p><strong>Presqu&rsquo;aucun contrôle sur les données collectées</strong> : Facebook, Instagram, Linkedin, Twitter, Tumblr, Viadeo, Meetup, Pinterest, Flickr, Google Photos, 500px, Medium, Youtube, Dailymotion, Vimeo, Tik Tok, Twitch, &#8230;</p>
<h3>Messageries</h3>
<p>Whatsapp, Messenger : les deux appartenant à Facebook, il y a les mêmes problématiques.</p>
<h3>Navigateurs</h3>
<p>Naviguer en HTTPS quand c&rsquo;est possible.</p>
<p><strong>Chrome</strong> (google): si, comme moi, vous l&rsquo;utilisez à titre professionnel et par paresse à titre perso, sachez que quoi que vous fassiez vous êtes suivi. Le mode privé est privé pour vous mais pas pour google car la navigation privée ne fait que masquer l&rsquo;historique de navigation, le reste ne change pas&#8230;</p>
<p><strong>Firefox</strong> : bonne alternative (même si pas parfait). De plus, des extensions comme <a href="https://addons.mozilla.org/fr/firefox/addon/facebook-container/" target="_blank" rel="noopener">Facebook Container</a> ou <a href="https://addons.mozilla.org/fr/firefox/addon/ghostery/" target="_blank" rel="noopener">Ghostery</a> permettent de contrôler un peu mieux votre vie privée.</p>
<h3>Smartphone</h3>
<p>Partage de données (contacts, photos, videos etc&#8230;) : ne  l&rsquo;autorisez que si c&rsquo;est vraiment utile.</p>
<p>Géolocalisation,  ne l&rsquo;accordez pas à toutes les applis même si en fin de compte cela peut être inutile : vous pouvez être géolocalisé grâce aux personnes avec qui vous êtes, la publicité, les sites que vous <a href="https://www.nextinpact.com/news/85547-pourquoi-presse-en-ligne-veut-vous-geolocaliser-a-quelques-metres-pres.htm" target="_blank" rel="noopener">suivez</a> ou tout simplement les <a href="https://www.numerama.com/politique/282934-enquete-comment-les-apps-figaro-lequipe-ou-closer-participent-au-pistage-de-10-millions-de-francais.html" target="_blank" rel="noopener">apps installées</a>.</p>
<p>Protégez vos comptes mails, sociaux, professionnels avec l&rsquo;authentification à deux facteurs quand elle est disponible.</p>
<p><strong>Sur ce : « <em>Those brothers are watching you</em>« </strong></p>
<p>+++</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/vie-privee-vs-apple-google-facebook-et-autres/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Angular] – part 14 – Angular Universal (server side rendering)</title>
		<link>https://www.blog.niums.com/angular-universal/</link>
					<comments>https://www.blog.niums.com/angular-universal/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Thu, 06 Sep 2018 07:00:24 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Developpement web]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[universal]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=1941</guid>

					<description><![CDATA[Attention ce tuto ne fonctionne que avec les versions de Angular &#60; 6 La platform universal a été ajouté à angular dans la version 4 d&#8217;angular. Elle permet maintenant de générer les pages depuis le serveur. La méthode « magique » de la plateforme universal est le renderModuleFactory provenant de @angular/platfom-server La définition de ce renderModulefactory dans la doc &#8230; <p class="link-more"><a href="https://www.blog.niums.com/angular-universal/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;[Angular] – part 14 – Angular Universal (server side rendering)&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<blockquote><p><img decoding="async" class="aligncenter size-medium wp-image-1944" src="http://www.blog.niums.com/wp-content/uploads/2017/10/universal-logo-590x307.png" alt="Angular Universal" width="590" height="307" srcset="https://www.blog.niums.com/wp-content/uploads/2017/10/universal-logo-590x307.png 590w, https://www.blog.niums.com/wp-content/uploads/2017/10/universal-logo-768x400.png 768w, https://www.blog.niums.com/wp-content/uploads/2017/10/universal-logo.png 928w" sizes="(max-width: 590px) 100vw, 590px" /></p>
<p><span style="color: #ff0000;"><strong>Attention ce tuto ne fonctionne que avec les versions de Angular &lt; 6</strong></span></p></blockquote>
<p>La platform universal a été ajouté à angular dans la version 4 d&rsquo;angular. Elle permet maintenant de générer les pages depuis le serveur.</p>
<p>La méthode « magique » de la plateforme universal est le renderModuleFactory provenant de @angular/platfom-server</p>
<p>La définition de ce <strong>renderModulefactory</strong> dans la doc d&rsquo;Angular est</p><pre class="crayon-plain-tag">renderModuleFactory(
    moduleFactory: NgModuleFactory,
    options: PlatformOptions
): Promise</pre><p><strong>moduleFactory</strong> : Le premier argument de cette méthode est moduleFactory, qui est pour faire court une version compilé d&rsquo;angular. Ce moduleFactory doit être buildé une seule fois.</p>
<p><strong>options</strong> : quant à lui contient les informations sur la manière dont on souhaite voir notre application: <strong>PlatformOptions</strong></p>
<p><strong>PlatformOptions</strong> : Le type de PlatformOptions est définit dans les sources par l&rsquo;interface suivante</p><pre class="crayon-plain-tag">interface PlatformOptions {
    document?: string;
    url?: string;
    extraProviders?: Provider[]
}</pre><p>&#8211; le <strong>document</strong> indique le contenu du fichier HTML que l&rsquo;on souhaite avoir dans notre app.<br />
&#8211; l&rsquo;<strong>urlL</strong> indique la page de notre application que l&rsquo;on souhaite rendre</p>
<h2>Installation</h2>
<p># on génere le projet avec un rooting de base</p><pre class="crayon-plain-tag">ng new sn-universal --rooting
cd sn-universal</pre><p># on installe ensuite plateform server nécéssaire pour le rendu coté serveur et pour la génération des pages html</p><pre class="crayon-plain-tag">npm install --save @angular/platform-server</pre><p># il faudra mettre à jour angular et tous les packages liés vers la version 4 minimum et tous les autres packages tel que core-js, rxjs, zone.js ( sinon nous aurons une erreur au build)</p>
<h2>Création du module serveur</h2>
<p>Nous allons maintenant créer le fichier qui va boostraper (initialiser) l&rsquo;app depuis le serveur: src/app.server.module.ts</p>
<p>On crée un nouveau fichier nommé app.server.module.ts. Il est assez similaire au fichier app.module.ts de notre application, la grosse différence est que ce module est crée pour le serveur</p><pre class="crayon-plain-tag">import { NgModule } from '@angular/core';
import { ServerModule } from '@angular/platform-server';
import { AppModule } from './app.module';
import { AppComponent } from './app.component';
 
@NgModule({
    imports: [
        ServerModule,
        AppModule
    ],
    bootstrap: [AppComponent]
})
export class AppServerModule {}</pre><p></p>
<h2>Mise à jour du module principal</h2>
<p>Nous aurons aussi besoin d&rsquo;indiquer à l&rsquo;AppModule que tout le rendu se fera depuis le serveur.<br />
Normalement, on bootstrap une app Angular depuis un AppModule qui importe le <strong>BrowserModule</strong> (qui met à disposition toute sorte de services et directives tel que par exemple ngIf )<br />
PS: c&rsquo;est <strong>platformBrowserDynamic</strong> qui est la méthode utilisée pour bootstrapper l&rsquo;application pour l&rsquo;app.<br />
Mise à jour de app module afin de pouvoir utiliser le serveur</p><pre class="crayon-plain-tag">// dans /src/app/app.modules.ts
// BrowserModule devient
BrowserModule.withServerTransition({ appId : 'sn-universal' })</pre><p><strong>withServerTransition</strong> prend un <strong>appId</strong> et c&rsquo;est lui qui est partagé entre le client et le serveur. withServerTransition permet à universal de remplacer le html généré par le sien.</p>
<p>A ce point on peut compiler notre app avec la commande ngc</p><pre class="crayon-plain-tag">$ node_modules/.bin/ngc</pre><p>Si on ouvre le dossier <strong>dist</strong>, on remarquera que dans le dossier <strong>out-tsc/app</strong> se trouve dans les fichiers générés <strong>src/app.server.module.ngfactory.ts</strong> un fichier qui déclare et exporte un AppServerModuleNgFactory de type <strong>NgModuleFactory</strong>.</p><pre class="crayon-plain-tag">export const AppServerModuleNgFactory:i0.NgModuleFactory = i0.?cmf(i1.AppServerModule,
[i2.AppComponent],(_l:any) =&amp;gt; {</pre><p></p>
<h2>Création du module server de l&rsquo;application sous express</h2>
<p>Il nous faut créer un fichier <strong>main.server.ts</strong> qui va s&rsquo;occuper de prendre une url en argument te de faire le rendu de la bonne page de notre application.</p><pre class="crayon-plain-tag">import 'reflect-metadata';
import 'zone.js/dist/zone-node';
import { platformServer, renderModuleFactory } from '@angular/platform-server'
import { enableProdMode } from '@angular/core'
import { AppServerModuleNgFactory } from '../dist/ngfactory/src/app/app.server.module.ngfactory'
import * as express from 'express';
import { readFileSync } from 'fs';
import { join } from 'path';
  
const PORT = 4000;
  
enableProdMode();
  
const app = express();
  
let template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString();
  
app.engine('html', (_, options, callback) =&amp;gt; {
const opts = { document: template, url: options.req.url };
  
renderModuleFactory(AppServerModuleNgFactory, opts)
.then(html =&amp;gt; callback(null, html));
});
  
app.set('view engine', 'html');
app.set('views', 'src')
  
app.get('*.*', express.static(join(__dirname, '..', 'dist')));
  
app.get('*', (req, res) =&amp;gt; {
    res.render('index', { req });
});
  
app.listen(PORT, () =&amp;gt; {
    console.log(`listening on http://localhost:${PORT}!`);
});</pre><p><strong>HS<br />
La création du serveur sous express est hors sujet, on ne s&rsquo;y attardera pas donc.</strong></p>
<h2>Mise à jour de de la config typescript</h2>
<p>Dans le fichier de config /src/tsconfig.app.json on ajoutera server.ts dans les fichiers à exclure</p><pre class="crayon-plain-tag">&quot;exclude&quot;: [
    &quot;server.ts&quot;, // ICI
    &quot;test.ts&quot;,
    &quot;**/*.spec.ts&quot;
]</pre><p>Ajouter ensuite dans tysconfig.json angularCompilerOptions</p><pre class="crayon-plain-tag">{
    &quot;compileOnSave&quot;: false,
    &quot;compilerOptions&quot;: {
        ...
    ],
    &quot;lib&quot;: [
        ...
    ]
},
    &quot;angularCompilerOptions&quot;: { // ICI
        &quot;genDir&quot;: &quot;./dist/ngfactory&quot;,
        &quot;entryModule&quot;: &quot;./src/app/app.module#AppModule&quot;
    }
}</pre><p><strong>angularCompilerOptions</strong> : permet de spécifier une propriété <strong>genDir</strong> qui correspond au dossier dans lequel les fichiers <strong>ngfactory</strong> générés seront exportés.<br />
<strong>entryModule</strong> : on lui indique le chemin vers le module principal sur le lequel l&rsquo;app bootstrap ( dans ce cas : AppModule)<br />
Mise à jour du Script NPM</p>
<p>dans le package.json</p><pre class="crayon-plain-tag">&quot;scripts&quot;: {
    &quot;ng&quot;: &quot;ng&quot;,
    &quot;prestart&quot;: &quot;ng build --prod &amp;amp;&amp;amp; ngc&quot;, // on ajoute cette ligne
    &quot;start&quot;: &quot;ng serve&quot;, // on supprime celle ci
    &quot;start&quot;: &quot;ts-node src/server.ts&quot; // et la remplace par celle ci
    &quot;build&quot;: &quot;ng build&quot;, // on supprime celle ci
    &quot;test&quot;: &quot;ng test&quot;,
    &quot;lint&quot;: &quot;ng lint&quot;,
    &quot;e2e&quot;: &quot;ng e2e&quot;
},</pre><p><strong>prestart</strong> lancera d&rsquo;abord ce script avant le start (grace au pre ajouté avant) ng build &#8211;prod &amp;&amp; ngc puis le server est lancé</p>
<h2>et zoo</h2>
<p>on lance l&rsquo;app</p><pre class="crayon-plain-tag">npm run start</pre><p>et si tout ce passe bien vous devriez avoir un quelque chose comme ca</p><pre class="crayon-plain-tag">Mac-mini-de-Samuel:sn-universal saminou$ npm run start
  
    &amp;gt; sn-universal@0.0.0 prestart /Users/saminou/SitesSaminou/angular/sn-universal
    &amp;gt; ng build --prod &amp;amp;&amp;amp; ngc
   
    Date: 2017-09-08T15:09:38.658Z
    Hash: 6c329e8c267199f5dbe3
    Time: 14528ms
    chunk {0} polyfills.c9b879328f3396b2bbe8.bundle.js (polyfills) 64.1 kB {4} [initial] [rendered]
    chunk {1} main.0f96096c1bb38373edb0.bundle.js (main) 5.15 kB {3} [initial] [rendered]
    chunk {2} styles.d41d8cd98f00b204e980.bundle.css (styles) 0 bytes {4} [initial] [rendered]
    chunk {3} vendor.3f618d3b9434d244b572.bundle.js (vendor) 307 kB [initial] [rendered]
    chunk {4} inline.d6e0fc0a02fc19c9d76f.bundle.js (inline) 1.45 kB [entry] [rendered]
   
    &amp;gt; sn-universal@0.0.0 start /Users/saminou/SitesSaminou/angular/sn-universal
    &amp;gt; ts-node src/server.ts
   
 listening on http://localhost:4000!</pre><p>Si vous visitez http://localhost:4000! , dans le code source de la page vous devriez avoir le code correspondant à ce que vous avez en visu plutot que l&rsquo;habituelle « app works »</p>
<p><img decoding="async" class="aligncenter size-medium wp-image-1942" src="http://www.blog.niums.com/wp-content/uploads/2017/09/sn-kamehouse-code-590x464.png" alt="angular universal source code" width="590" height="464" srcset="https://www.blog.niums.com/wp-content/uploads/2017/09/sn-kamehouse-code-590x464.png 590w, https://www.blog.niums.com/wp-content/uploads/2017/09/sn-kamehouse-code-768x604.png 768w, https://www.blog.niums.com/wp-content/uploads/2017/09/sn-kamehouse-code.png 953w" sizes="(max-width: 590px) 100vw, 590px" /></p>
<h2>Générer un composant</h2>
<p>Utiliser le cli pour générer un composant est assez facile avec les commandes fournies par le cli.</p><pre class="crayon-plain-tag">ng g c home
 
# &eacute;quivalent de
ng generate component home</pre><p>malheureusement avec nos modifications on aura une erreur du type</p><pre class="crayon-plain-tag">&amp;gt; ng g c home
    Error: More than one module matches. Use skip-import option to skip importing the component into the closest module.
    More than one module matches. Use skip-import option to skip importing the component into the closest module.</pre><p>Pour éviter cela il suffit de spécifier le module en ajoutant un flag.</p><pre class="crayon-plain-tag">ng g c home  --module=app.module.ts
ng g c about --module=app.modue.ts</pre><p></p>
<h2>Définition des routes</h2>
<p>Ouvrons maintenant le fichier routing app-routing.module.ts généré lors de la création de notre projet via le flag &#8211;routing</p><pre class="crayon-plain-tag">import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
// on ajoute nos 2 nouveaux modules
import { HomeComponent} from './home/home.component';
import { AboutComponent } from './about/about.component';
 
// on met &agrave; jour le tableau des routes
const routes: Routes = [
    {
        path: '',
        component: HomeComponent
    },
    {
        path: 'about',
        component: AboutComponent
    }
];
 
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }</pre><p></p>
<h2>Mise à jour des templates</h2>
<p>Ouvrons le ficher <strong>/src/app.component.html</strong> et mettons le à jour avec les liens</p>
<p><code></code></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li><a>Home</a></li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li><a>About</a></li>
</ul>
</li>
</ul>
<p>&nbsp;</p><pre class="crayon-plain-tag"></pre><p></p>
<p>&nbsp;</p>
<h2>Ajout des titles et meta tags à nos components</h2>
<p>C&rsquo;est assez simple , il suffit d&rsquo;importer Meta et Title depuis @angular/platform-browser</p>
<p>puis de mettre à jour le constructeur</p>
<p></p><pre class="crayon-plain-tag">import { Meta, Title } from '@angular/platform-browser';
 
# dans le constructeur
 
export class HomeComponent implements OnInit {
// on utilise l'injection de d&eacute;pendance pour cr&eacute;er des instances de Meta et Title
constructor(meta: Meta, title: Title) {
 
 
title.setTitle('Supa Karma Page');
meta.addTags([
        { name: 'author', content:'Samsam'},
        { name: 'keywords', content:'angular, seo, universal'},
        { name: 'description', content:'tada une page avec un code source qui est &agrave; jour'},
        ])
    }
 
    ngOnInit() {
 
    }
}</pre><p>Et voila</p>
<p>&nbsp;</p>
<h2>Les pièges à éviter</h2>
<p>Universal ne peut utiliser les objets globaux (window, document, localstorage) existants au runtime du navigateur.</p>
<p>Le <strong>DOM doit être manipulé par Angular</strong> et non de façon externe (vanilla Js, jQuery : par exemple document.domMethod() ou encore $(&lsquo;dom-element&rsquo;))..</p>
<p>Le server side rendering n&rsquo;est <strong>pas compatible avec le lazy loading des modules</strong>.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/angular-universal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Angular] – part 1 – Mise en place environnement de travail</title>
		<link>https://www.blog.niums.com/angular-part-1-mise-en-place-environnement-de-travail/</link>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Wed, 08 Aug 2018 13:18:32 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Developpement web]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[angular6]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=2080</guid>

					<description><![CDATA[Nous allons voir comment préparer son environnement de travail pour un projet sous Angular (actuellement nous sommes à la version Angular 6).]]></description>
										<content:encoded><![CDATA[<p>Nous allons voir comment préparer son environnement de travail pour un projet sous Angular (actuellement nous sommes à la version Angular 6).</p>
<p>Si vous travaillez en équipe, rien de mieux que d&rsquo;utiliser le <a href="https://cli.angular.io/" target="_blank" rel="noopener">CLI</a> de Angular. Celui ci vous permettra de générer des modules, components, pipe etc&#8230;</p>
<p><strong>Prérequis</strong></p>
<ul>
<li>node js (version &gt; 8)</li>
<li>npm (version &gt; 5)</li>
</ul>
<p>J&rsquo;ai écrit un article sur les différentes manières d&rsquo;<a href="http://www.blog.niums.com/mettre-a-jour-npm-gerer-versions-de-node-js/">installer et mettre à jour Node et npm</a> (sur mac).<br />
Mais ne perdons pas de temps : utilisez brew sur mac ou chocolatey, oneGet sur windows.</p>
<p>installez Angular de façon globale</p><pre class="crayon-plain-tag">npm install -g @angular/cli</pre><p>Pour vérifier que tout s&rsquo;est bien passé , testez</p><pre class="crayon-plain-tag">ng -v</pre><p><figure id="attachment_2081" aria-describedby="caption-attachment-2081" style="width: 912px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-2081" src="http://www.blog.niums.com/wp-content/uploads/2018/08/angular-cli.png" alt="ng -v" width="912" height="706" srcset="https://www.blog.niums.com/wp-content/uploads/2018/08/angular-cli.png 912w, https://www.blog.niums.com/wp-content/uploads/2018/08/angular-cli-590x457.png 590w, https://www.blog.niums.com/wp-content/uploads/2018/08/angular-cli-768x595.png 768w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /><figcaption id="caption-attachment-2081" class="wp-caption-text">ng -v</figcaption></figure></p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>VSCode extensions et raccourcies à connaitre</title>
		<link>https://www.blog.niums.com/vscode-extensions-et-raccourcies-a-connaitre/</link>
					<comments>https://www.blog.niums.com/vscode-extensions-et-raccourcies-a-connaitre/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Sat, 12 May 2018 19:54:43 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Developpement web]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[react]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[vscode]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=2059</guid>

					<description><![CDATA[En passant de AngularJs à Angular et donc à typescript j&#8217;ai aussi changé d&#8217;éditeur de code. Je suis passé de PHPStorm et Atom à VS Code (Visual Studio Code). Je trouve cet éditeur vraiment top et si cela m&#8217;a appris une chose c&#8217;est que je peux aimer du Microsoft&#8230;(VS Code est créé par Microsoft) C&#8217;est &#8230; <p class="link-more"><a href="https://www.blog.niums.com/vscode-extensions-et-raccourcies-a-connaitre/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;VSCode extensions et raccourcies à connaitre&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>En passant de AngularJs à Angular et donc à typescript j&rsquo;ai aussi changé d&rsquo;éditeur de code. Je suis passé de PHPStorm et Atom à VS Code (Visual Studio Code). Je trouve cet éditeur vraiment top et si cela m&rsquo;a appris une chose c&rsquo;est que je peux aimer du Microsoft&#8230;(VS Code est créé par Microsoft)</p>
<p>C&rsquo;est éditeur est créé grace à <a href="https://electronjs.org/" target="_blank" rel="noopener">Electron</a>, c&rsquo;est donc fait à partir de CSS/HTML/JS et les performances sont au rdv contrairement à ceux à quoi je m&rsquo;attendais.</p>
<ul>
<li>il gére la coloration syntaxique des principaux language et surtout du Typescript.</li>
<li>gère le typage pour Typescript</li>
<li>auto import pour javascript et Typescript</li>
<li>supporte GIt nativement</li>
<li>affiche le status GIT d&rsquo;un fichier dans l&rsquo;arborescence de façon coloré</li>
<li>a un debugger intégré</li>
<li>permet la personnalisation des raccourcis clavier</li>
<li>permet d&rsquo;avoir les différents espaces de travail (par projet)</li>
<li>permet de diviser l&rsquo;éditeur verticalement pour avoir différents fichiers cote à cote</li>
<li>a un terminal intégré</li>
</ul>
<p>Le Marketpalce de VsCode est vraiment très bien fournit, on peut customiser à fond l&rsquo;éditeur via le fichier json.</p>
<p>Sachant que 90% de mon temps je fais du dev front (principalement Angular et un peu de React, bref du JS) mes extensions sont axés plutôt JS.</p>
<h2><strong>Les raccourcies qui sauvent la vie</strong></h2>
<h3>Sélection multiple (curseur multiple)</h3>
<p>Alt+click<br />
<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2067" src="http://www.blog.niums.com/wp-content/uploads/2018/05/multicursor.gif" alt="multicursor" width="447" height="182" /></p>
<p>CMD+D : sélectionnera le prochain mot, la prochaine occurence<br />
<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2068" src="http://www.blog.niums.com/wp-content/uploads/2018/05/multicursor-word.gif" alt="multicursor-word" width="607" height="172" />Il est possible de rajouter plus de curseur avec MAJ+CMD+L</p>
<h3>Recherche</h3>
<p>Recherche à travers des fichiers<br />
MAJ+CMD+F :<br />
<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2069" src="http://www.blog.niums.com/wp-content/uploads/2018/05/search.png" alt="recherche" width="814" height="485" srcset="https://www.blog.niums.com/wp-content/uploads/2018/05/search.png 814w, https://www.blog.niums.com/wp-content/uploads/2018/05/search-590x352.png 590w, https://www.blog.niums.com/wp-content/uploads/2018/05/search-768x458.png 768w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></p>
<h3>Formatage</h3>
<p>Formatage du document entier :  MAJ+ALT+F<br />
Formattage de la selection : MAJ+K MAJ+F</p>
<p>VS Code peut effectuer par défaut des formatage pour le javascript, Typescript, Json, HTML</p>
<h3>Zone CSS pliable</h3>
<p>Plier le bloc actuel : ALT+MAJ+[<br />
Déplier le bloc actuel: ALT+MAJ+]</p>
<p>Plier récursivement le bloc actuel : CMD+K CMD+[<br />
Déplier récursivement le bloc actuel: CMD+ CMD+]</p>
<p>Plier tout : MAJ+K MAJ+0<br />
Déplier tout: MAJ+K MAJ+J<br />
Plier tous les commentaires : MAJ+K MAJ+/</p>
<p>Vous pouvez définir des zones de blocs arbritaire à plier/déplier</p>
<p>avec l&rsquo;utilisation de /* #region */ et /* #endregion */</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2060" src="http://www.blog.niums.com/wp-content/uploads/2018/05/css-folding.gif" alt="CSS region folding" width="775" height="200" /></p>
<h2><strong>Les extensions « indispensables »&#8230; ou pas</strong></h2>
<h4>Linter</h4>
<p><a href="https://marketplace.visualstudio.com/items?itemName=eg2.tslint" target="_blank" rel="noopener">TS LINT</a> : un linter pour typescript</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener">ES LINT</a> :  un linter très puissant dont les règles sont simples à configurer</p>
<p>ps : Le <a href="https://github.com/airbnb/javascript" target="_blank" rel="noopener">style guide</a> javascript de Air B&amp;B vaut le coup d&rsquo;oeil</p>
<h4>Angular</h4>
<p><a href="https://marketplace.visualstudio.com/items?itemName=johnpapa.Angular2" target="_blank" rel="noopener">Angular V6 Snippets</a> : des snippets angular par John Papa</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2062" src="http://www.blog.niums.com/wp-content/uploads/2018/05/use-extension.gif" alt="Angular TypeScript Snippets for VS Code" width="840" height="491" /></p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=natewallace.angular2-inline" target="_blank" rel="noopener">Angular2-inline</a> : placement des attributs sur une seule ligne + coloration syntaxique</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2063" src="http://www.blog.niums.com/wp-content/uploads/2018/05/example.png" alt="angular2-inline" width="458" height="613" srcset="https://www.blog.niums.com/wp-content/uploads/2018/05/example.png 458w, https://www.blog.niums.com/wp-content/uploads/2018/05/example-448x600.png 448w" sizes="auto, (max-width: 458px) 100vw, 458px" /></p>
<p>&nbsp;</p>
<h4>React</h4>
<p><a href="https://marketplace.visualstudio.com/items?itemName=vsmobile.vscode-react-native" target="_blank" rel="noopener">React Native tools</a> : aide au dev pour du React Native</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2064" src="http://www.blog.niums.com/wp-content/uploads/2018/05/react-features.gif" alt="React Native" width="1265" height="737" /></p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=EQuimper.react-native-react-redux" target="_blank" rel="noopener">React-Native/React/Redux snippets for es6/es7</a> : des sniipets pour le trio magique</p>
<h4>Autres</h4>
<p><a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight" target="_blank" rel="noopener">TODO Highlight</a> : Surligne les an noations que vous souhaitez metttee en avant dans vos commentaire tel que TODO, FIXME AFAIRE&#8230;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2065" src="http://www.blog.niums.com/wp-content/uploads/2018/05/material-night.png" alt="VSCODE-TODO-HIGHLIGHT" width="2784" height="1768" srcset="https://www.blog.niums.com/wp-content/uploads/2018/05/material-night.png 2784w, https://www.blog.niums.com/wp-content/uploads/2018/05/material-night-590x375.png 590w, https://www.blog.niums.com/wp-content/uploads/2018/05/material-night-768x488.png 768w, https://www.blog.niums.com/wp-content/uploads/2018/05/material-night-1024x650.png 1024w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></p>
<p>&nbsp;</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=2gua.rainbow-brackets" target="_blank" rel="noopener">Rainbow Brackets</a>: une extension pour savoir ou en est avec toutes nos parenthèses</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome" target="_blank" rel="noopener">Debugger for Chrome</a> : une extension pour debugger dans Chrome</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=PeterJausovec.vscode-docker" target="_blank" rel="noopener">Docker support for Visual Studio Code</a> : comme son nom l&rsquo;indique, aide à builder et deployer des applications dans des container Docker depuis VSCode</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig" target="_blank" rel="noopener">EditorConfig for VS Code</a>: pour avoir un fichier de configuration, editorconfig,  de l&rsquo;éditeur qui pourra être versionné</p>
<p>&nbsp;</p>
<h4>Themes</h4>
<p>Dracula: le thème</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2073" src="http://www.blog.niums.com/wp-content/uploads/2018/05/vscode.png" alt="Dracula" width="1718" height="1166" srcset="https://www.blog.niums.com/wp-content/uploads/2018/05/vscode.png 1718w, https://www.blog.niums.com/wp-content/uploads/2018/05/vscode-590x400.png 590w, https://www.blog.niums.com/wp-content/uploads/2018/05/vscode-768x521.png 768w, https://www.blog.niums.com/wp-content/uploads/2018/05/vscode-1024x695.png 1024w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme" target="_blank" rel="noopener">Material Icon Theme</a> : car j&rsquo;aime bien voir du premier coup à quel type de fichier ou dossier correspond un élement</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/vscode-extensions-et-raccourcies-a-connaitre/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Angular-cli et Sass</title>
		<link>https://www.blog.niums.com/angular-cli-sass/</link>
					<comments>https://www.blog.niums.com/angular-cli-sass/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Fri, 29 Sep 2017 09:16:35 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[sass]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=1936</guid>

					<description><![CDATA[Démarrer un projet Angular sous Sass Pour tous ceux qui souhaitent utiliser Angular-cli avec Sass facilement voir la démarche: Lorsqu&#8217;on travaille avec le cli, la feuille de style par défaut se termine par .css. Ce qui nous intéresse c&#8217;est d&#8217;utiliser l&#8217;extension scss sur nos fichiers. Tout d&#8217;abord, pour démarrer un nouveau projet angular utilisant .sass &#8230; <p class="link-more"><a href="https://www.blog.niums.com/angular-cli-sass/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;Angular-cli et Sass&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<h2>Démarrer un projet Angular sous Sass</h2>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-1949" src="http://www.blog.niums.com/wp-content/uploads/2017/09/angular-cli-2-590x182.png" alt="Angular Cli" width="590" height="182" srcset="https://www.blog.niums.com/wp-content/uploads/2017/09/angular-cli-2-590x182.png 590w, https://www.blog.niums.com/wp-content/uploads/2017/09/angular-cli-2-768x237.png 768w, https://www.blog.niums.com/wp-content/uploads/2017/09/angular-cli-2-1024x316.png 1024w, https://www.blog.niums.com/wp-content/uploads/2017/09/angular-cli-2.png 1280w" sizes="auto, (max-width: 590px) 100vw, 590px" /></p>
<p>Pour tous ceux qui souhaitent utiliser Angular-cli avec Sass facilement voir la démarche:</p>
<p>Lorsqu&rsquo;on travaille avec le cli, la feuille de style par défaut se termine par .css. Ce qui nous intéresse c&rsquo;est d&rsquo;utiliser l&rsquo;extension scss sur nos fichiers.</p>
<p>Tout d&rsquo;abord, pour démarrer un nouveau projet angular utilisant .sass , il nous suffit d&rsquo;utiliser le flag &#8211;style</p><pre class="crayon-plain-tag">ng new mon-projet-sous-sass --style=scss</pre><p>On pourrait aussi utiliser du sass ou less mais ce n&rsquo;est pas ce qui nous intéresse : &#8211;style =less</p>
<h2>Convertir un projet angular vers Sass</h2>
<p>Si vous aviez déjà créé un projet utilisant simplement .css. Cela va nécéssiter un tout petit plus de travail pour le convertir en scss.</p>
<p>Tout d&rsquo;abord on demande à angular de convertir notre projet pour utiliser le scss</p><pre class="crayon-plain-tag">ng set default.styleExt scss</pre><p>On peut aussi le faire en modifiant le fichier .angular-cli.json</p><pre class="crayon-plain-tag">&quot;defaults&quot;: {
    &quot;styleExt&quot;: &quot;scss&quot;,
    &quot;component&quot;: {}
  }</pre><p>Malheusement cela ne modifiera pas les fichier créés. Pour les anciens fichier .css pour devrez les modifier à la main, chager l&rsquo;extension .css en .scss et penser à modifier dans le component le stylesUrls</p><pre class="crayon-plain-tag">@Component({
  styleUrls: ['./mon-component.scss'],
})</pre><p></p>
<h2>Utiliser l&rsquo;import Sass plus simplement</h2>
<p>Si vous créer des mixins ou des variables, le plus souvent , ceux ci sont dans des fichiers externes dans votre dossier sass</p>
<p>par exemple:<br />
|- src/<br />
|- assets/<br />
|- sass/<br />
|- _variables.scss<br />
|- _mixins.scss<br />
|- styles.scss</p>
<p>Pour utiliser nos mixins et variables dans le fichiers styles.scss, on les importe:</p><pre class="crayon-plain-tag">/ fichier styles.scss
  
@import './assets/sass/variable';
@import './assets/sass/mixins';</pre><p>Rien de fou ici, ca commence à devenir plus contraignant lorsqu&rsquo;on souhaite utiliser ses mêmes variables dans des composants angular qu&rsquo;on aurait créé.<br />
Exemple de cas<br />
|- src/<br />
|- app/<br />
|- header<br />
|- social/<br />
|- social.component.html<br />
|- social.component.scss<br />
|- social.component.ts<br />
|- menu/<br />
|- menu.component.html<br />
|- menu.component.scss<br />
|- menu.component.ts<br />
|- search/<br />
|- search.component.html<br />
|- search.component.scss<br />
|- search.component.ts<br />
|- assets/<br />
|- sass/<br />
|- _variables.scss<br />
|- _mixins.scss<br />
|- styles.scss</p>
<p>Si nous devions importer variables et mixins dans nos 3 fichiers de styles, il aurait fallu y accéder en prenant en compte le chemin relatif du dossier sass par rapport au component.</p><pre class="crayon-plain-tag">// fichier component.scss
  
@import &quot;../../../assets/sass/mixins&quot;;
@import &quot;../../../assets/sass/variables&quot;;</pre><p>Heureusement Angular-cli propose une manière simplifié d&rsquo;importer des fichiers sass: il faut utiliser ~</p><pre class="crayon-plain-tag">// fichier component.scss
  
@import &quot;~assets/sass/mixins&quot;;
@import &quot;~assets/sass/variables&quot;;</pre><p></p>
<h2>Angular cli + Bootstrap 4</h2>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-1937" src="http://www.blog.niums.com/wp-content/uploads/2017/09/boot4-590x332.jpg" alt="Bootstrap 4" width="590" height="332" srcset="https://www.blog.niums.com/wp-content/uploads/2017/09/boot4-590x332.jpg 590w, https://www.blog.niums.com/wp-content/uploads/2017/09/boot4.jpg 750w" sizes="auto, (max-width: 590px) 100vw, 590px" /></p>
<p>Pour ceux qui utilisent bootstrap.<br />
On installe d&rsquo;abord bootstrap via npm</p><pre class="crayon-plain-tag">npm install --save boostrap@4.0.0-beta</pre><p>Ajout du css bootstrap dans le fichier config : .angular-cli.json</p><pre class="crayon-plain-tag">&quot;styles&quot;: [
  &quot;../node_modules/bootstrap/dist/css/bootstrap.css&quot;,
  &quot;./styles.scss&quot;
],</pre><p>On utilise ../node_modules car le point de départ du cli est le dossier src/</p>
<p><strong>Ajout des fichiers sass</strong></p>
<p>Nous n&rsquo;avons pas toujours besoin d&rsquo;importer tous les fichiers .<br />
Dans le dossier bootstrap, nous avons tous ces fichiers :</p><pre class="crayon-plain-tag">Bootstrap
      /*!
       * Bootstrap v4.0.0-beta (https://getbootstrap.com)
       * Copyright 2011-2017 The Bootstrap Authors
       * Copyright 2011-2017 Twitter, Inc.
       * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
       */

      @import &quot;functions&quot;;
      @import &quot;variables&quot;;
      @import &quot;mixins&quot;;
      @import &quot;print&quot;;
      @import &quot;reboot&quot;;
      @import &quot;type&quot;;
      @import &quot;images&quot;;
      @import &quot;code&quot;;
      @import &quot;grid&quot;;
      @import &quot;tables&quot;;
      @import &quot;forms&quot;;
      @import &quot;buttons&quot;;
      @import &quot;transitions&quot;;
      @import &quot;dropdown&quot;;
      @import &quot;button-group&quot;;
      @import &quot;input-group&quot;;
      @import &quot;custom-forms&quot;;
      @import &quot;nav&quot;;
      @import &quot;navbar&quot;;
      @import &quot;card&quot;;
      @import &quot;breadcrumb&quot;;
      @import &quot;pagination&quot;;
      @import &quot;badge&quot;;
      @import &quot;jumbotron&quot;;
      @import &quot;alert&quot;;
      @import &quot;progress&quot;;
      @import &quot;media&quot;;
      @import &quot;list-group&quot;;
      @import &quot;close&quot;;
      @import &quot;modal&quot;;
      @import &quot;tooltip&quot;;
      @import &quot;popover&quot;;
      @import &quot;carousel&quot;;
      @import &quot;utilities&quot;;</pre><p>Beaucoup de fichiers non nécéssaire pour vos projets</p>
<p>Pour utiliser bootstrap, nous n&rsquo;avons besoin que de ce strict minimum</p><pre class="crayon-plain-tag">// src/styles.scss
 
@import
  '~bootstrap/scss/functions',
  '~bootstrap/scss/variables',
  '~bootstrap/scss/grid',
  '~bootstrap/scss/mixins',
  '~bootstrap/scss/print',
  '~bootstrap/scss/reboot',
  '~bootstrap/scss/type';</pre><p>Avec le ~, importé des fichiers sass devient très facile.<br />
+++</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-1938" src="http://www.blog.niums.com/wp-content/uploads/2017/09/sass-logo-wall-590x295.jpg" alt="sass" width="590" height="295" srcset="https://www.blog.niums.com/wp-content/uploads/2017/09/sass-logo-wall-590x295.jpg 590w, https://www.blog.niums.com/wp-content/uploads/2017/09/sass-logo-wall-768x384.jpg 768w, https://www.blog.niums.com/wp-content/uploads/2017/09/sass-logo-wall-1024x512.jpg 1024w, https://www.blog.niums.com/wp-content/uploads/2017/09/sass-logo-wall.jpg 1600w" sizes="auto, (max-width: 590px) 100vw, 590px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/angular-cli-sass/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Angular Cli – angular-cli.json</title>
		<link>https://www.blog.niums.com/angular-cli-angular-cli-json/</link>
					<comments>https://www.blog.niums.com/angular-cli-angular-cli-json/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Fri, 10 Feb 2017 18:48:03 +0000</pubDate>
				<category><![CDATA[Developpement web]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Angular2]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=1845</guid>

					<description><![CDATA[Pour les projets sous angular2, j’utilise angular-cli , j’ai eu besoin de modifier la configuration de base.

Dans le fichier angular-cli.json]]></description>
										<content:encoded><![CDATA[<p>Pour les projets sous angular2, j&rsquo;utilise <a href="https://cli.angular.io/">angular-cli</a> , j&rsquo;ai eu besoin de modifier la configuration de base.</p>
<p>Dans le fichier angular-cli.json</p><pre class="crayon-plain-tag">&quot;apps&quot;: [

// utiliser votre pr&eacute;fixe avec  vos components
 &quot;prefix&quot;: &quot;ns&quot;,
// ajouter des js externe
&quot;scripts&quot;: [
        &quot;../node_modules/moment/moment.js&quot;
      ],
// Ajouter des css sp&eacute;cifiques
 &quot;styles&quot;: [
        &quot;../node_modules/font-awesome/css/font-awesome.css&quot;,
        &quot;./styles.scss&quot;
      ],
]

// Ajouter des typos

&quot;addons&quot;: [
&quot;../node_modules/font-awesome/fonts/*.+(otf|eot|svg|ttf|woff|woff2)&quot;,
&quot;./assets/fonts/glyphicons/*.+(otf|eot|svg|ttf|woff|woff2)&quot;,
],</pre><p>Dans le terminal</p>
<p></p><pre class="crayon-plain-tag"># Choisir un port sp&eacute;cifique pour le serve
    ng serve --port 4201

    # mettre &agrave; jour angular cli
    # sur votre machine (le cli &eacute;tant install&eacute; en global)
    npm uninstall -g angular-cli
    npm cache clean
    npm install -g angular-cli@latest

    # le projet ou le cli est utilis&eacute;
    rm -rf node_modules dist tmp
    npm install --save-dev angular-cli@latest
    npm install
    ng init</pre><p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/angular-cli-angular-cli-json/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mettre à jour NPM et gérer les versions de node.js</title>
		<link>https://www.blog.niums.com/mettre-a-jour-npm-gerer-versions-de-node-js/</link>
					<comments>https://www.blog.niums.com/mettre-a-jour-npm-gerer-versions-de-node-js/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Thu, 29 Dec 2016 10:44:57 +0000</pubDate>
				<category><![CDATA[Developpement web]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[npm]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=1838</guid>

					<description><![CDATA[Node.js est mis à jour très régulièrement. Il devient vite difficile de suivre et de garder les bonnes versions sur sa machine surtout si vous travailler avec différentes versions. Installer Node.js Si vous installer Node pour la première fois, vous pouvez l&#8217;installer depuis le site internet nodejs.org avec l&#8217;installateur proposé. Installer, mettre à jour, désinstaller via &#8230; <p class="link-more"><a href="https://www.blog.niums.com/mettre-a-jour-npm-gerer-versions-de-node-js/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;Mettre à jour NPM et gérer les versions de node.js&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>Node.js est mis à jour très régulièrement. Il devient vite difficile de suivre et de garder les bonnes versions sur sa machine surtout si vous travailler avec différentes versions.</p>
<h2>Installer Node.js</h2>
<p>Si vous installer Node pour la première fois, vous pouvez l&rsquo;installer depuis le site internet <a href="https://nodejs.org/">nodejs.org</a> avec l&rsquo;installateur proposé.</p>
<p><figure id="attachment_1840" aria-describedby="caption-attachment-1840" style="width: 590px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-medium wp-image-1840" src="http://www.blog.niums.com/wp-content/uploads/2016/12/nodejs-installation-590x384.png" alt="Node Js" width="590" height="384" srcset="https://www.blog.niums.com/wp-content/uploads/2016/12/nodejs-installation-590x384.png 590w, https://www.blog.niums.com/wp-content/uploads/2016/12/nodejs-installation-768x500.png 768w, https://www.blog.niums.com/wp-content/uploads/2016/12/nodejs-installation-1024x666.png 1024w, https://www.blog.niums.com/wp-content/uploads/2016/12/nodejs-installation.png 1191w" sizes="auto, (max-width: 590px) 100vw, 590px" /><figcaption id="caption-attachment-1840" class="wp-caption-text">Node Js</figcaption></figure></p>
<h3>Installer, mettre à jour, désinstaller via le terminal</h3>
<p>Si vous souhaitez l&rsquo;installer via le terminal, il suffit d&rsquo;utiliser Homebrew. Vous aurez aussi besoin d&rsquo;avoir xCode à jour.</p><pre class="crayon-plain-tag"># Installer Homebrew
# gestionnaire de package pour mac
ruby -e &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&quot;
&nbsp;
# Installer nodeJs
brew install node
&nbsp;
# verifier si node et npm sont installer
node -v
&nbsp;
npm -v
&nbsp;
# mettre &agrave; jour brew
brew update
&nbsp;
# mettre &agrave; jour node
brew upgrade node
&nbsp;
# d&eacute;sinstaller Node et NPM
brew uninstall node</pre><p></p>
<h2>Mettre à jour Node</h2>
<h3>Mise à jour depuis le site nodejs.org</h3>
<p>Il suffit de récupérer l&rsquo;installateur et de le réinstaller&#8230;.</p>
<h3>Gérer plusieurs versions de Node.js</h3>
<p>A un moment ou un autre vous aurez besoin de switcher entre les différentes versions de node. Pour le faire facilement il y a deux solution : <strong>Node version Manager (nvm)</strong> et <strong>n</strong>.</p>
<h4>Node version manager (nvm)</h4>
<p><a href="https://github.com/creationix/nvm">https://github.com/creationix/nvm</a></p>
<p>NVM est un script bash permettant</p>
<ul>
<li>d&rsquo;installer multiple versions de node</li>
<li>mettre à jour vers la dernière version</li>
<li>choisir la version par défaut du système</li>
<li>lister toutes les versions de node sur le système</li>
</ul>
<p></p><pre class="crayon-plain-tag"># installer nvm 
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
&nbsp;
# voir quelles versions de node sont installer
nvm ls
&nbsp;
# voir les versions disponible
nvm ls-remote
&nbsp;
# installer une version
nvm install v7.3.0
&nbsp;
# d&eacute;finir une version comme &eacute;tant celle par d&eacute;faut
# nvm alias default v7.3.0</pre><p></p>
<h4><strong>n</strong></h4>
<p><a href="https://github.com/tj/n">https://github.com/tj/n</a></p>
<p>n est gestionnaire de package similaire à nvm.</p>
<p>La grosse différence est qu&rsquo;il faut déjà avoir node pour l&rsquo;installer.</p>
<p>Ou alors cloner le dépot et faire un <strong>make install</strong></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1839 size-full" src="http://www.blog.niums.com/wp-content/uploads/2016/12/n.gif" width="640" height="428" /></p>
<p>&nbsp;</p><pre class="crayon-plain-tag"># installer n 
npm install -g n
&nbsp;
# voir quelles versions de node sont installer
n
&nbsp;
# installer la derni&egrave;re version
n latest
&nbsp;
# installer la derni&egrave;re version stable
n stable
&nbsp;
# installer une version
n 7.3.0
&nbsp;
# supprimer une version
n rm 7.3.0 
&nbsp;
# ou
n - 7.3.0</pre><p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/mettre-a-jour-npm-gerer-versions-de-node-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Visual Studio Code] Lancer VSC depuis le terminal</title>
		<link>https://www.blog.niums.com/visual-studio-code-lancer-vsc-terminal/</link>
					<comments>https://www.blog.niums.com/visual-studio-code-lancer-vsc-terminal/#respond</comments>
		
		<dc:creator><![CDATA[Niums]]></dc:creator>
		<pubDate>Thu, 29 Dec 2016 10:33:33 +0000</pubDate>
				<category><![CDATA[Developpement web]]></category>
		<guid isPermaLink="false">http://www.blog.niums.com/?p=1833</guid>

					<description><![CDATA[Pour pouvoir lancez directement Visual Studio depuis le terminal en tapant « code », il faut : 1 &#8211; Aller dans Visual Studio Code. 2 &#8211; Taper (maj cmd P) puis shell command. 3 &#8211; Activer l&#8217;option et voilà ! Ensuite vous pourrez directement le lancez avec la variable code. # ouvrir tout un répertoire dans vsc [crayon-69cbba27100db566446732/] &#8230; <p class="link-more"><a href="https://www.blog.niums.com/visual-studio-code-lancer-vsc-terminal/" class="more-link">Continuer la lecture<span class="screen-reader-text"> de &#171;&#160;[Visual Studio Code] Lancer VSC depuis le terminal&#160;&#187;</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>Pour pouvoir lancez directement Visual Studio depuis le terminal en tapant « code », il faut :</p>
<p>1 &#8211; Aller dans Visual Studio Code.<br />
2 &#8211; Taper (maj cmd P) puis shell command.<br />
3 &#8211; Activer l&rsquo;option et voilà !</p>
<p>Ensuite vous pourrez directement le lancez avec la variable code.</p>
<p># ouvrir tout un répertoire dans vsc</p><pre class="crayon-plain-tag">cd mon-projet .</pre><p># ouvrir tout un fichier dans vsc</p><pre class="crayon-plain-tag">cd mon-projet index.scss</pre><p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.blog.niums.com/visual-studio-code-lancer-vsc-terminal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>