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

<channel>
	<title>Z-upload.fr</title>
	<atom:link href="https://z-upload.fr/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.z-upload.fr</link>
	<description>Sur www.z-upload vous trouverez les dernières revues sur Software, Développement &#38; About your Ingénierie, Programmation.</description>
	<lastBuildDate>Tue, 08 Nov 2022 12:25:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://z-upload.fr/wp-content/uploads/2022/11/z-upload-Logo-100-×-100-px.png</url>
	<title>Z-upload.fr</title>
	<link>https://www.z-upload.fr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Le passé intérieur prend le monde de Rusty Lake dans une direction coopérative</title>
		<link>https://z-upload.fr/le-passe-interieur-prend-le-monde-de-rusty-lake-dans-une-direction-cooperative/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 09:54:13 +0000</pubDate>
				<category><![CDATA[Application mobile]]></category>
		<guid isPermaLink="false">https://z-upload.fr/le-passe-interieur-prend-le-monde-de-rusty-lake-dans-une-direction-cooperative/</guid>

					<description><![CDATA[Dans le jeu coopératif, vous devrez jouer avec quelqu&#8217;un avec une autre copie du jeu et un moyen de communiquer les uns avec les autres. L&#8217;un de vous jouera dans The Past tandis que l&#8217;autre choisira The Future. En équipe, vous travaillerez dans l&#8217;aventure pointer-cliquer pour résoudre les mystères entourant Albert Vanderboom dans une salle [...]]]></description>
										<content:encoded><![CDATA[<div>
<p>Dans le jeu coopératif, vous devrez jouer avec quelqu&#8217;un avec une autre copie du jeu et un moyen de communiquer les uns avec les autres. L&#8217;un de vous jouera dans The Past tandis que l&#8217;autre choisira The Future.</p>
<p>En équipe, vous travaillerez dans l&#8217;aventure pointer-cliquer pour résoudre les mystères entourant Albert Vanderboom dans une salle d&#8217;évasion numérique.</p>
<p>Les deux joueurs découvriront également leurs dimensions en 2D et 3D, une autre première pour tout jeu Rusty Lake qui ajoute un nouveau défi. Les environnements 3D sont superbes et s&#8217;intègrent parfaitement dans le monde effrayant.</p>
</div>
<div>
<p>Le jeu contient deux chapitres et a une durée de jeu moyenne d&#8217;environ deux heures. Pour une expérience optimale, vous devez rejouer le jeu sous l&#8217;autre angle pour voir tout ce que vous avez manqué la première fois.</p>
<p>Il existe également une rejouabilité pour un nouveau départ qui fournit des solutions complètement nouvelles à tous les puzzles.</p>
<p>The Past Within est conçu pour l&#8217;iPhone et tous les modèles d&#8217;iPad. Vous pouvez le télécharger dès maintenant sur le</p>
<p>Vous pouvez jouer avec d&#8217;autres sur d&#8217;autres plateformes car le jeu est également disponible sur Google Play et Steam. Il sortira sur la Nintendo Switch dans le futur.</p>
<p>Si vous cherchez quelqu&#8217;un avec qui jouer, vous pouvez également trouver un partenaire sur le jeu <a href="https://discord.gg/rustylake" target="_blank" rel="noopener">e</a> serveur.</p>
<p>Même s&#8217;il s&#8217;agit de votre premier jeu Rusty Lake, il n&#8217;y a pas lieu de s&#8217;inquiéter. Vous n&#8217;avez besoin d&#8217;aucune autre connaissance préalable de la série.</p>
<p>Mais si vous êtes un fan de longue date de la franchise Rusty Lake, vous trouverez quelque chose de nouveau dans The Past Within. En plus du grand jeu coopératif, les graphismes 3D valent vraiment le prix d&#8217;entrée.</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les 5 meilleurs jeux de tir de puzzle</title>
		<link>https://z-upload.fr/les-5-meilleurs-jeux-de-tir-de-puzzle/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 09:54:05 +0000</pubDate>
				<category><![CDATA[Application mobile]]></category>
		<guid isPermaLink="false">https://z-upload.fr/les-5-meilleurs-jeux-de-tir-de-puzzle/</guid>

					<description><![CDATA[Si vous aimez les jeux de flipper sur votre iPhone ou iPad, alors INKS est celui que vous devez vérifier. Ce jeu amusant vous offre l&#8217;action de flipper classique avec une touche colorée. Chaque fois que votre flipper touche une couleur sur la table, de l&#8217;encre éclabousse. Les couleurs seront à différents endroits, avec différentes [...]]]></description>
										<content:encoded><![CDATA[<div>
<p>Si vous aimez les jeux de flipper sur votre iPhone ou iPad, alors INKS est celui que vous devez vérifier.  Ce jeu amusant vous offre l&#8217;action de flipper classique avec une touche colorée.</p>
<p>Chaque fois que votre flipper touche une couleur sur la table, de l&#8217;encre éclabousse.  Les couleurs seront à différents endroits, avec différentes méthodes pour les frapper, sur les différentes tables.  Cela donne une expérience de flipper vraiment distinctive et si vous aimez la création d&#8217;encre que vous avez faite, vous pouvez en prendre un instantané pour l&#8217;enregistrer ou le partager.</p>
<p>Le jeu propose 100 tables de flipper différentes sur lesquelles jouer, chacune avec son propre design unique.  Et bien sûr, il y a des défis qui sont beaucoup plus difficiles qu&#8217;ils n&#8217;en ont l&#8217;air.  Alors, ne soyez pas trop distrait par la toile colorée que vous créez car vous devez encore compléter le tableau.</p>
<p>Votre objectif sur chacune des tables est de toucher toutes les couleurs.  Vous continuerez à obtenir plus de flippers, mais vous ne pourrez pas terminer le tableau tant que toutes les couleurs n&#8217;auront pas été éclaboussé.  Une fois que vous avez réussi, votre flipper se retirera chez lui au centre de la table.</p>
<p>Le jeu coûte 2,99 $.</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Meilleures applications Apple Watch pour courir</title>
		<link>https://z-upload.fr/meilleures-applications-apple-watch-pour-courir/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 09:52:20 +0000</pubDate>
				<category><![CDATA[Application mobile]]></category>
		<guid isPermaLink="false">https://z-upload.fr/meilleures-applications-apple-watch-pour-courir/</guid>

					<description><![CDATA[Au fil des ans, Nike est devenu un symbole de la course à pied. C&#8217;est pourquoi l&#8217;entreprise s&#8217;est efforcée de créer l&#8217;application de course à pied qui vous rapprochera des autres coureurs, vous servira de coach personnel et vous servira de journal d&#8217;entraînement. Peu importe à quel point vous êtes avancé, il est presque impossible [...]]]></description>
										<content:encoded><![CDATA[<div>
<p><span style="font-weight: 400;">Au fil des ans, Nike est devenu un symbole de la course à pied.  C&#8217;est pourquoi l&#8217;entreprise s&#8217;est efforcée de créer l&#8217;application de course à pied qui vous rapprochera des autres coureurs, vous servira de coach personnel et vous servira de journal d&#8217;entraînement.</span></p>
<p><span style="font-weight: 400;">Peu importe à quel point vous êtes avancé, il est presque impossible d&#8217;atteindre vos objectifs sans un plan approprié.  Ainsi, que vous souhaitiez courir votre premier 5 km ou un marathon, il existe de nombreux plans d&#8217;entraînement créés par des entraîneurs expérimentés pour vous aider à vous rapprocher de vos objectifs, en éliminant le risque de blessure. </span></p>
<p><span style="font-weight: 400;">Pour rester motivé, vous pouvez utiliser des courses guidées, où des entraîneurs et des légendes de la course vous encourageront.  Il existe également de nombreux défis amusants que vous pouvez partager avec vos amis et votre famille, ainsi que des défis mondiaux qui servent des objectifs plus élevés.  Grâce à votre appartenance à cette incroyable communauté, vous ne vous sentirez jamais seul à courir pour atteindre vos objectifs.  De plus, l&#8217;application est entièrement gratuite !</span></p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>5 meilleures applications pour perdre du poids</title>
		<link>https://z-upload.fr/5-meilleures-applications-pour-perdre-du-poids/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 09:52:04 +0000</pubDate>
				<category><![CDATA[Application mobile]]></category>
		<guid isPermaLink="false">https://z-upload.fr/5-meilleures-applications-pour-perdre-du-poids/</guid>

					<description><![CDATA[Fooducate adopte l&#8217;approche moins c&#8217;est plus. C&#8217;est une application de régime qui vous aide à atteindre vos objectifs de poids en suivant la qualité des calories, pas seulement la quantité. Vous pouvez lire des conseils et des articles sur la nutrition et l&#8217;exercice afin que vous puissiez décider comment intégrer des habitudes plus saines dans [...]]]></description>
										<content:encoded><![CDATA[<div>
<p>Fooducate adopte l&#8217;approche moins c&#8217;est plus.  C&#8217;est une application de régime qui vous aide à atteindre vos objectifs de poids en suivant la qualité des calories, pas seulement la quantité.</p>
<p>Vous pouvez lire des conseils et des articles sur la nutrition et l&#8217;exercice afin que vous puissiez décider comment intégrer des habitudes plus saines dans votre vie.  Vous pouvez suivre les repas et les recettes, le niveau de faim, l&#8217;humeur, le sommeil et l&#8217;exercice en un seul endroit.</p>
<p>Fooducate analyse les informations trouvées dans les informations nutritionnelles lorsque vous scannez un code-barres dans l&#8217;application.  Il recherche des éléments tels que les sucres ajoutés, les édulcorants artificiels, les graisses, le sirop de maïs à haute teneur en fructose, etc.  Vous recevrez une note nutritionnelle personnalisée pour chaque aliment que vous entrez.  Cela vous aide à prendre les décisions les plus éclairées lorsque vous choisissez quoi mettre dans votre corps.</p>
<p>Fooducate est gratuit avec l&#8217;achat intégré.  La mise à niveau vers l&#8217;un des plans d&#8217;abonnement vous donne un accès complet à toutes les fonctionnalités et supprime les publicités.  Le forfait mensuel coûte 9,99 $ et le forfait annuel coûte 49,99 $.</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tauri contre Electron pour les applications Tray.  Créez une application de démarrage de plateau Tauri en utilisant… &#124;  de Dotan Nahum &#124;  novembre 2022</title>
		<link>https://z-upload.fr/tauri-contre-electron-pour-les-applications-tray-creez-une-application-de-demarrage-de-plateau-tauri-en-utilisant-de-dotan-nahum-novembre-2022/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 09:51:56 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://z-upload.fr/tauri-contre-electron-pour-les-applications-tray-creez-une-application-de-demarrage-de-plateau-tauri-en-utilisant-de-dotan-nahum-novembre-2022/</guid>

					<description><![CDATA[Construire une application de démarrage de plateau Tauri en utilisant Rust et JavaScript est similaire à Electron en général. Les principes sont les mêmes : créez des applications rapidement en utilisant JavaScript pour effectuer la majeure partie du travail de l&#8217;application / de l&#8217;interface utilisateur. Cependant, Tauri adopte une approche radicalement différente dans sa mise [...]]]></description>
										<content:encoded><![CDATA[<div>
<h2 id="4a97" class="pw-subtitle-paragraph lo kq kr bm b lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf cn">Construire une application de démarrage de plateau Tauri en utilisant Rust et JavaScript</h2>
<figure class="mh mi mj mk ix ml il im paragraph-image">
<div class="il im mg"></div><figcaption class="mo bl in il im mp mq bm b bn bo cn"></figcaption></figure>
<p id="5a5c" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">est similaire à Electron en général. Les principes sont les mêmes : créez des applications rapidement en utilisant JavaScript pour effectuer la majeure partie du travail de l&#8217;application / de l&#8217;interface utilisateur.</p>
<p id="c411" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Cependant, Tauri adopte une approche radicalement différente dans sa mise en œuvre et, par conséquent, obtient de meilleurs résultats sur pratiquement tous les critères possibles.</p>
<p id="28dc" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Nous savons déjà qu&#8217;il existe deux problèmes majeurs avec les applications basées sur Electron :</p>
<ul class="">
<li id="a115" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Taille du bundle (taille de téléchargement)</li>
<li id="db86" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Utilisation de la RAM et croissance dans le temps</li>
</ul>
<p id="9f59" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Avec Electron, vous commencez avec une taille de bundle de 85 Mo pour presque aucune fonctionnalité, et la plupart des applications se téléchargent facilement jusqu&#8217;à 150 Mo.</p>
<p id="a58c" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">En termes d&#8217;utilisation de la mémoire, une application Electron utilise au départ 500 Mo de votre RAM pour ne rien faire. C&#8217;est pourquoi je n&#8217;utilise aucune application Electron (appelée «applications natives») pour diverses applications Web populaires telles que Slack et autres. J&#8217;utilise simplement Chrome, en espérant qu&#8217;il puisse mieux optimiser l&#8217;utilisation de la RAM dans les onglets.</p>
<p id="f8ff" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Pour Tauri : 8 Mo de taille groupée pour de nombreuses fonctionnalités et une utilisation maximale de la mémoire de 150 à 200 Mo, principalement en raison du fait qu&#8217;un navigateur est un navigateur. Les navigateurs ont tendance à ne consommer que de la mémoire (ils utilisent la vue Web native de chaque système d&#8217;exploitation).</p>
<p id="4098" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">En termes de fonctionnalités, eh bien, ce qui a pris des années à Electron (je parle ici en tant que développeur Electron) &#8211; vous l&#8217;avez disponible dès maintenant dans Tauri, dans sa première version stable. D&#8217;un bundler de qualité et d&#8217;outils de développement, à un programme de mise à jour intégré, à la prise en charge des icônes de la barre d&#8217;état, et plus encore.</p>
<p id="9466" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Un avantage supplémentaire que vous obtenez des applications Tauri provient directement de son état d&#8217;esprit d&#8217;ingénierie, que je suppose que Rust a aidé à conduire.</p>
<h2 id="a190" class="oz np kr bm nq pa pb fe nu pc pd fg ny na pe pf oa ne pg ph oc ni pi pj oe pk gl">Sécurité en tant que citoyen de première classe</h2>
<figure class="mh mi mj mk ix ml il im paragraph-image">
<div class="pm pn do po ce pp" tabindex="0" role="button">
<div class="il im pl"></div>
</div><figcaption class="mo bl in il im mp mq bm b bn bo cn"></figcaption></figure>
<p id="a1fb" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Sécurité en tant que citoyen de première classe. Peu de plates-formes d&#8217;applications (en fait : aucune à ma connaissance) commencent par une description détaillée de leurs fonctions de sécurité intégrées, ainsi qu&#8217;un <a class="au nn" href="https://tauri.app/v1/references/architecture/security/" target="_blank" rel="noopener ugc nofollow">implémentation de fonctionnalités avancées</a> à utiliser, en se concentrant sur le côté JS, l&#8217;IPC, et plus encore. Cela vient s&#8217;ajouter à ce que Rust en tant que langage offre en matière de sécurité et de stabilité. Encore plus impressionnant est le <a class="au nn" href="https://tauri.app/v1/references/security/" target="_blank" rel="noopener ugc nofollow">inclusion de la modélisation des menaces</a> et la réflexion sur la manière d&#8217;opérer de manière défensive : la sécurité dès la conception.</p>
<h2 id="b85e" class="oz np kr bm nq pa pb fe nu pc pd fg ny na pe pf oa ne pg ph oc ni pi pj oe pk gl">Performance en tant que citoyen de première classe</h2>
<figure class="mh mi mj mk ix ml il im paragraph-image">
<div class="pm pn do po ce pp" tabindex="0" role="button">
<div class="il im pq"></div>
</div><figcaption class="mo bl in il im mp mq bm b bn bo cn"></figcaption></figure>
<p id="3571" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Des repères en tant que citoyen de première classe. Encore une fois, peu de plates-formes commencent par ce sujet, fournissant des informations très détaillées, <a class="au nn" href="https://tauri.app/v1/references/benchmarks/" target="_blank" rel="noopener ugc nofollow">benchmark automatisé et transparent</a>. Lorsque cela se produit dans une bibliothèque, un outil ou une plate-forme, vous savez que la performance est un KPI principal. Et lorsque vous créez des applications, vous voulez vous assurer que les performances de la plate-forme que vous utilisez restent excellentes afin que votre application qui est construite dessus reste excellente. Si la plate-forme a des problèmes de performances, cela signifie automatiquement que votre application a des problèmes de performances, et aussi &#8211; que vous, en tant que développeur, n&#8217;aurez probablement aucun moyen de le résoudre.</p>
<h2 id="3647" class="oz np kr bm nq pa pb fe nu pc pd fg ny na pe pf oa ne pg ph oc ni pi pj oe pk gl">Séparation complète du backend et du frontend</h2>
<figure class="mh mi mj mk ix ml il im paragraph-image">
<div class="pm pn do po ce pp" tabindex="0" role="button">
<div class="il im pr"></div>
</div><figcaption class="mo bl in il im mp mq bm b bn bo cn"></figcaption></figure>
<p id="0894" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Bien que cela puisse initialement être perçu comme un inconvénient par rapport à Electron, le fait que le processus backend soit construit en Rust et que le frontend soit construit en JavaScript est en réalité extrêmement bénéfique :</p>
<ul class="">
<li id="f7dd" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Ça nous oblige à vraiment raisonner sur l&#8217;IPC, qui incite à la sécurité et à la stabilité</li>
<li id="3cfe" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Dans le cas de Rust, il vous donne exactement ce dont vous avez besoin dans un processus backend : performances, sécurité, stabilité et une approche systémique lorsque vous devez opérer étroitement avec le système sous-jacent. Vous ne pouvez pas vraiment faire cela avec un processus backend basé sur Node.js (vous devrez utiliser une API native dans ce cas)</li>
</ul>
<p id="a9f0" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Et avec la façon dont Tauri résume IPC avec les macros Rust et l&#8217;expérience des développeurs, même si vous ne connaissez pas Rust, tout ira bien.</p>
<p id="1ee1" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Construire des applications Electron n&#8217;est en aucun cas simple. C&#8217;est pratiquement le sommet du paradoxe du choix, comme avec de nombreuses applications JavaScript, mais ici, encore plus. Bien que vous ayez la fatigue JavaScript standard du côté frontal de l&#8217;application Electron, vous avez la même chose dans le processus &#8220;principal&#8221; du backend : vous devez choisir vos outils, bibliothèques et principes JavaScript, mais limités à un processus Node.js pur. (donc certaines bibliothèques ne fonctionneront pas, et d&#8217;autres <em class="ps">seulement</em> travailler).</p>
<p id="6431" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Avec Tauri, le backend est écrit en Rust, et l&#8217;écosystème Rust est simple et surtout il y a une bonne bibliothèque pour faire quelque chose. Ainsi, vous évitez le paradoxe du choix et avez plus de temps pour construire.</p>
<p id="ef97" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Pour la partie frontale, vous vous retrouvez avec la même expérience qu&#8217;avec vos applications Electron. Vous devrez choisir votre bundler, votre framework d&#8217;application, votre framework de style, votre framework de gestion d&#8217;état, votre linter, etc., que vous optiez pour JavaScript ou TypeScript.</p>
<p id="b64f" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">En ce sens, construire sur Tauri est plus simple.</p>
<figure class="mh mi mj mk ix ml il im paragraph-image">
<div class="il im pt"></div><figcaption class="mo bl in il im mp mq bm b bn bo cn"></figcaption></figure>
<p id="86e7" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Pour cet exercice, voyons ce que signifie une &#8220;application de plateau&#8221;. Au départ, c&#8217;est en fait beaucoup de choses. C&#8217;est un:</p>
<ul class="">
<li id="22ea" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Application de bureau</li>
<li id="365c" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Un widget ou un accessoire du système d&#8217;exploitation</li>
<li id="80c3" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Un processus de fond de longue durée</li>
<li id="6ded" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Un exercice de fenêtrage (par exemple apparaître au bon endroit)</li>
</ul>
<p id="d451" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Et donc, cela pourrait être un exercice difficile pour une nouvelle plate-forme d&#8217;application, ce qui est parfait pour comprendre comment Tauri le gère. Nous savons déjà que de nombreuses applications de plateau sont implémentées dans Electron aujourd&#8217;hui, alors comment Tauri s&#8217;en sort-il ?</p>
</div>
<div>
<p id="2803" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Décomposons l&#8217;application de bureau Docker. Nous allons essayer de reconstruire la plupart de ses parties à Tauri, et voir ce qui fonctionne.</p>
<p id="2cf0" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">L&#8217;exigence ou les spécifications du bureau Docker sont du type :</p>
<ul class="">
<li id="0453" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Barre d&#8217;état avec une icône de mise à jour (lors du chargement de Docker)</li>
<li id="fefd" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Mise à jour des éléments de menu dynamiques dans la barre d&#8217;état, par exemple pour afficher l&#8217;état &#8220;Docker est en cours d&#8217;exécution&#8221; et le nom de l&#8217;utilisateur actuellement connecté lors de l&#8217;ouverture du menu de la barre d&#8217;état</li>
<li id="0cc9" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Une fenêtre de bureau qui s&#8217;ouvre (le Dashboard), qui a un comportement spécifique :</li>
<li id="a32e" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Lors de l&#8217;affichage de la fenêtre (Plateau → Ouvrir le tableau de bord), la fenêtre doit apparaître dans votre espace de travail actuel et surveiller</li>
<li id="a606" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Lorsque vous cliquez en dehors de la fenêtre ou que vous allez faire autre chose, la fenêtre doit se cacher</li>
<li id="a67f" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">C&#8217;est une question de goût, nous pouvons faire traîner la fenêtre, et l&#8217;utilisateur doit explicitement la masquer en cliquant sur fermer (en fait, la fermeture devrait se fermer, mais nous l&#8217;empêchons et nous la cachons à la place)</li>
<li id="dbe5" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">L&#8217;application ne doit pas être présente sur votre barre des tâches / tremplin. Il ne devrait vivre que dans votre bac.</li>
<li id="6c53" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">C&#8217;est une préférence de goût, nous pouvons l&#8217;activer/désactiver.</li>
<li id="33b7" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">A une taille spécifique, ne peut pas être redimensionnée</li>
<li id="1c92" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Peut être déplacé, a une coque de fenêtre (cela peut être retiré, mais laissons la coque)</li>
</ul>
<p id="022d" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">En termes d&#8217;infrastructure et de mécanique, nous avons besoin de ce qui suit :</p>
<ul class="">
<li id="be0a" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Une sorte d&#8217;interrogation du statut entre l&#8217;application JavaScript et le processus principal de Rust. Nous pouvons aller:</li>
<li id="aaea" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">JavaScript interroge Rust avec setInterval et invoque une commande Tauri, ou</li>
<li id="7859" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Côté rouille poussant un événement périodique en faisant un <code class="hb qg qh qi qj b">emit</code> sur la fenêtre principale pour que le côté JavaScript écoute</li>
<li id="1524" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Quoi qu&#8217;il en soit, nous avons une ligne de communication constante entre les deux parties, ce qui est formidable.</li>
<li id="c4a2" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Nous transformons une application de bureau en un processus puissant de longue durée.</li>
<li id="29dd" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Nous avons également besoin d&#8217;un code d&#8217;appel ad hoc de JavaScript vers Rust, ceci est résolu comme par magie par Tauri <code class="hb qg qh qi qj b">command</code> abstraction</li>
<li id="b38c" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Enfin, nous avons besoin d&#8217;un cadre et d&#8217;une infrastructure d&#8217;applications de bureau à part entière. Ici, nous utiliserons React, Chakra-UI, React Router et Zustand ou Redux pour l&#8217;état et plus particulièrement la persistance de l&#8217;état (par exemple lors du stockage des paramètres utilisateur).</li>
</ul>
<p id="cf38" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Vous pouvez essayer le projet de démarrage terminé ici :</p>
<p id="bd8c" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Cela peut surprendre, mais comparé à Go ou Node.js, Rust n&#8217;a pas une grande bibliothèque de barre d&#8217;état système, et Tauri a en fait la meilleure implémentation en ce moment. Ce que nous avons est le suivant :</p>
<p id="5f47" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">ez besoin <code class="hb qg qh qi qj b">pnpm</code> et vous voulez probablement <a class="au nn" href="https://tauri.app/v1/guides/getting-started/prerequisites" target="_blank" rel="noopener ugc nofollow">exécuter le guide de démarrage</a> pour obtenir les prérequis de base en place)</p>
<p id="cf47" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Chaque application Tauri se divise en frontend et processus principal (noyau Tauri). Dans le projet de démarrage, l&#8217;interface comporte les principaux composants suivants :</p>
<ul class="">
<li id="fc74" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl"><a class="au nn" href="https://vitejs.dev/" target="_blank" rel="noopener ugc nofollow">Vite</a> pour la construction</li>
<li id="4e35" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Réagissez en tant que cadre d&#8217;interface utilisateur</li>
<li id="9add" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl"><a class="au nn" href="https://chakra-ui.com/" target="_blank" rel="noopener ugc nofollow">Interface utilisateur des chakras</a> comme cadre de composants et pour le style</li>
<li id="0c53" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl"><a class="au nn" href="https://github.com/remix-run/react-router" target="_blank" rel="noopener ugc nofollow">Réagir Routeur</a> en tant que cadre de routage à usage général, lorsqu&#8217;une application doit charger et décharger des &#8220;écrans&#8221;</li>
<li id="d8e5" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl"><a class="au nn" href="https://redux-toolkit.js.org/" target="_blank" rel="noopener ugc nofollow">Boîte à outils Redux</a> ou <a class="au nn" href="https://github.com/pmndrs/zustand" target="_blank" rel="noopener ugc nofollow">Zustand</a> pour la gestion de l&#8217;état et la persistance des données (les deux sont câblés, choisissez ce que vous préférez)</li>
</ul>
<p id="6925" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Voici quelques mécanismes de notre liste de souhaits que nous souhaitons mettre en place dans la partie noyau / processus principal implémentée dans l&#8217;API de Rust et Tauri.</p>
<ul class="">
<li id="0c64" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Éviter de fermer depuis la fenêtre car c&#8217;est une application de plateau</li>
<li id="f87a" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Masquer de la barre des tâches</li>
<li id="cc5d" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">S&#8217;assurer que la fenêtre apparaît devant l&#8217;utilisateur</li>
<li id="c74f" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">État &#8211; pour être familier, nous pouvons utiliser l&#8217;un ou l&#8217;autre (nous utiliserons l&#8217;état du côté JavaScript)</li>
<li id="fbda" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Côté JavaScript (gestion de l&#8217;état comme d&#8217;habitude).</li>
<li id="de16" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Côté rouille — <a class="au nn" href="https://docs.rs/tauri/1.1.1/tauri/trait.Manager.html#method.state" target="_blank" rel="noopener ugc nofollow">le directeur de l&#8217;état</a> dans Tauri peut être utilisé pour le stockage d&#8217;état à usage général.</li>
<li id="bbc7" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Processus d&#8217;arrière-plan en cours d&#8217;exécution et de déclenchement</li>
<li id="b763" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Côté JavaScript &#8211; nous répondrons à la question &#8211; une boucle setInterval naïve vivra-t-elle éternellement et cinglera-t-elle le noyau Rust? (oui)</li>
<li id="82da" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Et aussi quelle est la meilleure façon d&#8217;initier une telle boucle éternelle ?</li>
<li id="e2de" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Contrôler les fonctionnalités natives du côté JavaScript, telles que la définition d&#8217;un élément de menu natif</li>
</ul>
<p id="edac" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">C&#8217;est facile à faire, voici la recette :</p>
<p id="0acb" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Créez un élément et attribuez-lui un identifiant unique :</p>
<p id="680a" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Créez une commande et demandez le descripteur d&#8217;application dans la signature de la fonction</p>
<p id="45a2" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Enregistrez-le en utilisant le morceau de code suivant :</p>
<p id="51a9" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Et appelez-le du côté JS avec invoke</p>
<p id="880b" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Nous avons deux façons de procéder, dans le diagramme de séquence ci-dessous, les deux sont représentées :</p>
<figure class="mh mi mj mk ix ml il im paragraph-image"><figcaption class="mo bl in il im mp mq bm b bn bo cn"></figcaption></figure>
<h2 id="3d92" class="oz np kr bm nq pa pb fe nu pc pd fg ny na pe pf oa ne pg ph oc ni pi pj oe pk gl">Procssus de longue durée côté JavaScript</h2>
<p id="ae4d" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Nous voulons exécuter un JavaScript normal <code class="hb qg qh qi qj b">setInterval</code> et j&#8217;espère qu&#8217;il restera en vie et capable de piloter le processus Rust également via IPC (un Tauri <code class="hb qg qh qi qj b">command</code>).</p>
<p id="ca11" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Bref, ça marche</p>
<p id="59fa" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Mais attention à certains pièges :</p>
<h2 id="4a72" class="oz np kr bm nq pa pb fe nu pc pd fg ny na pe pf oa ne pg ph oc ni pi pj oe pk gl">Processus de longue durée côté Rust</h2>
<p id="7bb4" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Nous pouvons avoir un processus de longue durée du côté de Rust, lancer un thread et lui faire faire une boucle éternelle avec un petit sommeil entre les itérations.</p>
<p id="389c" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Quelques questions ici :</p>
<ul class="">
<li id="5157" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Comment et quand le démarrer ?</li>
<li id="e230" class="ol om kr mt b mu ou mx ov na ow ne ox ni oy nm oq or os ot gl">Qu&#8217;est-ce que le modèle de simultanéité ? puisqu&#8217;un thread Rust veut cingler le côté JavaScript via IPC, il doit y avoir quelque chose à raisonner ici</li>
</ul>
<p id="eaba" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Pour démarrer un tel processus, nous pouvons avoir un <code class="hb qg qh qi qj b">command</code> et invoquez-le lorsque nous sommes prêts du côté JavaScript. Il n&#8217;y a pas de bien ou de mal ici, c&#8217;est une question de ce dont vous avez besoin.</p>
<p id="3c71" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Ou lancez une boucle éternelle dans la phase de configuration de Tauri, où nous avons toujours accès à une application. Pour émettre un événement, il faut le faire via un <code class="hb qg qh qi qj b">Window</code>puisque <code class="hb qg qh qi qj b">App</code> ne sera pas thread-safe.</p>
<p id="c540" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Essayons de lancer une requête réseau, que le côté Rust exécute. Ici, nous utilisons request, qui utilise async, et <code class="hb qg qh qi qj b">tokio</code> comme temps d&#8217;exécution.</p>
<p id="95e8" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Nous savons que cela nécessite une initialisation <code class="hb qg qh qi qj b">tokio</code> runtime dans n&#8217;importe quel exécutable que nous produisons. Comme nous le verrons, Tauri utilise <code class="hb qg qh qi qj b">tokio</code>, donc tout fonctionne hors de la boîte. Rendez simplement la fonction asynchrone comme vous le feriez normalement, mais rappelez-vous : vous <em class="ps">doit renvoyer une erreur sérialisable.</em></p>
<p id="a45f" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Pour le rendre intéressant, nous retournons également un <code class="hb qg qh qi qj b">Vec</code> (sérialisable) de <code class="hb qg qh qi qj b">Content</code> (sérialisable).</p>
<p id="f730" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Une fois cette opération terminée, nous recevrons avec plaisir le contenu sérialisé en tant qu&#8217;objet de données JavaScript du côté JS.</p>
<p id="23c4" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Lors de la navigation en dehors d&#8217;une fenêtre avec un intervalle de temps long, elle est déchargée et effacée. Et React Router est prêt à l&#8217;emploi.</p>
<ul class="">
<li id="fd9f" class="ol om kr mt b mu mv mx my na on ne oo ni op nm oq or os ot gl">Rappelez-vous : nous ne naviguons pas vraiment dans un site Web. Ainsi, l&#8217;utilisation d&#8217;un routeur comme React Router devient un besoin spécialisé. Au lieu d&#8217;utiliser un routeur, vous pouvez utiliser une sorte de contrôle Tabs contenant tous les écrans de l&#8217;application dont vous avez besoin.</li>
</ul>
<p id="aeba" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Dans l&#8217;ensemble, pour les longs processus, il est préférable de les déposer dans la racine du routeur de réaction, et pour les parties de l&#8217;interface utilisateur qui changent, déposez-les dans un <code class="hb qg qh qi qj b">&lt;Outlet/&gt;</code> dans la racine.</p>
<p id="e956" class="pw-post-body-paragraph mr ms kr mt b mu og ls mw mx oh lv mz na oi nc nd ne oj ng nh ni ok nk nl nm kk gl">Le mélange de correspondance de modèles dans l&#8217;API de Rust et Tauri est tout simplement fantastique :</p>
<p id="d759" class="pw-post-body-paragraph mr ms kr mt b mu mv ls mw mx my lv mz na nb nc nd ne nf ng nh ni nj nk nl nm kk gl">Pour ajouter des éléments, vous devez reconstruire le menu complet avec le nouvel élément inclus, et le réinitialiser via l&#8217;API native :</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Bloqué : comment demander de l&#8217;aide en tant que stagiaire</title>
		<link>https://z-upload.fr/bloque-comment-demander-de-laide-en-tant-que-stagiaire/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 13:43:40 +0000</pubDate>
				<category><![CDATA[Ingénierie]]></category>
		<guid isPermaLink="false">https://z-upload.fr/2022/11/06/bloque-comment-demander-de-laide-en-tant-que-stagiaire/</guid>

					<description><![CDATA[Vous avez maîtrisé LeetCode, réussi le processus d&#8217;entretien et obtenu un stage dans une entreprise incroyable. Félicitations! Mais maintenant, c&#8217;est la troisième semaine de votre stage, vous n&#8217;avez aucune idée de comment cela fonctionne et vous avez écrit une ligne de code au cours des deux derniers jours. Comment demander de l&#8217;aide ? À qui [...]]]></description>
										<content:encoded><![CDATA[<div>
<p>Vous avez maîtrisé LeetCode, réussi le processus d&#8217;entretien et obtenu un stage dans une entreprise incroyable. Félicitations! Mais maintenant, c&#8217;est la troisième semaine de votre stage, vous n&#8217;avez aucune idée de comment cela fonctionne et vous avez écrit une ligne de code au cours des deux derniers jours.</p>
<p><strong>Comment demander de l&#8217;aide ? À qui demandez-vous de l&#8217;aide? Devriez-vous même demander de l&#8217;aide?</strong></p>
<p>En travaillant chez Slack, j&#8217;ai découvert que savoir naviguer dans ces situations et se débloquer est essentiel pour réussir son stage. Apprendre à apprendre semblait souvent plus important que d&#8217;apprendre le matériel technique lui-même.</p>
<h3>Arrière plan</h3>
<table>
<tbody>
<tr>
<td></td>
<td>
<ol>
<li>J&#8217;entame ma dernière année à l&#8217;Université de Virginie, avec une spécialisation en informatique</li>
<li>Avant Slack, ma seule expérience professionnelle était dans une petite startup où il n&#8217;y avait qu&#8217;un seul autre ingénieur iOS ; cet été a été une toute nouvelle expérience pour moi.</li>
</ol>
</td>
</tr>
</tbody>
</table>
<h3>Mon projet</h3>
<ul>
<li>J&#8217;ai effectué un stage au sein de l&#8217;équipe iOS Application Infrastructure. Mon projet était centré sur l&#8217;onglet Mentions (également connu sous le nom d&#8217;onglet Activités)</li>
<li>J&#8217;ai été chargé de changer le fournisseur de données pour l&#8217;onglet Activités
<ul>
<li>Avant : données actualisées à partir d&#8217;un appel d&#8217;API déclenché par une extraction manuelle ou un minuteur de 60 secondes</li>
<li>Après : utiliser entrant <a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a> événements avec des données de message pour mettre à jour l&#8217;écran, au lieu d&#8217;attendre le prochain appel d&#8217;API</li>
</ul>
</li>
</ul>
<p>La première partie de mon projet était centrée sur l&#8217;ajout de l&#8217;écoute des mises à jour des modèles de messages associés aux activités existantes. La partie technique de ce projet n&#8217;était pas si difficile en soi. Cela m&#8217;a quand même pris environ la moitié de mon stage, car je me familiarisais avec la base de code et, plus important encore, j&#8217;apprenais à apprendre.</p>
<p>La deuxième partie de mon projet consistait à ajouter un nouveau fournisseur de données qui diffusait toutes les activités des événements WebSocket, puis le combinait avec le flux de données existant. C&#8217;était une tâche beaucoup plus difficile que la première partie, mais parce que j&#8217;avais appris à me débloquer, tout est allé beaucoup plus vite ; Je n&#8217;ai jamais été coincé aussi longtemps.</p>
<p>J&#8217;espère que certaines des choses que j&#8217;ai apprises cet été pourront aider les futurs stagiaires à atteindre ce stade plus tôt dans leur stage !</p>
<h2>Quand demander de l&#8217;aide</h2>
<p>La première étape pour savoir quand demander de l&#8217;aide est d&#8217;apprendre que l&#8217;industrie est un monde complètement différent de celui de l&#8217;école. Il n&#8217;y a pas de triche, il n&#8217;y a pas de notes individuelles, il n&#8217;y a pas de tests. Tout, surtout chez Slack, est collaboratif. S&#8217;il vous faut deux jours pour corriger un bogue, mais qu&#8217;un autre ingénieur peut vous dire ce qui ne va pas en deux minutes, vous demandez de l&#8217;aide.</p>
<p>La question la plus importante à vous poser lorsque vous décidez de demander de l&#8217;aide est la suivante :</p>
<p><strong>Est-ce que j&#8217;apprendrai quelque chose en passant plus de temps là-dessus ?</strong></p>
<p>Votre travail en tant que stagiaire est d&#8217;apprendre autant que vous le pouvez. Parfois, vous apprendrez beaucoup en prenant le temps de résoudre un problème. D&#8217;autres fois, vous pourriez perdre une journée entière dans le débogueur sur un problème simple qui peut être résolu avec une explication d&#8217;une phrase de votre mentor.</p>
<p><strong>Types de problèmes auxquels vous ne devriez pas passer beaucoup de temps à vous attaquer par vous-même :</strong></p>
<ul>
<li>Mise en page</li>
<li>Syntaxe</li>
<li>Quelle fonction appeler pour obtenir un certain type de données</li>
</ul>
<p><strong>Types de problèmes que vous voudrez peut-être passer du temps à résoudre par vous-même :</strong></p>
<ul>
<li>Comment une fonction que vous appelez <i>réellement</i> obtient les données dont vous avez besoin</li>
<li>Comment les changements d&#8217;état d&#8217;une partie de l&#8217;application sont reflétés dans l&#8217;interface utilisateur</li>
</ul>
<p>La principale différence entre ces deux types de problèmes est la différence entre <i>connaissances</i> et <i>entente</i>. Vous ne devriez passer du temps à résoudre un problème par vous-même que si cela vous permet de mieux comprendre comment les choses fonctionnent.</p>
<p>Même si aborder les problèmes par vous-même peut vous aider à apprendre, vous pourriez parfois avoir besoin de l&#8217;aide de quelqu&#8217;un d&#8217;autre pour avancer. C&#8217;est tout à fait bien ! Les applications comme Slack sont incroyablement compliquées et les stagiaires ne sont pas censés être capables de tout comprendre par eux-mêmes. Tant que vous demandez de l&#8217;aide de la bonne manière, il n&#8217;y a rien de mal à cela.</p>
<h2>Comment demander de l&#8217;aide</h2>
<p>Posez des questions auxquelles il est facile de répondre.</p>
<p>Si vous posez une question basée sur les connaissances, c&#8217;est assez facile car il y a normalement une réponse simple. Par exemple, voici une question que j&#8217;ai posée au début de mon stage :</p>
<p>Lorsque vous êtes bloqué sur un problème plus compliqué, poser la bonne question devient beaucoup plus difficile. J&#8217;ai vraiment eu du mal à saisir la complexité des problèmes tout en offrant à quelqu&#8217;un d&#8217;autre un moyen simple de répondre.</p>
<p>La première étape qui m&#8217;a aidé consistait simplement à passer du temps à essayer de comprendre le problème. Si vous comprenez 95 % du changement que vous essayez d&#8217;apporter, il est beaucoup plus facile pour quelqu&#8217;un d&#8217;autre de clarifier ces derniers 5 % que de suivre l&#8217;intégralité du processus. D&#8217;après mon expérience, les gens sont très disposés à vous aider s&#8217;il est clair que vous avez passé du temps à comprendre les systèmes avec lesquels vous travaillez avant de leur demander de l&#8217;aide. Parfois, vous répondrez même à votre propre question en essayant de comprendre le problème !</p>
<p>Si vous avez encore besoin d&#8217;aide après avoir essayé de comprendre le problème sur lequel vous travaillez, l&#8217;étape suivante consiste à fournir autant de contexte que possible lorsque vous posez votre question.</p>
<p>Cela peut impliquer de décrire :</p>
<ul>
<li>Ce que vous comprenez du problème</li>
<li>Ce que vous ne comprenez pas au problème</li>
<li>Ce que tu as changé</li>
<li>Le comportement attendu par rapport à la sortie réelle</li>
</ul>
<p>Au lieu de dire quelque chose comme « J&#8217;ai du mal à mettre en œuvre &lt;fonctionnalité&gt;, pouvez-vous m&#8217;aider ? » dites quelque chose comme : « J&#8217;ai essayé d&#8217;utiliser pour implémenter &lt;fonctionnalité&gt;, mais au lieu de , c&#8217;est le qui se produit. Avez-vous une idée de comment aborder cela ? »&lt;/fonctionnalité&gt;&lt;/fonctionnalité&gt;</p>
<p>Une autre stratégie pour vous débloquer est la programmation en binôme ou l&#8217;appel avec quelqu&#8217;un de votre équipe. Je recommanderais certainement de le faire autant que possible, en particulier pour vos problèmes les plus difficiles.</p>
<h2>À qui demander de l&#8217;aide</h2>
<p>Lors de mon dernier stage, mon manager était également le seul autre ingénieur iOS de l&#8217;entreprise. En d&#8217;autres termes, dans 99% des situations, la seule personne à qui j&#8217;ai demandé de l&#8217;aide était mon manager. Cet été, je me suis retrouvé dans une équipe de 14 personnes, toutes avec des connaissances dans différents domaines. Il n&#8217;était plus simple de savoir à qui demander de l&#8217;aide.</p>
<p>Ce que j&#8217;ai appris:</p>
<ol>
<li>N&#8217;ayez pas peur de demander de l&#8217;aide dans un canal. Si vous ne savez pas à qui demander, il est préférable de demander dans un canal public plutôt que d&#8217;envoyer un DM à la moitié de votre équipe jusqu&#8217;à ce que quelqu&#8217;un puisse vous aider.</li>
<li>N&#8217;ayez pas peur de demander à votre mentor ou à votre responsable à qui vous devriez vous adresser.</li>
<li>Si quelqu&#8217;un vous a déjà aidé dans un certain domaine, n&#8217;ayez pas peur de lui demander à nouveau de l&#8217;aide sur le même sujet.</li>
</ol>
<h2>Comparer deux exemples</h2>
<p>Permettez-moi de vous donner deux exemples de cet été. La première est une situation où j&#8217;aurais dû demander de l&#8217;aide plus tôt, mais je ne l&#8217;ai pas fait. L&#8217;autre est celui où j&#8217;ai réussi à prendre le temps de comprendre le problème avant de demander de l&#8217;aide.</p>
<h3>Cas 1</h3>
<p>Cette situation date du tout début de mon stage. Pour le contexte, dans l&#8217;application iOS de Slack, il existe différents modèles de données pour un message et une activité (c&#8217;est-à-dire un message qui vous mentionne ou une réaction à votre message). Pour chaque activité, nous avons un identifiant associé qui ressemble à :</p>
<p>J&#8217;essayais de changer le fournisseur de données d&#8217;activités pour écouter les mises à jour de tous les messages associés aux activités. Les messages ont également un identifiant, j&#8217;ai donc ajouté un flux de modèles de message avec le même identifiant que les modèles d&#8217;activité actuels. De manière inattendue cependant, le flux ne renvoyait aucun message. J&#8217;ai parcouru le débogueur pendant un certain temps et j&#8217;ai finalement vu que dans d&#8217;autres parties de l&#8217;application qui utilisaient MessagesDataProvider, les identifiants de message semblaient différents. ils n&#8217;avaient tous aucun type et ressemblaient juste à :</p>
<p>Je ne savais pas si cette différence d&#8217;identifiant provenait d&#8217;une erreur que j&#8217;avais commise lors de modifications locales des données de message, ou si c&#8217;était parce que les identifiants étaient différents dans les activités et les messages. À ce stade, j&#8217;aurais simplement dû demander : &#8220;Les identifiants d&#8217;activité et de message sont-ils différents ?&#8221; pour voir comment aborder ce problème. Au lieu de poser une question de clarification, j&#8217;ai sauté directement dans la recherche d&#8217;une solution. J&#8217;ai fini par utiliser un autre champ d&#8217;activité messageIdentifier comme ID pour diffuser des messages, ce qui semblait fonctionner.</p>
<p>Le problème était que parce que je n&#8217;ai jamais posé de question, je n&#8217;ai pas vraiment <i>comprendre</i> pourquoi les identifiants étaient différents, même s&#8217;il semblait que j&#8217;avais trouvé une solution. Plus tard, j&#8217;ai rencontré un tas de problèmes car lorsque j&#8217;ai commencé à créer des activités à partir de messages, j&#8217;ai copié tous les champs Message, y compris id ! Cela a causé des problèmes avec des activités en double, car j&#8217;écrivais la même activité avec deux identifiants différents (un <i>avec</i> le type, un sans).</p>
<p>Il s&#8217;avère, comme vous l&#8217;avez peut-être deviné, que les identifiants d&#8217;activité et de message sont simplement formatés différemment et que j&#8217;avais besoin de convertir entre les deux. J&#8217;ai finalement clarifié cela en demandant à quelqu&#8217;un. Cependant, je me serais sauvé des heures et des heures de temps si j&#8217;avais simplement posé cette question dès que j&#8217;ai vu l&#8217;écart d&#8217;identification. C&#8217;était un <i>connaissances</i>basée sur une question et non une <i>entente</i>-basée sur la question, j&#8217;aurais donc dû demander dès que j&#8217;avais besoin d&#8217;éclaircissements. Je suis content que cela se soit produit vers le début de mon stage, car j&#8217;ai pu en tirer des leçons et être plus disposé à poser des questions basées sur les connaissances à l&#8217;avenir.</p>
<h3>Cas 2</h3>
<p>Cette situation vient de la moitié de mon stage. Je venais de terminer la première partie de mon projet et commençais la deuxième partie : ajouter la possibilité de diffuser des activités créées à partir d&#8217;une source différente (événements WebSocket) de celle que nous faisons normalement.</p>
<p>Sur la base d&#8217;une suggestion de mon responsable, j&#8217;ai pris une journée entière pour rédiger un document expliquant exactement comment les données circulent depuis la requête réseau qui renvoie les activités à l&#8217;interface utilisateur dans l&#8217;onglet mentions. Cela m&#8217;a permis de mieux comprendre avant de commencer le problème. Une fois que j&#8217;ai commencé, j&#8217;ai passé quelques jours à mettre en œuvre une solution de base qui semblait fonctionner à partir de mes tests. C&#8217;est à ce stade, après avoir acquis une certaine compréhension de ce que je changeais, que j&#8217;ai demandé un examen de mes modifications.</p>
<p>L&#8217;examen des relations publiques est revenu et il s&#8217;est avéré que je l&#8217;avais complètement mal fait. Cependant, parce que j&#8217;avais une solide compréhension du système, j&#8217;ai immédiatement demandé de l&#8217;aide et j&#8217;ai rejoint un Huddle avec deux ingénieurs de mon équipe. Nous avons discuté de la meilleure façon d&#8217;aborder le problème; il s&#8217;est avéré que j&#8217;ai dû écrire un nouveau fournisseur de données pour l&#8217;onglet activités qui combinait un flux d&#8217;activités du dernier appel API avec un flux d&#8217;activités filtré sur le dernier horodatage de l&#8217;autre flux.</p>
<p>Ce Huddle m&#8217;a probablement fait gagner des semaines de temps que j&#8217;aurais passé si j&#8217;avais simplement essayé de résoudre le problème et de créer une solution parfaite par moi-même. Cependant, si j&#8217;avais demandé de l&#8217;aide avant de comprendre le problème, je n&#8217;aurais pas pu tirer grand-chose de l&#8217;appel.</p>
<p>Le point à retenir de cette situation est que vous devez essayer de trouver le bon moment pour demander de l&#8217;aide : vous devez comprendre suffisamment que d&#8217;autres personnes peuvent vous aider efficacement, mais aussi demander suffisamment tôt pour que leur aide vous fasse gagner du temps.</p>
<h2>Gros plats à emporter</h2>
<p>Apprendre à travailler dans l&#8217;industrie est aussi important, sinon plus, que d&#8217;apprendre le côté technique du génie logiciel. Je me suis également trouvé beaucoup moins stressé lorsque je suis devenu plus à l&#8217;aise pour demander de l&#8217;aide. Une fois à l&#8217;aise, je me sentais bien plus comme un membre d&#8217;une équipe que comme un ingénieur individuel et je m&#8217;amusais beaucoup plus au quotidien.</p>
<p>Mon dernier conseil est simplement de profiter de votre temps en tant que stagiaire ! Douze semaines passent vite et c&#8217;est vraiment une formidable opportunité d&#8217;être stagiaire chez Slack. J&#8217;ai passé un été incroyable et j&#8217;espère que tous les futurs stagiaires lisant ceci le seront aussi !</p>
<p class="hiring">
<p>Si vous souhaitez travailler sur les applications mobiles de Slack, consultez nos postes vacants ! <a class="" href="https://slack.com/jobs/dept/engineering" target="_blank" rel="noopener" data-clog-click="" data-clog-trigger="trigger=" data-clog-ui-element="" data-clog-ui-component="">Appliquer maintenant</a></p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Société de développement de logiciels personnalisés MobiDev</title>
		<link>https://z-upload.fr/societe-de-developpement-de-logiciels-personnalises-mobidev-4/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 13:43:34 +0000</pubDate>
				<category><![CDATA[Développement]]></category>
		<guid isPermaLink="false">https://z-upload.fr/2022/11/06/societe-de-developpement-de-logiciels-personnalises-mobidev-4/</guid>

					<description><![CDATA[CONTACTS Bureau américain &#8211; MobiDev Corporation 3855 Holcomb Bridge Road. Suite 300, Norcross, Géorgie 30092, États-Unis Bureau au Royaume-Uni &#8211; MobiDev International Ltd 311, rue Shoreham, Sheffield, Yorkshire du Sud S24FA, Angleterre Centres de R&#38;D &#8211; Lodz (Pologne), Chernivtsi (Ukraine) Appelez-nous : +1 888 380 0276 Mail : contact@mobidev.biz]]></description>
										<content:encoded><![CDATA[<div>
<p class="title">CONTACTS</p>
<p>                                    <strong>Bureau américain &#8211; MobiDev Corporation</strong></p>
<p>3855 Holcomb Bridge Road.  Suite 300,<br />
Norcross, Géorgie 30092, États-Unis<br />
<strong>Bureau au Royaume-Uni &#8211; MobiDev International Ltd</strong></p>
<p>311, rue Shoreham,<br />
Sheffield, Yorkshire du Sud S24FA, Angleterre<br />
<strong>Centres de R&amp;D &#8211; Lodz (Pologne), Chernivtsi (Ukraine)</strong><br />
<strong><br />
<span class="phone">Appelez-nous : +1 888 380 0276</span></strong></p>
<p><strong>                                                                            <span class="email">Mail : contact@mobidev.biz</span></p>
<p></strong><strong>                                </strong></p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Moteur de recherche GIF avec PNL</title>
		<link>https://z-upload.fr/moteur-de-recherche-gif-avec-pnl/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 13:43:26 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://z-upload.fr/2022/11/06/moteur-de-recherche-gif-avec-pnl/</guid>

					<description><![CDATA[Amélioration de la découverte de GIF à l&#8217;aide de la PNL et de la recherche sémantique La recherche de vecteurs alimente certains des services les plus populaires au monde. Il sert vos résultats Google, fournit le meilleurs podcasts sur Spotifyet compte pour au moins 35% des achats des consommateurs sur Amazon [1][2]. Dans cet article, [...]]]></description>
										<content:encoded><![CDATA[<div>
<h2 id="362b" class="pw-subtitle-paragraph kc je jf bm b kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt cn">Amélioration de la découverte de GIF à l&#8217;aide de la PNL et de la recherche sémantique</h2>
<figure class="kv kw kx ky gr kz gf gg paragraph-image"><figcaption class="lg bl gh gf gg lh li bm b bn bo cn"></figcaption></figure>
<p id="3687" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">La recherche de vecteurs alimente certains des services les plus populaires au monde. Il sert vos résultats Google, fournit le <a class="au lj" href="https://www.pinecone.io/learn/spotify-podcast-search/" target="_blank" rel="noopener ugc nofollow">meilleurs podcasts sur Spotify</a>et compte pour <em class="mg">au moins</em> 35% des achats des consommateurs sur Amazon [1][2].</p>
<p id="5bd4" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Dans cet article, nous utiliserons la recherche vectorielle appliquée au langage, appelée <em class="mg">sémantique</em> search, pour créer un moteur de recherche GIF. Contrairement à la recherche plus traditionnelle, où nous comptons sur <em class="mg">mot-clé</em> correspondance, la recherche sémantique permet une recherche basée sur <em class="mg">sens humain</em> derrière le texte et les images.</p>
<p id="e37e" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu"><strong class="lm jg">Cela signifie que nous pouvons trouver des GIF très pertinents avec des invites en langage naturel.</strong></p>
<figure class="kv kw kx ky gr kz gf gg paragraph-image">
<div class="la lb do lc ce ld" tabindex="0" role="button">
<div class="gf gg mh"></div>
</div><figcaption class="lg bl gh gf gg lh li bm b bn bo cn"></figcaption></figure>
<p id="a2ca" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Le pipeline d&#8217;un projet comme celui-ci est simple mais puissant. Il peut facilement être adapté à des tâches aussi diverses que <a class="au lj" href="https://www.pinecone.io/learn/youtube-search/" target="_blank" rel="noopener ugc nofollow">recherche vidéo</a> ou <a class="au lj" href="https://www.pinecone.io/learn/question-answering/" target="_blank" rel="noopener ugc nofollow">répondre aux questions du Super Bowl</a>ou, comme nous le verrons, trouver des GIF.</p>
<p id="746b" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu"><a class="au lj" href="https://github.com/pinecone-io/examples/tree/master/learn/projects/gif-search" target="_blank" rel="noopener ugc nofollow"><em class="mg">Tous les blocs-notes et scripts de support peuvent être trouvés ici</em></a>.</p>
<figure class="kv kw kx ky gr kz"></figure>
</div>
<div>
<p id="5453" class="pw-post-body-paragraph lk ll jf lm b ln nj kg lp lq nk kj ls lt nl lv lw lx nm lz ma mb nn md me mf iy fu">Nous utiliserons le jeu de données TGIF [3] trouvé <a class="au lj" href="https://github.com/raingo/TGIF-Release" target="_blank" rel="noopener ugc nofollow">sur GitHub ici</a>. Pour obtenir le jeu de données, nous pouvons utiliser <code class="fj no np nq nr b">wget</code> (alternativement, téléchargez-le manuellement) et décompressez.</p>
<pre class="kv kw kx ky gr ns bs nt nu dz nr"></pre>
<p>unzip master.zi</p>
<p id="f842" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Dans ces fichiers décompressés, nous devrions pouvoir trouver un fichier nommé  l&#8217;intérieur de <code class="fj no np nq nr b">data</code> annuaire. Nous utiliserons <em class="mg">pandas</em> pour charger le fichier en utilisant <code class="fj no np nq nr b">t</code> comme délimiteur de champ.</p>
<figure class="kv kw kx ky gr kz">
<p id="bee9" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">L&#8217;ensemble de données contient des URL GIF et leurs descriptions en langage naturel. Nous pouvons jeter un œil aux cinq premiers GIF.</p>
<figure class="kv kw kx ky gr kz">
<p id="4085" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Nous constaterons qu&#8217;il existe des URL en double, mais celles-ci n&#8217;indiquent pas nécessairement des enregistrements en double en tant que <em class="mg">GIF unique</em> plusieurs descriptions peuvent être attribuées.</p>
<figure class="kv kw kx ky gr kz">
<p id="66e2" class="pw-post-body-paragraph lk ll jf lm b ln nj kg lp lq nk kj ls lt nl lv lw lx nm lz ma mb nn md me mf iy fu">Le pipeline de recherche prendra, à un niveau élevé, notre requête en langage naturel comme <em class="mg">&#8220;un chien qui parle au téléphone&#8221;</em> et recherchez dans les descriptions GIF existantes tout ce qui a une image similaire <em class="mg">sens</em> à cette requête.</p>
<p id="799f" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Dans ce contexte, nous décrivons <em class="mg">sens</em> comme <em class="mg">similarité sémantique</em>, qui sont tous deux des termes chargés et peuvent faire référence à beaucoup de choses. Par exemple, les deux phrases sont-elles  similaire? Dans ce cas, cela dépendrait beaucoup de notre cas d&#8217;utilisation.</p>
<p id="0816" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Autre exemple : laquelle des deux phrases suivantes se ressemble le plus ?</p>
<p id="116d" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Si nous voulions trouver des phrases ayant une signification similaire, le choix évident serait <code class="fj no np nq nr b">A</code> et <code class="fj no np nq nr b">C</code>. Faire correspondre ceux avec <code class="fj no np nq nr b">B</code> aurait peu de sens. Cependant, ce n&#8217;est pas le cas si nous recherchons des <em class="mg">couples question-réponse</em>; dans ce cas, <code class="fj no np nq nr b">B</code> devrait correspondre très étroitement avec <code class="fj no np nq nr b">A</code> et <code class="fj no np nq nr b">C</code>.</p>
<p id="ad80" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Il est important d&#8217;identifier ce que votre cas d&#8217;utilisation requiert dans sa définition de <em class="mg">« similarité sémantique »</em>. Pour nous, nous voulons vraiment identifier la similitude générique. C&#8217;est-à-dire que nous voulons <code class="fj no np nq nr b">A</code> et <code class="fj no np nq nr b">C</code> correspondre, et <code class="fj no np nq nr b">B</code> pour ne correspondre ni à l&#8217;un ni à l&#8217;autre.</p>
<p id="e98b" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour ce faire, nous allons transformer nos phrases en <a class="au lj" href="https://www.pinecone.io/learn/dense-vector-embeddings-nlp/" target="_blank" rel="noopener ugc nofollow"><em class="mg">plongements vectoriels denses</em></a>. Ces vecteurs denses peuvent être stockés dans un <a class="au lj" href="https://www.pinecone.io/learn/vector-database/" target="_blank" rel="noopener ugc nofollow"><em class="mg">base de données vectorielle</em></a> où nous pouvons très rapidement comparer des vecteurs et identifier les plus similaires sur la base de métriques telles que la distance euclidienne et la similarité cosinus.</p>
<figure class="kv kw kx ky gr kz gf gg paragraph-image"><figcaption class="lg bl gh gf gg lh li bm b bn bo cn"></figcaption></figure>
<p id="89d3" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">La base de données vectorielle gère le stockage et la recherche rapide de nos vecteurs intégrés, mais nous avons encore besoin d&#8217;un moyen de créer ces vecteurs intégrés.</p>
<p id="115d" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour ce faire, nous utilisons des modèles de transformateur NLP appelés <em class="mg">récupérateurs</em> qui sont <a class="au lj" href="https://www.pinecone.io/learn/sentence-embeddings/" target="_blank" rel="noopener ugc nofollow">affinée pour la création <em class="mg">plongements de phrases</em></a>. Ces plongements/vecteurs de phrases peuvent <em class="mg">représenter numériquement</em> la <em class="mg">sens</em> derrière le texte qu&#8217;ils représentent.</p>
<figure class="kv kw kx ky gr kz gf gg paragraph-image"><figcaption class="lg bl gh gf gg lh li bm b bn bo cn"></figcaption></figure>
<p id="8665" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">La réunion de ces deux composants nous donne un pipeline de recherche sémantique que nous pouvons utiliser pour récupérer des descriptions GIF sémantiquement similaires en fonction d&#8217;une requête.</p>
<figure class="kv kw kx ky gr kz gf gg paragraph-image"><figcaption class="lg bl gh gf gg lh li bm b bn bo cn"></figcaption></figure>
<p id="22d1" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Voyons comment nous pouvons mettre tout cela ensemble.</p>
<p id="bed1" class="pw-post-body-paragraph lk ll jf lm b ln nj kg lp lq nk kj ls lt nl lv lw lx nm lz ma mb nn md me mf iy fu">Nous allons commencer par initialiser notre modèle de retriever. Bon nombre des retrievers les plus puissants utilisent un <em class="mg">transformateur de phrase</em> architecture, qui sont mieux pris en charge via le <code class="fj no np nq nr b">sentence-transformers</code> bibliothèque, installé via un <code class="fj no np nq nr b">pip install sentence-transformers</code>.</p>
<p id="7627" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour trouver des modèles de transformateurs de phrases, nous allons à <a class="au lj" href="https://huggingface.co/models" target="_blank" rel="noopener ugc nofollow"><em class="mg">huggingface.co/models</em></a> et chercher <code class="fj no np nq nr b">sentence-transformers</code> pour le <em class="mg">officiel</em> modèles de transformateurs de phrases.</p>
<p id="0698" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Cependant, il existe d&#8217;autres modèles que nous pouvons utiliser, comme le <code class="fj no np nq nr b"><a class="au lj" href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" target="_blank" rel="noopener ugc nofollow">all-MiniLM-L6-v2</a></code> transformateur de phrase formé lors d&#8217;un événement spécial sur <a class="au lj" href="https://discuss.huggingface.co/t/train-the-best-sentence-embedding-model-ever-with-1b-training-pairs/7354" target="_blank" rel="noopener ugc nofollow">plus de 1 milliard de paires d&#8217;entraînement</a>. Nous utiliserons ce modèle.</p>
<figure class="kv kw kx ky gr kz">
<p id="9ed4" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Il y a quelques détails importants ici :</p>
<ul class="">
<li id="7453" class="oj ok jf lm b ln lo lq lr lt ol lx om mb on mf oo op oq or fu">signifie que le modèle peut lire jusqu&#8217;à <em class="mg">128</em> jetons d&#8217;entrée.</li>
<li id="50cb" class="oj ok jf lm b ln os lq ot lt ou lx ov mb ow mf oo op oq or fu"><code class="fj no np nq nr b"></code> se réfère en fait à la <em class="mg">phrase</em> taille d&#8217;encastrement. Cela signifie que le modèle produira une représentation vectorielle à 384 dimensions du texte d&#8217;entrée.</li>
</ul>
<p id="a55b" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour les courtes descriptions GIF de plusieurs mots de notre ensemble de données, une longueur de séquence maximale de <em class="mg">128</em> est <em class="mg">plus qu&#8217;assez</em>.</p>
<p id="2908" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Nous devons utiliser le <em class="mg">phrase</em> taille d&#8217;intégration lors de l&#8217;initialisation de notre base de données vectorielle, nous stockons donc cela dans le <code class="fj no np nq nr b">embed_dim</code> variables ci-dessus.</p>
<p id="8310" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour initialiser notre base de données vectorielles, nous devons d&#8217;abord nous inscrire à un <a class="au lj" href="https://app.pinecone.io/" target="_blank" rel="noopener ugc nofollow">clé API Pinecone gratuite</a> et installez le client Pinecone Python via <code class="fj no np nq nr b">pip install pinecone-client</code>. Une fois prêt, nous initialisons :</p>
<figure class="kv kw kx ky gr kz">
<p id="7d5b" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Ici, nous spécifions un nom d&#8217;index de <code class="fj no np nq nr b">'gif-search'</code>; n&#8217;hésitez pas à choisir ce que vous aimez. C&#8217;est simplement un nom. La <code class="fj no np nq nr b">metric</code> est plus important et dépend du modèle utilisé.</p>
<p id="91b4" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour notre modèle choisi, nous pouvons voir dans son <a class="au lj" href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" target="_blank" rel="noopener ugc nofollow"><em class="mg">modèle de carte</em></a> qu&#8217;il a été formé à l&#8217;utilisation <em class="mg">similarité cosinus</em>c&#8217;est pourquoi nous avons précisé es métriques alternatives incluent</p>
<p id="42c5" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Nous avons initialisé notre base de données vectorielle et nos composants de récupération, afin que nous puissions passer à l&#8217;intégration et à l&#8217;indexation de nos données.</p>
<p id="cfca" class="pw-post-body-paragraph lk ll jf lm b ln nj kg lp lq nk kj ls lt nl lv lw lx nm lz ma mb nn md me mf iy fu">Le processus d&#8217;intégration et d&#8217;indexation est beaucoup plus rapide lorsque nous effectuons ces étapes pour plusieurs enregistrements <em class="mg">en parallèle</em>. Cependant, nous ne pouvons pas traiter tous nos enregistrements en même temps car le modèle de récupération doit déplacer tout ce qu&#8217;il intègre dans la mémoire sur puce, qui est limitée.</p>
<p id="197d" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour éviter cette limite tout en gardant les temps d&#8217;indexation aussi rapides que possible, nous traitons tout par lots de <code class="fj no np nq nr b">64</code>.</p>
<figure class="kv kw kx ky gr kz">
<p id="1947" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Ici, nous extrayons le <code class="fj no np nq nr b">batch</code> de nos données <code class="fj no np nq nr b">df</code>. Nous encodons les descriptions via notre modèle de récupération, créons des métadonnées (couvrant à la fois <em class="mg">descriptifs</em> et <em class="mg">URL</em>) et créez des ID de format de chaîne. À partir de là, nous avons tout ce dont nous avons besoin pour créer <em class="mg">documents</em>qui ressemblera à ceci :</p>
<p id="6a63" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">quand nous <code class="fj no np nq nr b">upsert</code> ces <em class="mg">documents</em> à l&#8217;indice Pinecone, nous le faisons par lots de <em class="mg">64</em>. Après tout cela, nous utilisons  pour vérifier que nous avons inséré tous <em class="mg">125 782</em> documents dont nous disposons.</p>
<p id="7710" class="pw-post-body-paragraph lk ll jf lm b ln nj kg lp lq nk kj ls lt nl lv lw lx nm lz ma mb nn md me mf iy fu">La dernière étape de l&#8217;interrogation de nos données couvre :</p>
<ol class="">
<li id="b89b" class="oj ok jf lm b ln lo lq lr lt ol lx om mb on mf ox op oq or fu">Encoder une requête comme <em class="mg">&#8220;les chiens parlent au téléphone&#8221;</em> créer un <em class="mg">vecteur de requête</em>,</li>
<li id="2043" class="oj ok jf lm b ln os lq ot lt ou lx ov mb ow mf ox op oq or fu">Récupération de similaires <em class="mg">vecteurs de contexte</em> de Pomme de pin,</li>
<li id="26ae" class="oj ok jf lm b ln os lq ot lt ou lx ov mb ow mf ox op oq or fu">Obtenir des GIF pertinents à partir des URL trouvées dans nos champs de métadonnées.</li>
</ol>
<figure class="kv kw kx ky gr kz gf gg paragraph-image">
<div class="la lb do lc ce ld" tabindex="0" role="button">
<div class="gf gg oy"></div>
</div><figcaption class="lg bl gh gf gg lh li bm b bn bo cn"></figcaption></figure>
<p id="a029" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pas <em class="mg">une</em> et <em class="mg">deux</em> sera exécuté par une fonction nommée <code class="fj no np nq nr b">search_gif</code>:</p>
<figure class="kv kw kx ky gr kz">
<p id="b034" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Pour afficher les GIF, nous affichons HTML <code class="fj no np nq nr b">&lt;img&gt;</code> éléments utilisant les URL de métadonnées pour pointer vers les bons GIF. Nous le faisons en utilisant le <code class="fj no np nq nr b">display_gif</code> fonction:</p>
<figure class="kv kw kx ky gr kz">
<p id="0b64" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Testons quelques requêtes.</p>
<figure class="kv kw kx ky gr kz">
<p id="dd2c" class="pw-post-body-paragraph lk ll jf lm b ln lo kg lp lq lr kj ls lt lu lv lw lx ly lz ma mb mc md me mf iy fu">Cela semble assez précis, nous avons donc réussi à assembler facilement ce pipeline de recherche GIF. Avec un <a class="au lj" href="https://github.com/pinecone-io/examples/blob/master/learn/projects/gif-search/app.py" target="_blank" rel="noopener ugc nofollow">petit effort supplémentaire</a>nous pouvons traduire ces étapes en créant une application Web en utilisant quelque chose comme <a class="au lj" href="https://www.youtube.com/watch?v=QpISF8gMsjQ" target="_blank" rel="noopener ugc nofollow"><em class="mg">Streamlit</em></a>.</p>
</figure>
</figure>
</figure>
</figure>
</figure>
</figure>
</figure>
</figure>
</figure>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Une journée dans la vie d&#8217;un ingénieur cloud chez Slack Australie</title>
		<link>https://z-upload.fr/une-journee-dans-la-vie-dun-ingenieur-cloud-chez-slack-australie/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 13:43:23 +0000</pubDate>
				<category><![CDATA[Ingénierie]]></category>
		<guid isPermaLink="false">https://z-upload.fr/2022/11/06/une-journee-dans-la-vie-dun-ingenieur-cloud-chez-slack-australie/</guid>

					<description><![CDATA[06h15 Mes deux jeunes enfants viennent me réveiller, me présentant des iPads dans l&#8217;espoir d&#8217;une petite partie de Minecraft avant l&#8217;école. Je cède parfois car cela pourrait signifier quelques minutes de sommeil de plus ! 07h00 Il est temps pour le premier de nombreux blancs plats d&#8217;avoine &#8211; ou flatties d&#8217;avoine comme nous, les Australiens, [...]]]></description>
										<content:encoded><![CDATA[<div>
<h2>06h15</h2>
<p><span style="font-weight: 400">Mes deux jeunes enfants viennent me réveiller, me présentant des iPads dans l&#8217;espoir d&#8217;une petite partie de Minecraft avant l&#8217;école.  Je cède parfois car cela pourrait signifier quelques minutes de sommeil de plus !</span></p>
<h2>07h00</h2>
<p><span style="font-weight: 400">Il est temps pour le premier de nombreux blancs plats d&#8217;avoine &#8211; ou flatties d&#8217;avoine comme nous, les Australiens, aimons les appeler &#8211; pour mon partenaire et moi.</span></p>
<h2>07h01 – 08h30</h2>
<p><span style="font-weight: 400">Un chaos complet s&#8217;ensuit alors que nous emballons les boîtes à lunch et les sacs à dos et demandons aux enfants un million de fois de s&#8217;habiller et de mettre leurs chaussures jusqu&#8217;à ce que nous franchissions enfin la porte pour nous rendre à l&#8217;école maternelle/scolaire.  C&#8217;est à cinq minutes à pied pour nous en haut d&#8217;une colline jusqu&#8217;à l&#8217;école primaire de mon fils.  Nous vivons dans un quartier du centre-ville de Sydney mais c&#8217;est toujours calme et verdoyant, et nous passons devant des arbres remplis de loriquets arc-en-ciel et des buissons avec beaucoup de coccinelles que nous nous arrêtons parfois pour compter, si nous avons le temps.  Nous rencontrons souvent nos voisins en montant, c&#8217;est donc un bel événement social.</span></p>
<h2>09h00</h2>
<p><span style="font-weight: 400">L&#8217;ordinateur portable est ouvert et c&#8217;est le jeu.  La matinée est chargée pour l&#8217;équipe basée en Australie.  L&#8217;équipe Cloud de Slack est inhabituelle en ce sens qu&#8217;elle a la moitié de l&#8217;équipe basée en Australie et l&#8217;autre moitié en Amérique du Nord.  Cela fonctionne bien pour notre équipe dans la mesure où nous avons une plus grande couverture de nos systèmes et services sur tous les fuseaux horaires, mais cela peut rendre les réunions synchrones délicates, en particulier pendant l&#8217;été nord-américain lorsque l&#8217;heure d&#8217;été n&#8217;est pas en place.  J&#8217;ai été le premier ingénieur embauché en Australie en dehors de Melbourne, mais depuis la pandémie, l&#8217;équipe s&#8217;est un peu plus dispersée dans tout le pays.  Nos coéquipiers en Amérique du Nord sont basés partout au Canada et aux États-Unis.  Au départ, je ne savais pas que Slack était présent en Australie, et quand je l&#8217;ai découvert, j&#8217;étais vraiment ravi de postuler pour ce poste.  Il n&#8217;y a pas beaucoup de grandes entreprises technologiques avec des présences d&#8217;ingénierie en Australie, donc travailler dans cette équipe chez Slack est une expérience vraiment unique.</span></p>
<p><span style="font-weight: 400">Le temps de chevauchement que nous obtenons les uns avec les autres n&#8217;est que de quelques heures, nous essayons donc de le faire compter.  Aujourd&#8217;hui, il y a une réunion hebdomadaire Cloud Infra où tout le monde dans nos trois équipes Cloud (Foundations, VM et Conteneurs) se synchronise et passe en revue tous les incidents de la semaine dernière, parle de toute nouvelle pertinente ou des changements de production à venir dont tout le monde devrait être conscient, et juste généralement rattraper les choses.  C&#8217;est une bonne occasion d&#8217;entendre ce qui se passe dans les deux autres équipes (je fais partie de l&#8217;équipe VM) et toutes les nouvelles à l&#8217;échelle de l&#8217;entreprise que j&#8217;ai pu manquer.</span></p>
<h2>10:00 DU MATIN</h2>
<p><span style="font-weight: 400">La réunion du matin étant terminée, j&#8217;essaie maintenant de rattraper mon retard sur les canaux de mon projet dans Slack.  Je peux attester que notre équipe est vraiment douée pour la communication asynchrone &#8211; comme nous devrions travailler pour Slack &#8211; il est donc facile de suivre ce qui s&#8217;est passé pendant ma nuit (journée nord-américaine) en lisant les messages non lus dans le canal.  Je vérifierai également mes @-mentions et répondrai à tout ce qui nécessite mon attention.</span></p>
<p><span style="font-weight: 400">Il est maintenant temps de poser des questions et d&#8217;avoir l&#8217;une de ces conversations synchrones dont j&#8217;ai besoin avant que l&#8217;Amérique du Nord ne termine sa journée, alors je m&#8217;assure de donner la priorité à ce type de travail.</span></p>
<h2>11H30 DU MATIN</h2>
<p><span style="font-weight: 400">Ouf, il est temps de souffler.  Le rush du matin est terminé et maintenant je peux passer au codage du temps de flux.  Je travaille sur un nouveau projet écrit en Go qui démarre nos instances AWS EC2 au moment du provisionnement.  C&#8217;est un projet vraiment amusant à travailler.  J&#8217;adore écrire Go et notre équipe fait du bon travail pour s&#8217;assurer qu&#8217;il s&#8217;agit d&#8217;une base de code propre et idiomatique avec de nombreux tests.  C&#8217;était l&#8217;un des défauts du système que celui-ci remplace, qu&#8217;il n&#8217;a pas été très bien testé et que tout le monde se sentait un peu nerveux à l&#8217;idée de faire des changements.  C&#8217;est agréable de mettre les écouteurs et de rester coincé dans du code.</span></p>
<h2>13h00</h2>
<p><span style="font-weight: 400">Oh oups, je suppose que je devrais manger.  Il est temps de déjeuner&nbsp;!  Mon endroit préféré fait cette salade de vermicelles de tofu avec de la sauce piquante, alors je vais marcher et en prendre et peut-être m&#8217;asseoir dans le parc pour la manger.  Parfois, je fais une petite promenade dans mon quartier comme exercice pendant le déjeuner;  il se trouve sur le port de Sydney, offre donc de jolies vues sur le Harbour Bridge et le CBD, et regorge de belles maisons anciennes.  J&#8217;aime simplement me promener et tout comprendre.</span></p>
<h2>14h00</h2>
<p><span style="font-weight: 400">Retour au travail et plus de temps de codage.  Je vais consulter notre chaîne de revues de code pour tout ce qui nécessite une attention particulière.  Le flux de travail de notre équipe consiste à partager l&#8217;URL d&#8217;une demande d&#8217;extraction dans un canal et à demander une révision.  J&#8217;aime cela car vous n&#8217;avez pas besoin de vous fier à la notification par e-mail de GitHub&nbsp;;  vous pouvez simplement vérifier vos messages non lus dans le canal.  Mes coéquipiers essaient de fournir des commentaires opportuns et utiles sur la révision du code et veillent à fournir leurs commentaires de manière réfléchie.  J&#8217;apprécie cela, car parfois le ton peut être difficile à faire passer correctement dans le texte.</span></p>
<p><span style="font-weight: 400">Je garde beaucoup de notes pendant ma journée de travail : commandes utiles que j&#8217;exécute sur des machines Linux, étapes du flux de travail, tout ce qui me rendra plus efficace à l&#8217;avenir.  J&#8217;écris mes notes dans Markdown dans une application appelée Bear qui se synchronise sur tous mes appareils.</span></p>
<h2>15h00</h2>
<p><span style="font-weight: 400">C&#8217;est l&#8217;heure de la rentrée scolaire et beaucoup de mes coéquipiers ont des familles.  Pendant ce temps, nous lancerons un message dans notre chaîne partagée pour dire que nous faisons une course scolaire.  Travailler pour une équipe et une entreprise qui permettent ce genre de flexibilité est plus que fantastique.  C&#8217;est vraiment agréable de pouvoir simplement se rendre à l&#8217;école de mes enfants, venir le chercher, puis se reconnecter au travail.</span></p>
<h2>15h20</h2>
<p><span style="font-weight: 400">C&#8217;est génial de vivre si près de l&#8217;école car ces petits déplacements ne prennent pas longtemps.  Mon équipe et moi pourrions organiser des réunions ad hoc pour discuter de tout problème technique ou de toute question architecturale que nous avons lors de la création de ce nouveau service dans Go.  Les caucus rendent les rencontres rapides vraiment sans friction, et nous les utilisons beaucoup dans notre équipe.</span></p>
<p><span style="font-weight: 400">J&#8217;ai en fait quelques changements Terraform à faire maintenant.  C&#8217;est l&#8217;une des choses que je préfère dans mon travail au sein de l&#8217;équipe Cloud&nbsp;: la variété.  Je peux passer de l&#8217;écriture de code Go à la résolution de problèmes AWS IAM, en passant par la création de clusters Kubernetes, le tout en une journée.</span></p>
<h2>17h30</h2>
<p><span style="font-weight: 400">J&#8217;emballe les choses maintenant.  Je m&#8217;assure de poster tous les messages dont j&#8217;ai besoin pour mes coéquipiers nord-américains, afin qu&#8217;ils les voient pour leur matinée.  C&#8217;est vraiment important pour que le flux de nos projets avance bien.  Je pense que notre équipe fait du bon travail dans ce domaine, et bien sûr Slack est le meilleur outil pour ce genre de choses&nbsp;!  A la fin de ma journée j&#8217;écrirai un petit résumé quotidien de ce que j&#8217;ai fait et mes coéquipiers aussi ;  c&#8217;est un bon moyen de voir sur quoi les gens travaillent.</span></p>
<h2>18h00</h2>
<p><span style="font-weight: 400">Du temps en famille!  Il est maintenant temps de traîner avec mes enfants.  Ils passent par des phases de ce qu&#8217;ils font, mais pour le moment, nous apprenons tous à jouer à un jeu de société appelé Catan Junior.  C&#8217;est encore un peu trop vieux pour eux, et les plus petits s&#8217;ennuient à mi-parcours et sont plus soucieux d&#8217;empiler les cartes que de jouer, mais c&#8217;est une belle façon de passer du temps ensemble.  Nous allons jouer à ce jeu et peut-être faire un puzzle.  Ensuite, les enfants joueront ensemble pendant que nous organisons un dîner.</span></p>
<h2>19h30</h2>
<p><span style="font-weight: 400">L&#8217;heure du coucher pour les enfants.  Nous parlons généralement de ce qu&#8217;étaient notre «bonne chose du jour» et «mauvaise chose du jour».  C&#8217;est une belle routine à laquelle nous nous sommes habitués et une bonne façon d&#8217;avoir un peu de temps 1: 1 avec chaque enfant avant qu&#8217;il ne s&#8217;endorme.</span></p>
<h2>20h00</h2>
<p><span style="font-weight: 400">Si je sens que j&#8217;ai l&#8217;énergie, je pourrais utiliser ma soirée pour faire de la couture.  Coudre des vêtements est un passe-temps que j&#8217;ai depuis environ trois ans maintenant.  Je trouve que c&#8217;est un exutoire créatif vraiment sympa et c&#8217;est marrant d&#8217;avoir un vêtement à porter à la fin !  Je travaille sur un projet plus complexe en ce moment, un blazer.  Je vais lire les instructions du patron et coudre.</span></p>
<h2>22H00</h2>
<p><span style="font-weight: 400">OK, je devrais aller me coucher maintenant et essayer de me détendre.  Je peux lire une partie de mon livre ou regarder Tik Tok <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></p>
<h2>À propos de Georgi</h2>
<p><span style="font-weight: 400">Salut, c&#8217;est Georgi ici et je suis ingénieur cloud senior chez Slack.  Je travaille au sein de l&#8217;équipe Cloud depuis environ 1,5 ans maintenant et j&#8217;ai une longue expérience de travail en tant qu&#8217;ingénieur backend sur divers systèmes distribués.  L&#8217;ironie de ce billet de blog est que la semaine dernière, je viens d&#8217;être transféré de Sydney en Australie à New York, aux États-Unis&nbsp;!  Ce qui est merveilleux, c&#8217;est que je fais toujours partie de la même équipe Cloud.  Notre présence mondiale est vraiment l&#8217;une des meilleures choses à propos du travail à la fois chez Slack et dans l&#8217;équipe Cloud &#8211; c&#8217;est assez génial de voir comment je peux voyager si loin à travers le monde tout en continuant à travailler sur les mêmes projets et avec les mêmes coéquipiers&nbsp;!  Ne manquez pas un article de blog Day in the Life de NYC bientôt <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></p>
<h2><b>La vie à Slack</b></h2>
<p><span style="font-weight: 400">Dans notre série &#8220;Une journée dans la vie&#8221;, nous entendons des ingénieurs Slack dans différents bureaux et spécialisations pour en savoir plus sur ce à quoi ressemble une journée typique.  Nous avons déjà entendu un</span> <span style="font-weight: 400">Ingénieur fondations frontend</span><span style="font-weight: 400">un</span> <span style="font-weight: 400">Ingénieur produit mobile</span><span style="font-weight: 400">un</span> <span style="font-weight: 400">Ingénieur produit back-end</span><span style="font-weight: 400">un</span> <span style="font-weight: 400">Ingénieur produit front-end</span><span style="font-weight: 400">et un</span> <span style="font-weight: 400">Ingénieur Backend Foundation</span><span style="font-weight: 400">.</span></p>
<p class="hiring">
<p>				Nous recrutons des ingénieurs cloud aux États-Unis et en Australie.  Si vous avez aimé cette publication Day in the Life, venez travailler avec nous !				<a href="https://slack.com/careers/" class="" target="_blank" data-clog-click="" data-clog-trigger="trigger=" data-clog-ui-element="" data-clog-ui-component="" rel="noopener">Appliquer maintenant</a></p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Société de développement de logiciels personnalisés MobiDev</title>
		<link>https://z-upload.fr/societe-de-developpement-de-logiciels-personnalises-mobidev-3/</link>
		
		<dc:creator><![CDATA[Jos]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 13:43:17 +0000</pubDate>
				<category><![CDATA[Développement]]></category>
		<guid isPermaLink="false">https://z-upload.fr/2022/11/06/societe-de-developpement-de-logiciels-personnalises-mobidev-3/</guid>

					<description><![CDATA[CONTACTS Bureau américain &#8211; MobiDev Corporation 3855 Holcomb Bridge Road. Suite 300, Norcross, Géorgie 30092, États-Unis Bureau au Royaume-Uni &#8211; MobiDev International Ltd 311, rue Shoreham, Sheffield, Yorkshire du Sud S24FA, Angleterre Centres de R&#38;D &#8211; Lodz (Pologne), Chernivtsi (Ukraine) Appelez-nous : +1 888 380 0276 Mail : contact@mobidev.biz]]></description>
										<content:encoded><![CDATA[<div>
<p class="title">CONTACTS</p>
<p>                                    <strong>Bureau américain &#8211; MobiDev Corporation</strong></p>
<p>3855 Holcomb Bridge Road.  Suite 300,<br />
Norcross, Géorgie 30092, États-Unis<br />
<strong>Bureau au Royaume-Uni &#8211; MobiDev International Ltd</strong></p>
<p>311, rue Shoreham,<br />
Sheffield, Yorkshire du Sud S24FA, Angleterre<br />
<strong>Centres de R&amp;D &#8211; Lodz (Pologne), Chernivtsi (Ukraine)</strong><br />
<strong><br />
<span class="phone">Appelez-nous : +1 888 380 0276</span></strong></p>
<p><strong>                                                                            <span class="email">Mail : contact@mobidev.biz</span></p>
<p></strong><strong>                                </strong></p>
</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
