<?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>Astuce &#8211; Kodono</title>
	<atom:link href="https://blog.kodono.info/wordpress/category/astuce/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.kodono.info/wordpress</link>
	<description>Pour tous les technophiles</description>
	<lastBuildDate>Thu, 10 Sep 2026 07:18:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Make a field ReadOnly in SharePoint List</title>
		<link>https://blog.kodono.info/wordpress/2026/04/28/make-a-field-readonly-in-sharepoint-list/</link>
					<comments>https://blog.kodono.info/wordpress/2026/04/28/make-a-field-readonly-in-sharepoint-list/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Tue, 28 Apr 2026 09:26:32 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2515</guid>

					<description><![CDATA[We can make a field readonly or editable in SharePoint using REST API. I usually use it when I want to update a bunch of SharePoint List Items without changing their Modified date and Editor details. Below is an example to make &#8220;Editor&#8221; readonly again (you&#8217;ll first need to get the Digest Token): fetch(`${siteUrl}/_api/web/lists/getByTitle('${listName}')/fields/getbyinternalnameortitle('Editor')`, { [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>We can make a field readonly or editable in SharePoint using REST API. I usually use it when I want to update a bunch of SharePoint List Items without changing their Modified date and Editor details. Below is an example to make &#8220;Editor&#8221; readonly again (you&#8217;ll first need to get the Digest Token):</p>
<pre class="brush:javascript">
fetch(`${siteUrl}/_api/web/lists/getByTitle('${listName}')/fields/getbyinternalnameortitle('Editor')`, {
    method: "POST",
    headers: {
      "Accept": "application/json;odata=verbose",
      "Content-Type": "application/json;odata=verbose",
      "X-HTTP-Method": "MERGE",
      "IF-MATCH": "*",
      "X-RequestDigest": requestDigest
    },
    body: JSON.stringify({
      "__metadata": { "type": "SP.FieldUser" },
      "ReadOnlyField": true
    })
  });
</pre>
<p>This method works even if the list has more than 5,000 items.</p>
<p>To verify if a field is readonly or not, we can simply use the endpoint <code>`${siteUrl}/_api/web/lists/getByTitle('${listName}')/fields/getbyinternalnameortitle('Editor')?$select=ReadOnlyField`</code></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2026/04/28/make-a-field-readonly-in-sharepoint-list/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Issues with the Chrome extension &#8220;Microsoft Single Sign On&#8221;</title>
		<link>https://blog.kodono.info/wordpress/2026/04/13/issues-with-the-chrome-extension-microsoft-single-sign-on/</link>
					<comments>https://blog.kodono.info/wordpress/2026/04/13/issues-with-the-chrome-extension-microsoft-single-sign-on/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 06:56:11 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2502</guid>

					<description><![CDATA[When you use Chrome on a corporate network, you need an extension called &#8220;Microsoft Single Sign On&#8221; to be correctly authenticated with the Microsoft 365 websites (like SharePoint, …). Recently the extension failed multitimes and I was not able to connect to my Microsoft work account anymore using Chrome. I had to clear cookies, restart [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>When you use Chrome on a corporate network, you need an extension called &#8220;Microsoft Single Sign On&#8221; to be correctly authenticated with the Microsoft 365 websites (like SharePoint, …).</p>
<p>Recently the extension failed multitimes and I was not able to connect to my Microsoft work account anymore using Chrome. I had to clear cookies, restart the computer, etc.</p>
<p>By searching on reddit, I found it&#8217;s now possible to get ride of the extension because Chrome can natively handle this type of connection. To proceed, you need to edit the Windows Registry (<code>Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome</code>) to add the REG_DWORD (<code>DWORD (32-bit) Value</code>) called &#8220;<strong>CloudAPAuthEnabled</strong>&#8221; and put the value <strong>1</strong>, as explained in the <a href="https://chromeenterprise.google/policies/cloud-ap-auth-enabled/">Chrome documentation</a>.</p>
<p>It&#8217;s been a couple of weeks I&#8217;m using it, and no more issues!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2026/04/13/issues-with-the-chrome-extension-microsoft-single-sign-on/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Power Automate Flow: copy folder when one of its files is updated</title>
		<link>https://blog.kodono.info/wordpress/2026/02/09/power-automate-flow-copy-folder-when-one-of-its-files-is-updated/</link>
					<comments>https://blog.kodono.info/wordpress/2026/02/09/power-automate-flow-copy-folder-when-one-of-its-files-is-updated/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 09 Feb 2026 15:10:00 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2482</guid>

					<description><![CDATA[I had the scenario where when files are updated in a specific folder of a SharePoint Documents Library, then the folder should be copied to another document library. Because we don&#8217;t want the copy process to trigger for ever changes (like if we bulk upload files, or if someone is doing changes in live in [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I had the scenario where when files are updated in a specific folder of a SharePoint Documents Library, then the folder should be copied to another document library.</p>
<p>Because we don&#8217;t want the copy process to trigger for ever changes (like if we bulk upload files, or if someone is doing changes in live in a file), so here is my solution:</p>
<ol>
<li>Create a SharePoint List called &#8220;File Processing&#8221; with two fields:
<ul>
<li>A lookup field called &#8220;File&#8221; that is based on our source Document Library – make sure to select the option <b>&#8220;Enforce unique values&#8221;</b>;</li>
<li>A Date and Time field called &#8220;LastModified&#8221;.</li>
</ul>
</li>
<li>Create a Power Automate Flow that is manually triggered – we&#8217;ll call it with &#8220;Run a Child&#8221;: this one is only used to do the copy of the folder from source to destination</li>
<li>Create a Power Automate Flow that triggers when a file is created or modified (properties only):
<ol>
<li>When we confirm the file updates happened in the correct folder, then we add an entry in the &#8220;File Processing&#8221; list with the file ID and the file Modified date;</li>
<li>Terminate the flow.</li>
</ol>
</li>
<li>Create a Power Automate Flow that triggers when an item is created or modified in the &#8220;File Process&#8221; list:
<ol>
<li>Add a <b>&#8220;Delay&#8221;</b> of 5 minutes;</li>
<li>Add the action <b>&#8220;Get file properties&#8221;</b> from our source document library using the file ID from the item;</li>
<li>Check with a condition if the field &#8220;LastModified&#8221; is greater or equal to the Modified date of the file:
<ul>
<li>If <strong>yes</strong>, then use the action <b>&#8220;Get items&#8221;</b> on the &#8220;File Processing&#8221; list to see if we have any other items in the list: if no other items, run the child process to make the copy – and, finally, delete the current item in &#8220;File Processing&#8221; whatever there is other items or not;</li>
<li>If <strong>no</strong>, then update the field &#8220;LastModified&#8221; of the current item using the Modified date of the file.</li>
</ul>
</li>
</ol>
</li>
</ol>
<p>This solution permits to only trigger the copy process when there is no more files update in the folder.</p>
<p><b>Note:</b> if we nee to monitor different folders in the source library, we can add a lookup column in &#8220;File Process&#8221; that contains the folder ID, and when checking if there is no other items for the folder, we just add a condition based on the folder ID.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2026/02/09/power-automate-flow-copy-folder-when-one-of-its-files-is-updated/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SharePoint REST API to copy a file from one site to another one</title>
		<link>https://blog.kodono.info/wordpress/2026/02/03/sharepoint-rest-api-to-copy-a-file-from-one-site-to-another-one/</link>
					<comments>https://blog.kodono.info/wordpress/2026/02/03/sharepoint-rest-api-to-copy-a-file-from-one-site-to-another-one/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Tue, 03 Feb 2026 16:31:54 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2473</guid>

					<description><![CDATA[There is a good explanation in this Gist, and make sure to read my comment also!]]></description>
										<content:encoded><![CDATA[<p>There is a good explanation in <a href="https://gist.github.com/zplume/21248c3a8a5f840a366722442cf9ee97">this Gist</a>, and make sure to read <a href="https://gist.github.com/zplume/21248c3a8a5f840a366722442cf9ee97?permalink_comment_id=5968375#gistcomment-5968375">my comment</a> also!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2026/02/03/sharepoint-rest-api-to-copy-a-file-from-one-site-to-another-one/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Power Automate Flow: force a file deletion and force a file replacement</title>
		<link>https://blog.kodono.info/wordpress/2026/02/03/power-automate-flow-force-a-file-deletion-and-replacement/</link>
					<comments>https://blog.kodono.info/wordpress/2026/02/03/power-automate-flow-force-a-file-deletion-and-replacement/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Tue, 03 Feb 2026 10:14:00 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2468</guid>

					<description><![CDATA[To force a file to be deleted in a SharePoint Document Library, using a Power Automate Flow, we can call the action &#8220;Send an HTTP Request to SharePoint&#8220;, with the below: Method: POST Uri: _api/web/Lists/GetByTitle(&#8216;Document Library Name&#8217;)/GetItemById(@{variables(&#8216;ItemID&#8217;)})/recycle Headers: Prefer: bypass-shared-lock To force a file to be replaced with new content in a SharePoint Document Library, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>To force a file to be deleted in a SharePoint Document Library, using a Power Automate Flow, we can call the action &#8220;<strong>Send an HTTP Request to SharePoint</strong>&#8220;, with the below:</p>
<ul>
<li>Method: <strong>POST</strong></li>
<li>Uri: <strong>_api/web/Lists/GetByTitle(&#8216;Document Library Name&#8217;)/GetItemById(@{variables(&#8216;ItemID&#8217;)})/recycle</strong></li>
<li>Headers: <strong>Prefer: bypass-shared-lock</strong></li>
</ul>
<p>To force a file to be replaced with new content in a SharePoint Document Library, using a Power Automate Flow, we can call the action &#8220;<strong>Send an HTTP Request to SharePoint</strong>&#8220;, with the below:</p>
<ul>
<li>Method: <strong>POST</strong></li>
<li>Uri: <strong>_api/web/GetFolderByServerRelativeUrl(&#8216;/sites/SiteCollectionName/SubWebSiteName/&#8217;)/Files/add(url=&#8217;DestinationFileName.csv&#8217;,overwrite=true)</strong></li>
<li>Headers: <strong>Accept: application/json;odata=nometadata</strong> and <strong>Content-Type: application/json;odata=nometadata</strong></li>
<li>Body: <em>whatever body/content you want</em></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2026/02/03/power-automate-flow-force-a-file-deletion-and-replacement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Égypte : croisière sur le Nil</title>
		<link>https://blog.kodono.info/wordpress/2025/10/12/egypte-croisiere-sur-le-nil/</link>
					<comments>https://blog.kodono.info/wordpress/2025/10/12/egypte-croisiere-sur-le-nil/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sun, 12 Oct 2025 15:39:18 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Français]]></category>
		<category><![CDATA[Voyage]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2426</guid>

					<description><![CDATA[Nous avons pris, via Voyage Privé, un séjour all inclusive en Égypte, avec croisière sur le Nil. Bons à savoir Les euros sont acceptés de partout ! Le dollar américain également. Vous pouvez bien sûr retirer des livres égyptiennes, mais ce n&#8217;est pas forcément nécessaire. Par contre les toilettes sont payantes : elles coûtent 20 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nous avons pris, via Voyage Privé, un séjour all inclusive en Égypte, avec croisière sur le Nil.</p>
<h2>Bons à savoir</h2>
<ul>
<li><strong>Les euros sont acceptés de partout !</strong> Le dollar américain également. Vous pouvez bien sûr retirer des livres égyptiennes, mais ce n&#8217;est pas forcément nécessaire. Par contre les toilettes sont payantes : elles coûtent 20 livres, et c&#8217;est là qu&#8217;on a le plus utilisé l&#8217;argent local (possibilité de payer en euros avec genre 50 centimes ou 1 €). On peut éviter les pourboires, mais si vous dites facilement &#8220;oui&#8221;, prévoyez beaucoup d&#8217;argent liquide car vous serez TRÈS sollicités…</li>
<li>Un coca (pour les touristes) coûtent environ 3 ou 4€, soit 200 ou 300 livres. Lorsque ce n&#8217;est pas un attrape-touristes, le prix est plutôt de 50 livres (1€)</li>
<li>Les égyptiens ne sont pas gentils par bonté d&#8217;âme, mais ils cherchent uniquement à vous soutirer de l&#8217;argent. Toutes les personnes que vous croiserez vous <strong>prendront pour une &#8220;vache à lait&#8221;</strong> et vous réclameront de l&#8217;argent pour un tout ou un rien&#8230; Il ne faut donc rien accepter de leur part, même si ça semble être un acte de gentillesse !</li>
<li>On peut se balader en <strong>short et t-shirt sans problèmes</strong>, que ce soit dans les rues ou dans les temples.</li>
<li>On se lève (très) tôt tout le long du séjour… Il fait également très chaud (~40°C début septembre)</li>
<li>Prendre une <strong>casquette</strong>, une <strong>gourde</strong> (pour conserver l&#8217;eau au frais pendant les visites), et un <strong>éventail</strong> pour supporter la chaleur.</li>
<li>La traversée sur le bateau peut parfois être bruyante (entre les matelots qui manœuvrent, les bruits des moteurs, ou autre), donc des <strong>bouchons d&#8217;oreilles</strong> peuvent être utiles. Par contre on trouve des rideaux aux fenêtres pour dormir dans &#8220;le noir&#8221;.</li>
<li>D&#8217;après notre guide, <strong>la meilleure période pour visiter l&#8217;Égypte est début décembre</strong>.</li>
<li>Comme souvent, la climatisation est poussée à fond dans les aéroports, donc <strong>prévoir veste et écharpe</strong> si vous devez patienter là bas !</li>
</ul>
<p>Pour la croisière sur le Nul, on a plusieurs sortes de bateaux qui naviguent :</p>
<ul>
<li>Les &#8220;petits&#8221; : nous avions choisi cette option, avec seulement 6 cabines à bord (donc 12 personnes) – prestations luxueuses avec un personnel de bord aux petits soins. Nous étions 6 francophones, donc les sorties se faisaient entre nous seulement avec un guide dédié et présent toute la semaine. Idéal pour voyager dans de bonnes conditions.</li>
<li>Les &#8220;moyens&#8221; : plus imposants, ils restent à taille humaine et proposent plus de prestations, comme une piscine à bord. Cela peut être le bon choix, mais il faut s&#8217;assurer que le bateau ne dépasse pas les 30 ou 40 voyageurs.</li>
<li>Les &#8220;gros&#8221; : ceux-ci peuvent transporter plus de 100 personnes. On les voit passer avec un gros nuage de gasoil qui s&#8217;échappe par l&#8217;arrière et inonde les ponts supérieurs. On se retrouve à plusieurs cars pour partir visiter les sites. Expérience non recommandée.</li>
</ul>
<h2>Notre séjour</h2>
<ul>
<li><strong>Jour 1</strong> – Arrivée avec prise en charge dès la sortie de l&#8217;avion. Nous avons été conduits à notre hôtel (<a href="https://maps.app.goo.gl/FHRV6KHzKJvHe8W68">Barcelo Cairo Pyramids</a>). Un hôtel pas fou-fou, mais le rooftop offrait une vue pas trop mauvaise des pyramides, même si un peu lointaine. Il y avait une piscine. Par contre, Le Caire est une ville assez &#8220;chaotique&#8221; et pauvre, et on ne se voyait pas sortir seuls dans les rues&#8230;</li>
<li><strong>Jour 2 (matin)</strong> – Ce fut la visite des pyramides, avec un départ à 6h du matin. Des bus nous transportent sur les différents points d&#8217;intérêt du site des pyramides. Sur place on peut faire une balade de dromadaire pour 25€ (tarif très cher), ou balade en calèche (non recommandée) : mais cela ne dure qu&#8217;une quinzaine de minutes, et les bêtes ne sont pas vraiment bien traitées… Il est possible d&#8217;entrer dans certaines pyramides (selon le tarif payé à l&#8217;entrée) : il y fait très chaud et humide, à déconseiller aux claustrophobes ! On termine la visite par le sphinx. Si vous en avez l&#8217;occasion, et tant que vous êtes sur le site, allez vers le <a href="https://maps.app.goo.gl/mKi1aM7eszaSKjRW9">9 Pyramids Lounge</a>, et baladez vous dans les environs pour prendre de belles prises de vue des pyramides. Notre guide (très mauvais) nous a ensuite conduit dans un &#8220;musée du papyrus&#8221; où on nous montre comment sont faits les papyrus, mais le but est surtout de nous vendre des tableaux en papyrus !</li>
<li><strong>Jour 2 (après-midi)</strong> – notre guide nous a emmené dans un restaurant pour &#8220;étrangers&#8221;. Pas très intéressant. Après avoir payé notre repas en euros, nous avions quartier libre : nous avons <strong>commandé un Uber</strong> (l&#8217;appli est bien pratique là bas) pour nous rendre au (nouveau) <a href="https://maps.app.goo.gl/RSxF4gKhGrhrVoHg9">Grand Musée Égyptien</a> qui est magnifique ! Les tickets peuvent être achetés sur place. On y trouve aussi des consignes gratuites pour laisser bagages, perches et autres.</li>
<li><strong>Jour 2 (soir)</strong> – nous ne l&#8217;avons pas fait, mais nos compagnons de voyage ont diné au <a href="https://maps.app.goo.gl/tSfNcYEccpybzC2SA">Rootfop 7000</a> et la vue sur les pyramides au moment du coucher du soleil était apparemment extraordinaire.</li>
<li><strong>Jour 3</strong> – levé à 3h du matin pour partir à l&#8217;aéroport avec un vol en direction de Luxor. Arrivée au bateau, puis visite du <a href="https://maps.app.goo.gl/inF5yV9d3QE5F2H78">temple de Karnak</a> et du <a href="https://maps.app.goo.gl/AFjnsZuLxWMgBFES7">temple d&#8217;Amon</a> : tous les deux sont magnifiques ! Il parait que visiter Karnak de nuit est une très belle expérience grâce aux éclairages qui subliment les lieux…</li>
<li><strong>Jour 4</strong> – levé aux aurores pour aller dans la <a href="https://maps.app.goo.gl/GQmarFzwqQMNiARN7">vallée des rois</a> (63 tombes réunies au même endroit, en plein désert de rocs). Nous avons exploré les tombes de Ramsès I, Ramsès IX &#038; Mérenptah : le billet ne permet de <strong>visiter que 3 tombes</strong>, il faudra donc faire confiance aux conseils de votre guide. Pour entrer dans la tombe de Toutânkhamon, il faut acheter une option supplémentaire. L&#8217;accès aux tombeaux n&#8217;est pas du tout problématique car ce sont de larges couloirs aux murs entièrement décorés de hiéroglyphes multicouleurs.<br />À noter que ce jour-là, d&#8217;autres personnes sont parties à 4h du matin pour aller faire de la montgolfière : l&#8217;intérêt principal est qu&#8217;on vole avec une dizaine d&#8217;autres ballons, mais il y a beaucoup de monde et l&#8217;endroit n&#8217;est pas fou-fou pour cette expérience à mon avis.<br />Nous avons également visité le <a href="https://maps.app.goo.gl/t42LQqQ4d5rZTGTf7">temple funéraire de la reine Hatchepsout</a> qui est assez impressionnant.<br />Enfin nous sommes allés dans l&#8217;une des nombreuses boutiques d’albâtre, cette pierre récoltée dans les environs. Ils proposent de beaux produits, mais les tarifs sont très chers (25€ pour un petit scarabée)&#8230;</li>
<li><strong>Jour 5</strong> – Notre bateau s&#8217;est arrêté à Edfou afin de visiter le magnifique <a href="https://maps.app.goo.gl/8txBQV9dvvJe2B9YA">temple d&#8217;Horus</a>. Puis le soir, nous avons fait un stop sur une petite île au milieu du Nil afin d&#8217;y diner au barbecue. Ce fut également l&#8217;occasion <strong>de se baigner dans le fleuve</strong> : il a fallu pas mal insister auprès du capitaine, mais on ne regrette pas cette expérience.</li>
<li><strong>Jour 6</strong> – Nous arrivons au bout de la portion navigable du Nil, au pied du barrage d&#8217;Assouan. Nous avons visite le <a href="https://maps.app.goo.gl/jkS93jHMfPX6k2cDA">temple de Sobek et Haroëris</a> à Kom Ombo (pas extraodinaire), puis le magnifique <a href="https://maps.app.goo.gl/rn9pYD3cg6KYVDR4A">temple d&#8217;Isis</a> à Philae, sur son bout d&#8217;île ! Petit tour au barrage : intéressant d&#8217;en connaître l&#8217;histoire, mais pas grand chose à voir. Et pour finir, un tour de felouque (sympa pour faire passer le temps).</li>
<li><strong>Jour 7</strong> – levé dans la nuit pour se rendre aux extraordinaires <a href="https://maps.app.goo.gl/ArDrp6KCMbAYzaZq7">temples d&#8217;Abou Simbel</a> ! La route est longue (3h30 au milieu du désert), mais le lieu est spectaculaire.</li>
</ul>
<p>On considère que le voyage a été bien complet. L&#8217;expérience sur le bateau fut particulièrement agréable, même si avec les 40°C au quotidien, on aurait apprécié une piscine pour se rafraichir.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2025/10/12/egypte-croisiere-sur-le-nil/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to pass a parameter from the URL to a SharePoint Form (2025)</title>
		<link>https://blog.kodono.info/wordpress/2025/09/28/how-to-pass-a-parameter-from-the-url-to-a-sharepoint-form-2025/</link>
					<comments>https://blog.kodono.info/wordpress/2025/09/28/how-to-pass-a-parameter-from-the-url-to-a-sharepoint-form-2025/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sun, 28 Sep 2025 16:33:07 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2439</guid>

					<description><![CDATA[For a few months, there is a new way to display a new form for a SharePoint List, using Microsoft Forms: This kind of form can be useful for intake requests or surveys. But how to pass a parameter in the URL to apply it to a field in the form? Here is the solution [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>For a few months, there is a new way to display a new form for a SharePoint List, using Microsoft Forms:<br />
<a href="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/sp_toolbar.png"><img decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/sp_toolbar-1024x54.png" alt="" width="660" height="35" class="aligncenter size-large wp-image-2440" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/sp_toolbar-1024x54.png 1024w, https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/sp_toolbar-300x16.png 300w, https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/sp_toolbar-768x41.png 768w, https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/sp_toolbar.png 1056w" sizes="(max-width: 660px) 100vw, 660px" /></a></p>
<p>This kind of form can be useful for intake requests or surveys. But how to pass a parameter in the URL to apply it to a field in the form?</p>
<p>Here is the solution I deployed:</p>
<ol>
<li>Create a Power Automate Flow that will replace the default value of the field with a defined value</li>
<li>Create a Power App to intercept the parameter from the URL, to trigger the above flow, and to redirect the user to the form</li>
<li>The user will see the defined value in the field because we use the default value</li>
<li>A few seconds later, the flow will change back the default value to blank</li>
</ol>
<p>It works well. The only downside is that we cannot have more than 1 person clicking on the link at the same time (and within a range of 15 seconds).</p>
<h2>1) The Power Automate Flow</h2>
<p><a href="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/flow.png"><img fetchpriority="high" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/flow.png" alt="" width="327" height="590" class="aligncenter size-full wp-image-2442" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/flow.png 327w, https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/flow-166x300.png 166w" sizes="(max-width: 327px) 100vw, 327px" /></a></p>
<p>The flow is called by a Power App with a string parameter.</p>
<p>Then we do an HTTP call to SharePoint with the below details:</p>
<ul>
<li><strong>Method</strong>: PATCH</li>
<li><strong>Uri</strong>: _api/web/lists/GetByTitle(&#8216;SHAREPOINT LIST NAME&#8217;)/Fields/GetByInternalNameOrTitle(&#8216;FIELD_ID&#8217;)</li>
<li><b>Headers</b>: &#8220;Accept: application/json;odata=nometadata&#8221;, &#8220;Content-Type: application/json;odata=nometadata&#8221;, and &#8220;IF-MATCH: *&#8221;</li>
<li><b>Body</b>: we use a JSON <code>{"DefaultValue": "VALUE PROVIDED BY APP"}</code></li>
</ul>
<p>By default value, I mean this information (legacy SharePoint interface):<br />
<a href="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/defaultvalue.png"><img decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/defaultvalue.png" alt="" width="220" height="74" class="aligncenter size-full wp-image-2447" /></a></p>
<p>Once the default value of the field has been updated, we respond back to the Power App.</p>
<p>We add a 15-second delay.</p>
<p>And finally, we do another HTTP call to SharePoint, with the same info, except for the body that becomes <code>{"DefaultValue":""}</code> to reset the default value.</p>
<h2>2) The Power App</h2>
<p><a href="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/powerapp.png"><img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/powerapp.png" alt="" width="491" height="129" class="aligncenter size-full wp-image-2444" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/powerapp.png 491w, https://blog.kodono.info/wordpress/wp-content/uploads/2025/09/powerapp-300x79.png 300w" sizes="auto, (max-width: 491px) 100vw, 491px" /></a></p>
<p>Instead of giving the direct link to the form to the user, we&#8217;ll give them a link to the Power App. The URL must contains the param value (e.g. &#8220;&#038;Title=Code_123456&#8221;).</p>
<p>The App can have a short text (e.g. &#8220;click the below button to get to the survey&#8221;) with a button &#8220;Go to the form&#8221;.</p>
<p>When the user clicks on the button, it will trigger the flow we created in step 1, and then it will redirect the user to the form.</p>
<p>To do so, for <code>OnSelect</code> on the button:</p>
<pre>
// we can change the aspect of the button to indicate something is happening
Set(buttonLabel, "Loading survey…");
Set(buttonMode, DisplayMode.Disabled);

// decode the "Title" param that is passed in the URL
Set(
  titleParam,
  Substitute(
    Substitute(
        Substitute(
        Substitute(
            Substitute(Param("Title"), "%3A", ":"),
            "%2F", "/"
        ),
        "%3F", "?"
        ),
        "%3D", "="
    ),
    "%26", "&#038;"
    )
);

// call the Power Automate Flow
'PowerApps–SetURLParamasDefaultValue'.Run(titleParam);

// then redirect to the form
Launch(urlToForm, {}, LaunchTarget.Replace);
</pre>
<h2>3) Let&#8217;s the magic happen</h2>
<p>When the user clicks on the button:</p>
<ul>
<li>the flow runs,</li>
<li>the flow changes the default value using the provided param,</li>
<li>the flow says to the app to proceed,</li>
<li>the app redirects the user to the form,</li>
<li>the form shows up with the field that already contains the provided value</li>
<li>15 seconds later (the time for the form to load), the flow resets the default value</li>
<ol>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2025/09/28/how-to-pass-a-parameter-from-the-url-to-a-sharepoint-form-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AndroidManifest.xml from ADB</title>
		<link>https://blog.kodono.info/wordpress/2025/04/27/androidmanifest-xml-from-adb/</link>
					<comments>https://blog.kodono.info/wordpress/2025/04/27/androidmanifest-xml-from-adb/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sun, 27 Apr 2025 14:33:12 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2406</guid>

					<description><![CDATA[It&#8217;s possible to find the AndroidManifest.xml file for an app using its APK (e.g. from APKMirror) and then with the help of a tool like jadx, but we can also connect to the Android device using adb connect, and then we use adb shell dumpsys package PACKAGE_NAME (e.g. &#8220;com.netflix.ninja&#8221; is the package name for Netflix). [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s possible to find the AndroidManifest.xml file for an app using its APK (e.g. from APKMirror) and then with the help of a tool like <a href="https://github.com/skylot/jadx">jadx</a>, but we can also connect to the Android device using <code>adb connect</code>, and then we use <code>adb shell dumpsys package PACKAGE_NAME</code> (e.g. &#8220;com.netflix.ninja&#8221; is the package name for Netflix).</p>
<p>This command will return many information similar to what the AndroidManifest.xml can provide.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2025/04/27/androidmanifest-xml-from-adb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Power FX: Dynamically access an object property with a variable</title>
		<link>https://blog.kodono.info/wordpress/2025/04/03/power-fx-dynamically-access-an-object-propery-with-a-variable/</link>
					<comments>https://blog.kodono.info/wordpress/2025/04/03/power-fx-dynamically-access-an-object-propery-with-a-variable/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 03 Apr 2025 16:31:58 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2390</guid>

					<description><![CDATA[I&#8217;m kind of new with Power Apps, and it&#8217;s been very difficult to find how to access an object property using a variable. In a nutshell, here are to access it: With( { tempData: ParseJSON(JSON(ThisItem, JSONFormat.IgnoreBinaryData &#038; JSONFormat.IgnoreUnsupportedTypes)) }, Concat( ForAll( ColumnArray As ColumnName, ColumnName.Value &#038; "=>" &#038; Column( tempData, ColumnName.Value ) &#038; "&#60;br>" ), [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m kind of new with Power Apps, and it&#8217;s been very difficult to find how to access an object property using a variable.</p>
<p>In a nutshell, here are to access it:</p>
<pre class="brush:R">
With(
  { tempData: ParseJSON(JSON(ThisItem, JSONFormat.IgnoreBinaryData &#038; JSONFormat.IgnoreUnsupportedTypes)) },
  Concat(
    ForAll(
      ColumnArray As ColumnName,
      ColumnName.Value &#038; "=>" &#038; Column( tempData, ColumnName.Value ) &#038; "&lt;br>"
    ),
    Value
  )
)
</pre>
<p>I&#8217;m transforming my record <code>ThisItem</code> to an UntypedObject to make it work with <code>Column()</code>, using <b>JSON</b> and by removing the problematic properties (thanks to <code>JSONFormat.IgnoreBinaryData &#038; JSONFormat.IgnoreUnsupportedTypes</code>).</p>
<p>Then I iterate my array (a.k.a <code>ColumnArray</code>) that contains the property I need, and I use <code>Column( tempData, ColumnName.Value )</code> to extract the column from the record!</p>
<p><strong>My use case</strong>: I defined a collection with a list of columns, then I have a Gallery in which I have an HTMLText component that must display the columns from <code>ThisItem</code> based on the collection I defined before.</p>
<p>So, in <code>App</code> screen, I defined my collection like that:</p>
<pre class="brush:R">
ClearCollect(ColumnArray,["ID", "Title", "Description", "Target_x0020_Start_x0020_Date", "AssignedTo"]);
ClearCollect(UserColumns, ["AssignedTo"]);
</pre>
<p>Then in my Gallery, I have an HTMLText object with the below content:</p>
<pre class="brush:R">
"&lt;div style='display:grid;grid-template-columns: 100px 50px 1fr 1fr 100px 150px;gap: 0px;height:65px;max-height:65px;overflo:hidden'>&lt;div style='"&#038;cssTdStyle&#038;";display:flex;justify-content:center;'>&lt;button type='button'>Edit&lt;/button>&lt;/div>" &#038;
With(
  { tempData: ParseJSON(JSON(ThisItem, JSONFormat.IgnoreBinaryData &#038; JSONFormat.IgnoreUnsupportedTypes)) },
  Concat(
    ForAll(
      ColumnArray As ColumnName,
      "&lt;div style='"&#038;cssTdStyle&#038;"'>" &#038;
  If(
    ColumnName.Value in UserColumns,
    Column( tempData, ColumnName.Value ).DisplayName,
    Column( tempData, ColumnName.Value )
  )
  &#038; "&lt;/div>"
    ),
    Value
  )
)
&#038; "&lt;/div>"
</pre>
<p>This way I can make my display dynamic, based on a list of columns (that can be populated using a Power Automate Flow). I&#8217;ll have to identify which columns are User type, or similar ones, in order to access to the next property (like <b>.DisplayName</b>).</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2025/04/03/power-fx-dynamically-access-an-object-propery-with-a-variable/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recevoir des alertes lors de la diffusion d&#8217;un programme</title>
		<link>https://blog.kodono.info/wordpress/2025/02/23/recevoir-des-alertes-lors-de-la-diffusion-dun-programme/</link>
					<comments>https://blog.kodono.info/wordpress/2025/02/23/recevoir-des-alertes-lors-de-la-diffusion-dun-programme/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sun, 23 Feb 2025 08:35:11 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Divers]]></category>
		<category><![CDATA[Français]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2370</guid>

					<description><![CDATA[Trop souvent je loupe des émissions TV que j&#8217;aime bien (comme &#8220;Qui veut être mon associé ?&#8221;, &#8220;Rendez-vous en terre inconnue&#8221;, …). J&#8217;ai cherché un service sur le Net qui me permettrait de recevoir un email lorsque mon émission préférée était diffusée, mais je n&#8217;ai rien trouvé. J&#8217;ai donc créé https://alerte-tv.kodono.info/ qui permet d&#8217;être tenu [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trop souvent je loupe des émissions TV que j&#8217;aime bien (comme &#8220;Qui veut être mon associé ?&#8221;, &#8220;Rendez-vous en terre inconnue&#8221;, …). J&#8217;ai cherché un service sur le Net qui me permettrait de recevoir un email lorsque mon émission préférée était diffusée, mais je n&#8217;ai rien trouvé.</p>
<p>J&#8217;ai donc créé <a href="https://alerte-tv.kodono.info/">https://alerte-tv.kodono.info/</a> qui permet d&#8217;être tenu au courant lorsqu&#8217;un programme est diffusé à la télévision française.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2025/02/23/recevoir-des-alertes-lors-de-la-diffusion-dun-programme/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Utiliser un VPN sur l&#8217;iPad via un serveur Debian</title>
		<link>https://blog.kodono.info/wordpress/2025/02/08/utiliser-un-vpn-sur-lipad-via-un-serveur-debian/</link>
					<comments>https://blog.kodono.info/wordpress/2025/02/08/utiliser-un-vpn-sur-lipad-via-un-serveur-debian/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sat, 08 Feb 2025 17:42:21 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Français]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2352</guid>

					<description><![CDATA[Je vais expliquer ici comment installer un serveur VPN WireGuard sur Debian et l&#8217;utiliser depuis un iPad. 1. Serveur Debian Sur le serveur, on installe WireGuard avec apt install wireguard -y. 2. Générer la clé privée et publique du serveur Pour cela, on va faire : sudo wg genkey &#124; sudo tee /etc/wireguard/server_private.key sudo cat [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Je vais expliquer ici comment installer un serveur VPN WireGuard sur Debian et l&#8217;utiliser depuis un iPad.</p>
<p><strong>1. Serveur Debian</strong></p>
<p>Sur le serveur, on installe WireGuard avec <code>apt install wireguard -y</code>.</p>
<p><strong>2. Générer la clé privée et publique du serveur</strong></p>
<p>Pour cela, on va faire : </p>
<pre class="brush:bash">
sudo wg genkey | sudo tee /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_private.key | sudo wg pubkey | sudo tee /etc/wireguard/server_public.key
</pre>
<p>On retrouvera nos clés dans les fichiers <code>/etc/wireguard/server_private.key</code> et <code>/etc/wireguard/server_public.key</code></p>
<p><strong>3. Générer la clé privée et publique du client</strong></p>
<p>Sur le serveur Debian, on va générer des clés pour le client :</p>
<pre class="brush:bash">
wg genkey | tee client_private.key
cat client_private.key | wg pubkey | tee client_public.key
</pre>
<p>On retrouvera nos clés dans les fichiers <code>./client_private.key</code> et <code>./client_public.key</code></p>
<p><strong>4. Configuration du serveur</strong></p>
<p>On va entrer la configuration suivante dans le fichier <code>/etc/wireguard/wg0.conf</code> :</p>
<pre>
[Interface]
Address = 10.0.0.1/24
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = PRIVATE_KEY_DU_SERVEUR

[Peer]
PublicKey = PUBLIC_KEY_DU_CLIENT
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 25
</pre>
<p><strong>5. Activer le transfert IP sur le serveur</strong></p>
<p>Éditer le fichier <code>/etc/sysctl.conf</code> afin d&#8217;avoir :</p>
<pre>
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
</pre>
<p>Et on applique les changements avec la commande <code>sudo sysctl -p</code></p>
<p><strong>6. Démarrage de WireGuard</strong></p>
<p>Pour démarrer le serveur VPN on tape <code>sudo systemctl start wg-quick@wg0</code></p>
<p>On peut voir le statut avec la commande <code>sudo systemctl status wg-quick@wg0</code></p>
<p><strong>7. Configuration du client</strong></p>
<p>Sur notre client (ici un iPad), on installe l&#8217;application WireGuard depuis le App Store.</p>
<p>Ensuite, sur notre serveur, on va créer le fichier de configuration <code>client.conf</code> qui sera utilisé par le client, avec le contenu suivant :</p>
<pre>
[Interface]
PrivateKey = PRIVATE_KEY_DU_CLIENT
Address = 10.0.0.2/32
DNS = 8.8.8.8, 8.8.4.4 # on utilise les DNS de Google

[Peer]
PublicKey = PUBLIC_KEY_DU_SERVEUR
Endpoint = mon_serveur.debian.home:51820 # on indique l'IP/hostname de notre serveur VPN
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
</pre>
<p>Afin de transmettre cette configuration à l&#8217;iPad, on peut générer un QR code. Pour cela on installe ce qu&#8217;il faut : <code>sudo apt install qrencode</code>, puis on génère avec <code>qrencode -t ansiutf8 < client.conf</code></p>
<p>Sur l'iPad, on ouvre l'application WireGuard puis on ajoute un client en utilisant le QR Code généré.</p>
<p><strong>8. Vérification</strong></p>
<p>En activant le VPN sur l'iPad, on peut tester si tout fonctionne comme prévu en vérifiant l'adresse IP de l'iPad.<br />
Sur le serveur, on peut utiliser la commande <code>wg show</code> pour voir un peu ce qu'il se passe.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2025/02/08/utiliser-un-vpn-sur-lipad-via-un-serveur-debian/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Remove lazy loading for a custom SPFx webpart</title>
		<link>https://blog.kodono.info/wordpress/2024/12/15/remove-lazy-loading-for-a-custom-spfx-webpart/</link>
					<comments>https://blog.kodono.info/wordpress/2024/12/15/remove-lazy-loading-for-a-custom-spfx-webpart/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sun, 15 Dec 2024 22:09:45 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2344</guid>

					<description><![CDATA[SharePoint Online is doing lazy loading when we hit a page with webparts. If you created a SPFx webpart, and if it&#8217;s not visible right after the page load, then it will only be loaded once the user scrolls to it&#8230; To remove this behavior, and load the webpart as soon as possible, you must [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>SharePoint Online is doing lazy loading when we hit a page with webparts. If you created a SPFx webpart, and if it&#8217;s not visible right after the page load, then it will only be loaded once the user scrolls to it&#8230;</p>
<p>To remove this behavior, and load the webpart as soon as possible, <a href="https://github.com/SharePoint/sp-dev-docs/discussions/7918">you must declare your webpart as a dynamic data source</a>.</p>
<p>Here is the minimal code example (in pure JS, not in TS):</p>
<pre class="brush:javascript">
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
import { DisplayMode } from '@microsoft/sp-core-library';

export default class HtmlViewerWebPart extends BaseClientSideWebPart {
  constructor() {
    super();
    // the below is used by the dynamic data source to avoid lazy loading
    this._sourceId = 'my_webpart';
  }

  onInit() {
    // to avoid lazy loading of the webpart, we register it as a dynamic data source
    // we only need to do it during the Edit of the page
    if (this.isPageInEditMode() &#038;& this.context.dynamicDataSourceManager) {
      this.context.dynamicDataSourceManager.initializeSource(this);
      console.log('Dynamic Data Source initialized to avoid lazy loading.');
    }
    
    return Promise.resolve();
  }

  isPageInEditMode() {
    return this.displayMode === DisplayMode.Edit;
  }

  // we need to declare this method because it's used by the data source to avoid lazy loading
  getPropertyDefinitions() {
    return []
  }

  // we need to declare this method because it's used by the data source to avoid lazy loading
  getPropertyValue(propertyId) {
    return propertyId;
  }
}
</pre>
<p>Then, edit the page, which will trigger the dynamic data source registration, and publish it.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/12/15/remove-lazy-loading-for-a-custom-spfx-webpart/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Determine an element `height` and `width` in CSS only and reuse it within another CSS rule</title>
		<link>https://blog.kodono.info/wordpress/2024/12/13/determine-an-element-height-and-width-in-css-only-and-reuse-it-within-another-css-rule/</link>
					<comments>https://blog.kodono.info/wordpress/2024/12/13/determine-an-element-height-and-width-in-css-only-and-reuse-it-within-another-css-rule/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Fri, 13 Dec 2024 15:44:36 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2333</guid>

					<description><![CDATA[I found this technic on https://frontendmasters.com/blog/how-to-get-the-width-height-of-any-element-in-only-css/ – it only works on modern browsers (mainly Chrome and Edge) Let&#8217;s define the properties: @property --_x { syntax: "&#60;number>"; inherits: true; initial-value: 0; } @property --_y { syntax: "&#60;number>"; inherits: true; initial-value: 0; } @property --w { syntax: "&#60;integer>"; inherits: true; initial-value: 0; } @property --h { syntax: [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I found this technic on <a href="https://frontendmasters.com/blog/how-to-get-the-width-height-of-any-element-in-only-css/">https://frontendmasters.com/blog/how-to-get-the-width-height-of-any-element-in-only-css/</a> – <strong>it only works on modern browsers (mainly Chrome and Edge)</strong></p>
<p>Let&#8217;s define the properties:</p>
<pre class="brush:css">
@property --_x {
  syntax: "&lt;number>";
  inherits: true;
  initial-value: 0; 
}
@property --_y {
  syntax: "&lt;number>";
  inherits: true;
  initial-value: 0; 
}
@property --w {
  syntax: "&lt;integer>";
  inherits: true;
  initial-value: 0; 
}
@property --h {
  syntax: "&lt;integer>";
  inherits: true;
  initial-value: 0; 
}
</pre>
<p>Then, let&#8217;s find an element that is a common parent for both the element where we&#8217;ll calculate the height/width, and the element that will use this height/width, and we apply some CSS:</p>
<pre class="brush:css">
.parent {
  timeline-scope: --cx,--cy;
  --w:calc(1/(1 - var(--_x)));
  --h:calc(1/(1 - var(--_y)));
  animation: x linear,y linear;
  animation-timeline: --cx,--cy !important;
  animation-range: entry 100% exit 100%;
}
</pre>
<p>We finish up with some additional CSS:</p>
<pre class="brush:css">
.get-dimension {
  overflow: hidden;
  position: relative;
}
.get-dimension:before {
  content:"";
  position: absolute;
  left: 0;
  top: 0;
  width: 1px;
  aspect-ratio: 1;
  view-timeline: --cx inline,--cy block;
}
@keyframes x {to{--_x:1}}
@keyframes y {to{--_y:1}}
</pre>
<p>And finally, we can use <code>--w</code> and <code>--h</code> in the other element:</p>
<pre class="brush:css">
.apply-dimension {
  height: calc(var(--h)*1px);
  width: calc(var(--w)*1px);
}
</pre>
<p>Here is a demo:<br />
<p class='codepen'  data-height='500' data-theme-id='1' data-slug-hash='vEByKod' data-default-tab='result' data-animations='run' data-editable='' data-embed-version='2'>

</p>
</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/12/13/determine-an-element-height-and-width-in-css-only-and-reuse-it-within-another-css-rule/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to remove an account / leave an organization in MS Teams?</title>
		<link>https://blog.kodono.info/wordpress/2024/10/11/how-to-remove-an-account-leave-an-organization-in-ms-teams/</link>
					<comments>https://blog.kodono.info/wordpress/2024/10/11/how-to-remove-an-account-leave-an-organization-in-ms-teams/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Fri, 11 Oct 2024 15:44:15 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2330</guid>

					<description><![CDATA[If in the top right corner of MS Teams, when you click on your profile picture, you see other organizations/accounts and you want to delete them: Go to the MS Teams Settings by clicking on the three dots next to your profile picture Go to Accounts and orgs Turn off or leave the org/account that [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>If in the top right corner of MS Teams, when you click on your profile picture, you see other organizations/accounts and you want to delete them:</p>
<ol>
<li>Go to the MS Teams Settings by clicking on the three dots next to your profile picture</li>
<li>Go to <strong>Accounts and orgs</strong></li>
<li>Turn off or leave the org/account that is problematic</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/10/11/how-to-remove-an-account-leave-an-organization-in-ms-teams/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Faire des enregistrements récurrents avec OQEE/FreeTV</title>
		<link>https://blog.kodono.info/wordpress/2024/09/18/faire-des-enregistrements-recurrents-avec-oqee/</link>
					<comments>https://blog.kodono.info/wordpress/2024/09/18/faire-des-enregistrements-recurrents-avec-oqee/#comments</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Wed, 18 Sep 2024 07:36:37 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Français]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2322</guid>

					<description><![CDATA[J&#8217;ai créé un service en ligne qui permet de simplifier les enregistrements avec OQEE/FreeTV : https://eeqo.kodono.info Il vous faudra être connecté au réseau de votre Freebox afin d&#8217;être reconnu. Ensuite, l&#8217;interface est simple à utiliser et vous permet d&#8217;enregistrement plusieurs programmes à la suite d&#8217;un coup, et créer un enregistrement récurrent sur au moins les [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2024/09/logo.png" alt="" width="449" height="199" class="aligncenter size-full wp-image-2325" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2024/09/logo.png 449w, https://blog.kodono.info/wordpress/wp-content/uploads/2024/09/logo-300x133.png 300w" sizes="auto, (max-width: 449px) 100vw, 449px" /></p>
<p>J&#8217;ai créé un service en ligne qui permet de simplifier les enregistrements avec OQEE/FreeTV : <a href="https://eeqo.kodono.info">https://eeqo.kodono.info</a></p>
<p>Il vous faudra être connecté au réseau de votre Freebox afin d&#8217;être reconnu. Ensuite, l&#8217;interface est simple à utiliser et vous permet d&#8217;enregistrement plusieurs programmes à la suite d&#8217;un coup, et créer un enregistrement récurrent sur au moins les prochains 10 jours. Vous pouvez recevoir un email à la fin de la période pour réactiver l&#8217;enregistrement.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/09/18/faire-des-enregistrements-recurrents-avec-oqee/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Manual Installation of ExplorerPatcher</title>
		<link>https://blog.kodono.info/wordpress/2024/03/21/manual-installation-of-explorerpatcher/</link>
					<comments>https://blog.kodono.info/wordpress/2024/03/21/manual-installation-of-explorerpatcher/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 21 Mar 2024 08:59:15 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2288</guid>

					<description><![CDATA[ExplorerPatcher permits to change the behavior of the Windows taskbar. If for some reasons the automatic install doesn&#8217;t work, you can proceed manually: Install it on a computer where the automatic install works On the target computer, download ep_setup.exe from the official website Open a Terminal and extract the files from the setup using the [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://github.com/valinet/ExplorerPatcher">ExplorerPatcher</a> permits to change the behavior of the Windows taskbar. If for some reasons the automatic install doesn&#8217;t work, you can proceed manually:</p>
<ol>
<li>Install it on a computer where the automatic install works</li>
<li>On the target computer, download <code>ep_setup.exe</code> from the official website</li>
<li>Open a Terminal and extract the files from the setup using the command <code>ep_setup.exe /extract</code></li>
<li>Several files have been extracted from the setup</li>
<li>Move all the files to <code>C:\Program Files\ExplorerPatcher</code></li>
<li>From the computer in step 1, transfer the file <code>C:\Windows\dxgi.dll</code> to your other computer</li>
<li>Use a CMD as an Administrator, then kill Windows Explorer, paste the <code>dxgi.dll</code> into <code>C:\Windows</code>, and relaunch Windows Explorer:
<pre class="brush:shell">taskkill /f /im explorer.exe &#038;& copy dxgi.dll C:\Windows\ &#038;& explorer.exe</pre>
</li>
</ol>
<p>To manually <strong>uninstall</strong> it:</p>
<ol>
<li>Open a CMD as an Administrator, then type: <code>taskkill /f /im explorer.exe &#038;& del C:\Windows\dxgi.dll &#038;& rmdir /s /q "C:\Program Files\ExplorerPatcher" &#038;& explorer.exe</code></li>
<li>Open <code>regedit</code> as an Administrator, and delete <code>HKEY_CURRENT_USER\Software\ExplorerPatcher</code>, and search for any other references of <b>ExplorerPatcher</b> to delete</li>
<li>Delete the forlder <code>%APPDATA%\ExplorerPatcher</code></li>
<li>Restart the computer</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/03/21/manual-installation-of-explorerpatcher/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Power Automate returns an error about &#8220;InvokerConnectionOverrideFailed&#8221; and &#8220;header.X-MS-APIM-Tokens&#8221;</title>
		<link>https://blog.kodono.info/wordpress/2024/01/16/power-automate-returns-an-error-about-invokerconnectionoverridefailed-and-header-x-ms-apim-tokens/</link>
					<comments>https://blog.kodono.info/wordpress/2024/01/16/power-automate-returns-an-error-about-invokerconnectionoverridefailed-and-header-x-ms-apim-tokens/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Tue, 16 Jan 2024 14:42:28 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2278</guid>

					<description><![CDATA[While calling a &#8220;Run a Child Flow&#8221; from a Power Automate Flow, you could get an error about &#8220;InvokerConnectionOverrideFailed&#8221; and &#8220;header.X-MS-APIM-Tokens&#8221;. After investigating, to resolve this issue you need to open the &#8220;details&#8221; view of your child flow, and click on the &#8220;Edit&#8221; button from the &#8220;Run only users&#8221; card: Then in the Connections Used [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>While calling a &#8220;Run a Child Flow&#8221; from a Power Automate Flow, you could get an error about &#8220;InvokerConnectionOverrideFailed&#8221; and &#8220;header.X-MS-APIM-Tokens&#8221;.</p>
<p>After investigating, to resolve this issue you need to open the &#8220;details&#8221; view of your child flow, and click on the &#8220;Edit&#8221; button from the <strong>&#8220;Run only users&#8221; card</strong>:<br />
<a href="https://blog.kodono.info/wordpress/wp-content/uploads/2024/01/run_only_users.png"><img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2024/01/run_only_users.png" alt="" width="501" height="423" class="aligncenter size-full wp-image-2279" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2024/01/run_only_users.png 501w, https://blog.kodono.info/wordpress/wp-content/uploads/2024/01/run_only_users-300x253.png 300w" sizes="auto, (max-width: 501px) 100vw, 501px" /></a></p>
<p>Then in the <strong>Connections Used</strong> section, make sure to select <strong>&#8220;Use this connection (your_username@domain.com)&#8221;</strong> instead of the default &#8220;Provided by run-only user&#8221;. It will permit to run this child flow with your rights.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/01/16/power-automate-returns-an-error-about-invokerconnectionoverridefailed-and-header-x-ms-apim-tokens/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Supprimer la commande Ctrl+Alt+Supp pour ouvrir Windows 11</title>
		<link>https://blog.kodono.info/wordpress/2024/01/02/supprimer-la-commande-ctrlaltsupp-pour-ouvrir-windows-11/</link>
					<comments>https://blog.kodono.info/wordpress/2024/01/02/supprimer-la-commande-ctrlaltsupp-pour-ouvrir-windows-11/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Tue, 02 Jan 2024 08:01:34 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Français]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[France]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2275</guid>

					<description><![CDATA[Il suffit de modifier le registre de Windows (regedit), en passant à 1 la variable DisableCad dans ces deux emplacements : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]]></description>
										<content:encoded><![CDATA[<p>Il suffit de modifier le registre de Windows (<code>regedit</code>), en passant à <b>1</b> la variable <b>DisableCad</b> dans ces deux emplacements :</p>
<ul>
<li>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System</li>
<li>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2024/01/02/supprimer-la-commande-ctrlaltsupp-pour-ouvrir-windows-11/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Search and restore an item from a SharePoint Online Recycle Bin</title>
		<link>https://blog.kodono.info/wordpress/2023/11/07/search-and-restore-an-item-from-a-sharepoint-online-recycle-bin/</link>
					<comments>https://blog.kodono.info/wordpress/2023/11/07/search-and-restore-an-item-from-a-sharepoint-online-recycle-bin/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Tue, 07 Nov 2023 11:09:37 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[sharepoint]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2267</guid>

					<description><![CDATA[It might be difficult to search for an item in a SharePoint recycle bin. I was using the end point _api/site/RecycleBin as a Site Collection Administrator, but in some cases it returns an error &#8220;The attempted operation is prohibited because it exceeds the list view threshold.&#8221;. The solution is to use another end point _api/site/getrecyclebinitems [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It might be difficult to search for an item in a SharePoint recycle bin. I was using the end point <code>_api/site/RecycleBin</code> as a <b>Site Collection Administrator</b>, but in some cases it returns an error &#8220;The attempted operation is prohibited because it exceeds the list view threshold.&#8221;.</p>
<p>The solution is to use another end point <code>_api/site/getrecyclebinitems</code> (<a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.sharepoint.client.site.getrecyclebinitems?view=sharepoint-csom">see the documentation</a> for the various parameters):</p>
<pre class="brush:javascript">
fetch("https://tenant.sharepoint.com/sites/YourSite/_api/site/getrecyclebinitems?rowLimit=%2770000%27&#038;itemState=0&#038;orderby=3&#038;isAscending=false", {
  "headers": {
    "accept": "application/json",
    "content-type": "application/json",
    "x-requestdigest": document.querySelector("#__REQUESTDIGEST").value
  },
  "method": "GET",
})
.then(res => res.json())
.then(json => {
  console.log(json.value);
  // it will show an array with an object that contains several interesting properties:
  // AuthorEmail, AuthorName, DeletedByEmail, DeletedDate, DirName, Id, LeafName, Title, …
})
</pre>
<p>You can then filter the result to get what you need, for example if you&#8217;re looking for an item from the list “Projects” that has the ID 1981:</p>
<pre class="brush:javascript">
json.value.filter(item => item.DirName.includes("Lists/Projects") &#038;& item.LeafName === "1981_.000");
</pre>
<p>Then, to restore an item, we need the <code>Id</code> from the previous result. The famous endpoint to restore an item is <code>_api/site/RecycleBin('Id')/restore</code>, however it could also return the error &#8220;The attempted operation is prohibited because it exceeds the list view threshold&#8221;. In that case, we can use this other endpoint <code>_api/site/RecycleBin/RestoreByIds</code>:</p>
<pre class="brush:javascript">
fetch("https://tenant.sharepoint.com/sites/YourSite/_api/site/RecycleBin/RestoreByIds", {
  "headers": {
    "accept": "application/json",
    "content-type": "application/json",
    "x-requestdigest": document.querySelector("#__REQUESTDIGEST").value
  },
  "method": "POST",
  "body":JSON.stringify({
    "ids": [
      "4f855ee7-472b-414a-a482-4317a114c1a2" // Id to restore
    ],
    "bRenameExistingItems": true
  })
})
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2023/11/07/search-and-restore-an-item-from-a-sharepoint-online-recycle-bin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Calculating HMAC SHA-1 in the Browser</title>
		<link>https://blog.kodono.info/wordpress/2023/04/16/calculating-hmac-sha-1-in-the-browser/</link>
					<comments>https://blog.kodono.info/wordpress/2023/04/16/calculating-hmac-sha-1-in-the-browser/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sun, 16 Apr 2023 17:23:55 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2258</guid>

					<description><![CDATA[If you&#8217;re looking for the equivalent of hash_hmac('sha1', 'string', 'secret'); in JavaScript, then here you go: async function hmac_sha1 (str, secret) { // see https://stackoverflow.com/a/47332317/1134119 let enc = new TextEncoder("utf-8"); let key = await window.crypto.subtle.importKey( "raw", // raw format of the key - should be Uint8Array enc.encode(secret), { // algorithm details name: "HMAC", hash: {name: [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>If you&#8217;re looking for the equivalent of <code>hash_hmac('sha1', 'string', 'secret');</code> in JavaScript, then here you go:</p>
<pre class="brush:js">
async function hmac_sha1 (str, secret) {
  // see https://stackoverflow.com/a/47332317/1134119
  let enc = new TextEncoder("utf-8");
  let key = await window.crypto.subtle.importKey(
    "raw", // raw format of the key - should be Uint8Array
    enc.encode(secret),
    { // algorithm details
      name: "HMAC",
      hash: {name: "SHA-1"}
    },
    false, // export = false
    ["sign", "verify"] // what this key can do
  );
  let signature = await window.crypto.subtle.sign(
    "HMAC",
    key,
    enc.encode(str)
  );
  let b = new Uint8Array(signature);
  return Array.prototype.map.call(b, x => x.toString(16).padStart(2, '0')).join("");
}
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2023/04/16/calculating-hmac-sha-1-in-the-browser/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Add a domain to a Let&#8217;s Encrypt certificate</title>
		<link>https://blog.kodono.info/wordpress/2022/07/07/add-a-domain-to-a-lets-encrypt-certificate/</link>
					<comments>https://blog.kodono.info/wordpress/2022/07/07/add-a-domain-to-a-lets-encrypt-certificate/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 07 Jul 2022 08:03:32 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2153</guid>

					<description><![CDATA[For Apache, in the folder sites-available, you need to create your the-new-one.your-domain.com.conf file. Then enable the new site with a2ensite the-new-one.your-domain.com. You can list all domains associated with a certificate: certbot certificates Now we add the SSL using certbot. You need to list all the existing domains and add the new one: certbot --apache --cert-name [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>For Apache, in the folder <code>sites-available</code>, you need to create your <code>the-new-one.your-domain.com.conf</code> file. Then enable the new site with <code>a2ensite the-new-one.your-domain.com</code>.</p>
<p>You can list all domains associated with a certificate:</p>
<pre class="brush:bash">certbot certificates</pre>
<p>Now we add the SSL using <code>certbot</code>. You need to list all the existing domains and add the new one:</p>
<pre class="brush:bash">certbot --apache --cert-name your-domain.com -d first.your-domain.com,second.your-domain.com,third.your-domain.com,the-new-one.your-domain.com</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2022/07/07/add-a-domain-to-a-lets-encrypt-certificate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Get email address from a Azure DevOps &#8220;by&#8221; field in Power Apps Flow</title>
		<link>https://blog.kodono.info/wordpress/2022/05/13/get-email-address-from-a-azure-devops-by-field-in-power-apps-flow/</link>
					<comments>https://blog.kodono.info/wordpress/2022/05/13/get-email-address-from-a-azure-devops-by-field-in-power-apps-flow/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Fri, 13 May 2022 07:59:24 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2146</guid>

					<description><![CDATA[If you need to get an email from an Azure DevOps work item (e.g. from the &#8220;Changed By&#8221; field), it might be tricky in Power Apps Flow because it will return &#8220;John Doe &#60;john@doe.com>&#8221;. To only extract the email from this string, you&#8217;ll have to use the below: first(split(last(split([YOUR_FIELD],''))]]></description>
										<content:encoded><![CDATA[<p>If you need to get an email from an Azure DevOps work item (e.g. from the &#8220;Changed By&#8221; field), it might be tricky in Power Apps Flow because it will return &#8220;John Doe &lt;john@doe.com>&#8221;.</p>
<p>To only extract the email from this string, you&#8217;ll have to use the below:</p>
<pre class="js">first(split(last(split([YOUR_FIELD],'<')),'>'))</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2022/05/13/get-email-address-from-a-azure-devops-by-field-in-power-apps-flow/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Use CTRL and TAB to switch between two tabs in Chrome</title>
		<link>https://blog.kodono.info/wordpress/2022/03/18/use-ctrl-and-tab-to-switch-between-two-tabs-in-chrome/</link>
					<comments>https://blog.kodono.info/wordpress/2022/03/18/use-ctrl-and-tab-to-switch-between-two-tabs-in-chrome/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Fri, 18 Mar 2022 10:38:48 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Navigateur]]></category>
		<category><![CDATA[Niveau débutant]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2142</guid>

					<description><![CDATA[It&#8217;s super handy to be able to switch between two tabs in the web browser… But it&#8217;s tricky to set it up in Chrome! Install AutoControl: Keyboard shortcut, Mouse gesture Install the native component as the extension asks for Add a new action The trigger is LEFT CTRL and TAB The action is Switch to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s super handy to be able to switch between two tabs in the web browser… But it&#8217;s tricky to set it up in Chrome!</p>
<ol>
<li>Install <a href="https://chrome.google.com/webstore/detail/autocontrol-keyboard-shor/lkaihdpfpifdlgoapbfocpmekbokmcfd">AutoControl: Keyboard shortcut, Mouse gesture</a></li>
<li>Install the native component as the extension asks for</li>
<li>Add a new action</li>
<li>The trigger is <code>LEFT CTRL</code> and <code>TAB</code></li>
<li>The action is <b>Switch to previous tab</b></li>
</ol>
<p>It should now work to switch between tabs using <code>LEFT CTRL</code> + <code>TAB</code>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2022/03/18/use-ctrl-and-tab-to-switch-between-two-tabs-in-chrome/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Portable version of NodeJS on Windows</title>
		<link>https://blog.kodono.info/wordpress/2022/01/01/portable-version-of-nodejs-on-windows/</link>
					<comments>https://blog.kodono.info/wordpress/2022/01/01/portable-version-of-nodejs-on-windows/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sat, 01 Jan 2022 20:19:11 +0000</pubDate>
				<category><![CDATA[Application]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2130</guid>

					<description><![CDATA[(This is a corrected version of this blog post) Install Cmder in your desired location. Download nvm-noinstall.zip from the latest release. Extract the contents of nvm-noinstall.zip (i.e.: nvm.exe …) into the bin folder inside of the portable Cmder folder. Navigate to the bin. Create a new file called install_fix.cmd that contains this code. Open a [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>(This is a corrected version of this <a href="https://dev.to/yougotwill/portable-nodejs-without-administrator-access-1elk">blog post</a>)</p>
<ol>
<li>Install <a href="https://cmder.net/">Cmder</a> in your desired location.</li>
<li>Download <code>nvm-noinstall.zip</code> from the <a href="https://github.com/coreybutler/nvm-windows/releases/latest">latest release</a>.</li>
<li>Extract the contents of <code>nvm-noinstall.zip</code> (i.e.: <code>nvm.exe</code> …) into the <code>bin</code> folder inside of the portable Cmder folder.</li>
<li>Navigate to the <code>bin</code>.</li>
<li>Create a new file called <code>install_fix.cmd</code> that contains <a href="https://gist.github.com/Aymkdn/c02b50e7ed98e19add3ce5af0a40ee78">this code</a>.</li>
<li>Open a terminal in the <code>bin</code> folder and type <code>.\install_fix.cmd</code></li>
<li>When asked to enter the path use the full path to your Cmder <code>bin</code> folder.</li>
<li>If it worked, a file called <code>settings.txt</code> has been created in the your Cmder <code>bin</code> folder.</li>
<li>Close the terminal, and reopen it in the <code>bin</code> folder.</li>
<li>Install the version of Node you want, e.g. <code>nvm install latest</code>.</li>
<li>Wait until the installation is completed, then, inside the <code>bin</code> folder, there should be a new folder containing the latest Node version (e.g. <code>v17.3.0</code>).</li>
</ol>
<p>From there, you can use the full path to your Cmder <code>bin</code> + the Node version folder + <code>node.exe</code> to execute something with this version of Node using Powershell, CMD or other terminal.</p>
<p>For example:</p>
<pre class="brush: powershell">
PS D:\experiments\my-stuff\> D:\experiments\nodejs-portable\cmder_mini\bin\v17.3.0\node.exe index.js
</pre>
<p>You could use Cmder with the Node path in the Startup Settings of the app; e.g. <code>set "PATH=D:\experiments\nodejs-portable\cmder_mini\bin\v17.3.0;%PATH%"</code>. This way, in Cmder, when typing <code>node.exe</code> it&#8217;s the portable version that will be used.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2022/01/01/portable-version-of-nodejs-on-windows/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Redirect non-www to www on a PHPBB Forum</title>
		<link>https://blog.kodono.info/wordpress/2021/12/29/redirect-non-www-to-www-on-a-phpbb-forum/</link>
					<comments>https://blog.kodono.info/wordpress/2021/12/29/redirect-non-www-to-www-on-a-phpbb-forum/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Wed, 29 Dec 2021 08:44:46 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2128</guid>

					<description><![CDATA[In the PHPBB directory, edit the file .htaccess and after RewriteRule ^(.*)$ app.php [QSA,L] you can enter: RewriteCond %{HTTPS} off # First rewrite to HTTPS: # Don't put www. here. If it is already there it will be included, if not # the subsequent rule will catch it. RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Now, rewrite [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In the PHPBB directory, edit the file <code>.htaccess</code> and after <code>RewriteRule ^(.*)$ app.php [QSA,L]</code> you can enter:</p>
<pre>
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2021/12/29/redirect-non-www-to-www-on-a-phpbb-forum/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Capacitor Plugin for HTTP requests with self-signed SSL certificates</title>
		<link>https://blog.kodono.info/wordpress/2021/10/30/capacitor-plugin-for-http-requests-with-self-signed-ssl-certificates/</link>
					<comments>https://blog.kodono.info/wordpress/2021/10/30/capacitor-plugin-for-http-requests-with-self-signed-ssl-certificates/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sat, 30 Oct 2021 13:26:01 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2094</guid>

					<description><![CDATA[I&#8217;m using CapacitorJS for easy development with Android. I needed a way to do an HTTPS request to a box that uses self-signed SSL certificate. To accomplish it, I created my own capacitor plugin. See this wiki page for details: https://github.com/Aymkdn/assistant-freebox-cloud/wiki/Capacitor-Plugin-for-HTTP-requests-with-self-signed-SSL-certificates]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m using CapacitorJS for easy development with Android. I needed a way to do an HTTPS request to a box that uses self-signed SSL certificate. To accomplish it, I created my own capacitor plugin.</p>
<p>See this wiki page for details: <a href="https://github.com/Aymkdn/assistant-freebox-cloud/wiki/Capacitor-Plugin-for-HTTP-requests-with-self-signed-SSL-certificates">https://github.com/Aymkdn/assistant-freebox-cloud/wiki/Capacitor-Plugin-for-HTTP-requests-with-self-signed-SSL-certificates</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2021/10/30/capacitor-plugin-for-http-requests-with-self-signed-ssl-certificates/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Enable CORS with IIS</title>
		<link>https://blog.kodono.info/wordpress/2021/10/13/enable-cors-with-iis/</link>
					<comments>https://blog.kodono.info/wordpress/2021/10/13/enable-cors-with-iis/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 12:28:53 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[english]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2090</guid>

					<description><![CDATA[It&#8217;s as easy as editing the web.config file with the below: &#60;?xml version="1.0" encoding="UTF-8"?> &#60;configuration> &#60;system.webServer> &#60;httpProtocol> &#60;customHeaders> &#60;add name="Access-Control-Allow-Origin" value="https://my.site.com" /> &#60;add name="Access-Control-Allow-Headers" value="Authorization,Accept,Content-Type,X-Requested-With" /> &#60;add name="Access-Control-Allow-Credentials" value="true" /> &#60;/customHeaders> &#60;/httpProtocol> &#60;/system.webServer> &#60;/configuration>]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s as easy as editing the <code>web.config</code> file with the below:</p>
<pre class="brush:xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;configuration>
  &lt;system.webServer>
    &lt;httpProtocol>
      &lt;customHeaders>
        &lt;add name="Access-Control-Allow-Origin" value="https://my.site.com" />
        &lt;add name="Access-Control-Allow-Headers" value="Authorization,Accept,Content-Type,X-Requested-With" />
        &lt;add name="Access-Control-Allow-Credentials" value="true" />
      &lt;/customHeaders>
    &lt;/httpProtocol>
  &lt;/system.webServer>
&lt;/configuration>
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2021/10/13/enable-cors-with-iis/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>L&#8217;application Android &#8220;Huawei Health&#8221; (ou &#8220;Santé&#8221; en français) retourne l&#8217;erreur : &#8220;les notifications sont indisponibles&#8221;</title>
		<link>https://blog.kodono.info/wordpress/2021/07/26/lapplication-android-huawei-health-ou-sante-en-francais-retourne-lerreur-les-notifications-sont-indisponibles/</link>
					<comments>https://blog.kodono.info/wordpress/2021/07/26/lapplication-android-huawei-health-ou-sante-en-francais-retourne-lerreur-les-notifications-sont-indisponibles/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 26 Jul 2021 16:22:00 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Français]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2087</guid>

					<description><![CDATA[&#8220;Erreur du système, les notifications sont indisponibles. Veuillez redémarrer votre téléphone. Si le problème persiste, contactez le fabricant de votre appareil.&#8221; J&#8217;ai eu cette erreur sur mon Samsung S20 FE. J&#8217;ai réussi à m&#8217;en sortir ou désinstallant tout puis en réinstallant… Mais je pense que la solution pouvait être autre : dans les Paramètres du [&#8230;]]]></description>
										<content:encoded><![CDATA[<blockquote><p>&#8220;Erreur du système, les notifications sont indisponibles. Veuillez redémarrer votre téléphone. Si le problème persiste, contactez le fabricant de votre appareil.&#8221;</p></blockquote>
<p>J&#8217;ai eu cette erreur sur mon Samsung S20 FE. J&#8217;ai réussi à m&#8217;en sortir ou désinstallant tout puis en réinstallant… Mais je pense que la solution pouvait être autre : dans les <strong>Paramètres</strong> du téléphone, chercher <strong>Accès aux notifications</strong>, puis vérifier que l&#8217;application &#8220;Santé&#8221; est bien cochée !</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2021/07/26/lapplication-android-huawei-health-ou-sante-en-francais-retourne-lerreur-les-notifications-sont-indisponibles/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Problème d&#8217;accès avec C:\Program Files\WindowsApps</title>
		<link>https://blog.kodono.info/wordpress/2021/07/26/probleme-dacces-avec-cprogram-fileswindowsapps/</link>
					<comments>https://blog.kodono.info/wordpress/2021/07/26/probleme-dacces-avec-cprogram-fileswindowsapps/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 26 Jul 2021 07:40:03 +0000</pubDate>
				<category><![CDATA[Application]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Français]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2084</guid>

					<description><![CDATA[J&#8217;utilise d&#8217;habitude le raccourci wt.exe dans la barre de Windows Explorer, mais j&#8217;ai reçu une erreur aujourd&#8217;hui me disant que le fichier n&#8217;existe pas… Après quelques recherches, j&#8217;ai découvert que je n&#8217;ai aucun accès au répertoire C:\Program Files\WindowsApps là où se trouve Windows Terminal. J&#8217;ai réussi à le refaire marcher en lançant un terminal en [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>J&#8217;utilise d&#8217;habitude le raccourci <code>wt.exe</code> dans la barre de Windows Explorer, mais j&#8217;ai reçu une erreur aujourd&#8217;hui me disant que le fichier n&#8217;existe pas…</p>
<p>Après quelques recherches, j&#8217;ai découvert que je n&#8217;ai aucun accès au répertoire <code>C:\Program Files\WindowsApps</code> là où se trouve Windows Terminal.</p>
<p>J&#8217;ai réussi à le refaire marcher en lançant un terminal en mode administrateur puis en exécutant la commande <code>icacls "C:\Program Files\WindowsApps" /reset /t /c /q</code></p>
<p>J&#8217;ai reçu beaucoup de <em>échec de traitement</em>, mais ce fut quand même suffisant !</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2021/07/26/probleme-dacces-avec-cprogram-fileswindowsapps/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Access to Sharepoint Online with Windows Explorer</title>
		<link>https://blog.kodono.info/wordpress/2021/05/06/access-to-sharepoint-online-with-windows-explorer/</link>
					<comments>https://blog.kodono.info/wordpress/2021/05/06/access-to-sharepoint-online-with-windows-explorer/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 06 May 2021 07:21:03 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau débutant]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[sharepoint]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=2071</guid>

					<description><![CDATA[If you want to access your Sharepoint online (https://[tenant].sharepoint.com), you first need to make sure the site is in the Trusted Website in Internet Explorer. Open Internet Explorer, navigate to the website, then open the Internet Options: Add your website to the Trusted Website zone: Next open Windows Explorer and right-click on &#8220;Your PC &#8220;, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>If you want to access your Sharepoint online (https://[tenant].sharepoint.com), you first need to make sure the site is in the Trusted Website in Internet Explorer.<br />
<strong>Open Internet Explorer</strong>, navigate to the website, then open the <strong>Internet Options</strong>:<br />
<img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/internet_options1.png" alt="" width="421" height="354" class="aligncenter size-full wp-image-2072" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/internet_options1.png 421w, https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/internet_options1-300x252.png 300w" sizes="auto, (max-width: 421px) 100vw, 421px" /></p>
<p>Add your website to the <strong>Trusted Website zone</strong>:<br />
<img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/internet_options2.png" alt="" width="482" height="272" class="aligncenter size-large wp-image-2073" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/internet_options2.png 482w, https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/internet_options2-300x169.png 300w" sizes="auto, (max-width: 482px) 100vw, 482px" /></p>
<p>Next open Windows Explorer and <strong>right-click on &#8220;Your PC &#8220;, then select &#8220;Map network drive…&#8221;</strong>:<br />
<img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/network1.png" alt="" width="413" height="330" class="aligncenter size-full wp-image-2074" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/network1.png 413w, https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/network1-300x240.png 300w" sizes="auto, (max-width: 413px) 100vw, 413px" /></p>
<p>You need to use a special path to your website. Let&#8217;s say your website is located at <a href="https://tenant.sharepoint.com/sites/Marketing">https://tenant.sharepoint.com/sites/Marketing</a> then the path to use is:<br />
<b>\\tenant.sharepoint.com@ssl\DavWWWRoot\sites\Marketing\</b></p>
<p>Note the <code>@ssl</code> and <code>DavWWWRoot</code> that are required.</p>
<p>Assign this path to a drive letter:<br />
<img loading="lazy" decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/network2.png" alt="" width="614" height="455" class="aligncenter size-full wp-image-2077" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/network2.png 614w, https://blog.kodono.info/wordpress/wp-content/uploads/2021/05/network2-300x222.png 300w" sizes="auto, (max-width: 614px) 100vw, 614px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2021/05/06/access-to-sharepoint-online-with-windows-explorer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
