Power Automate Flow: copy folder when one of its files is updated

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’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:

  1. Create a SharePoint List called “File Processing” with two fields:
    • A lookup field called “File” that is based on our source Document Library – make sure to select the option “Enforce unique values”;
    • A Date and Time field called “LastModified”.
  2. Create a Power Automate Flow that is manually triggered – we’ll call it with “Run a Child”: this one is only used to do the copy of the folder from source to destination
  3. Create a Power Automate Flow that triggers when a file is created or modified (properties only):
    1. When we confirm the file updates happened in the correct folder, then we add an entry in the “File Processing” list with the file ID and the file Modified date;
    2. Terminate the flow.
  4. Create a Power Automate Flow that triggers when an item is created or modified in the “File Process” list:
    1. Add a “Delay” of 5 minutes;
    2. Add the action “Get file properties” from our source document library using the file ID from the item;
    3. Check with a condition if the field “LastModified” is greater or equal to the Modified date of the file:
      • If yes, then use the action “Get items” on the “File Processing” 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 “File Processing” whatever there is other items or not;
      • If no, then update the field “LastModified” of the current item using the Modified date of the file.

This solution permits to only trigger the copy process when there is no more files update in the folder.

Note: if we nee to monitor different folders in the source library, we can add a lookup column in “File Process” 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.

Power Automate Flow: force a file deletion and force a file replacement

To force a file to be deleted in a SharePoint Document Library, using a Power Automate Flow, we can call the action “Send an HTTP Request to SharePoint“, with the below:

  • Method: POST
  • Uri: _api/web/Lists/GetByTitle(‘Document Library Name’)/GetItemById(@{variables(‘ItemID’)})/recycle
  • Headers: Prefer: bypass-shared-lock

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 “Send an HTTP Request to SharePoint“, with the below:

  • Method: POST
  • Uri: _api/web/GetFolderByServerRelativeUrl(‘/sites/SiteCollectionName/SubWebSiteName/’)/Files/add(url=’DestinationFileName.csv’,overwrite=true)
  • Headers: Accept: application/json;odata=nometadata and Content-Type: application/json;odata=nometadata
  • Body: whatever body/content you want

Set People Picker field in a SharePoint List Item using Microsoft Graph

When we want to use MS Graph to add an item into a SharePoint List that contains a People Picker, then here what needs to be done:

  1. Retrieve the Site ID for the root site collection, using https://graph.microsoft.com/v1.0/sites/[CORP].sharepoint.com:/sites/MySiteCollection
  2. Retrieve the Site ID for the target end website, using https://graph.microsoft.com/v1.0/sites/[CORP].sharepoint.com:/sites/MySiteCollection/MyParentSiteWeb/MyTargetWebsite/
  3. Use the user’s email address to retrieve the SharePoint User ID of that person from the User Information List, using https://graph.microsoft.com/v1.0/sites/[ROOT_SITE_ID]/lists/User%20Information%20List/items?expand=fields&filter=fields/EMail%20eq%20'[ENCODED_EMAIL]'&top=1" – the email must be encoded to be passed in an URL
  4. If the user doesn’t exist in this SharePoint yet, then you have to use the REST API call to https://[CORP].sharepoint.com/sites/MySiteCollection/MyParentSiteWeb/MyTargetWebsite/_api/web/ensureUser with the payload {"logonName":"user_email@corp.com"} – you should get the User ID this time
  5. Then we need to get the List ID of where we want to add the item, using https://graph.microsoft.com/v1.0/sites/[TARGET_SIDE_ID]/lists/[LIST_NAME_ENCODED]
  6. Finally, we can add the item using https://graph.microsoft.com/v1.0/sites/[TARGET_SIDE_ID]/lists/[TARGET_LIST_ID]/items with a specific value depending if it’s a multi-selection people picker field or not – let’s say the internal name for my field is “Requestor_x0020_Name”, then I have to append “LookupId” to this name:
    • for a single selection field, the payload contains:
      {"Requestor_x0020_NameLookupId": "[USER_ID_FOUND_WITH_GRAPH]"}
    • for a multi-selection field we have to pass the odata type, and put the User ID into an array, then the payload contains:
      {
      "Requestor_x0020_NamesLookupId@odata.type":"Collection(Edm.String)",
      "Requestor_x0020_NamesLookupId": [ "[USER_ID_FOUND_WITH_GRAPH]" ]
      }

Égypte : croisière sur le Nil

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’est pas forcément nécessaire. Par contre les toilettes sont payantes : elles coûtent 20 livres, et c’est là qu’on a le plus utilisé l’argent local (possibilité de payer en euros avec genre 50 centimes ou 1 €). On peut éviter les pourboires, mais si vous dites facilement “oui”, prévoyez beaucoup d’argent liquide car vous serez TRÈS sollicités…
  • Un coca (pour les touristes) coûtent environ 3 ou 4€, soit 200 ou 300 livres. Lorsque ce n’est pas un attrape-touristes, le prix est plutôt de 50 livres (1€)
  • Les égyptiens ne sont pas gentils par bonté d’âme, mais ils cherchent uniquement à vous soutirer de l’argent. Toutes les personnes que vous croiserez vous prendront pour une “vache à lait” et vous réclameront de l’argent pour un tout ou un rien… Il ne faut donc rien accepter de leur part, même si ça semble être un acte de gentillesse !
  • On peut se balader en short et t-shirt sans problèmes, que ce soit dans les rues ou dans les temples.
  • 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)
  • Prendre une casquette, une gourde (pour conserver l’eau au frais pendant les visites), et un éventail pour supporter la chaleur.
  • La traversée sur le bateau peut parfois être bruyante (entre les matelots qui manœuvrent, les bruits des moteurs, ou autre), donc des bouchons d’oreilles peuvent être utiles. Par contre on trouve des rideaux aux fenêtres pour dormir dans “le noir”.
  • D’après notre guide, la meilleure période pour visiter l’Égypte est début décembre.
  • Comme souvent, la climatisation est poussée à fond dans les aéroports, donc prévoir veste et écharpe si vous devez patienter là bas !

Pour la croisière sur le Nul, on a plusieurs sortes de bateaux qui naviguent :

  • Les “petits” : 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.
  • Les “moyens” : 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’assurer que le bateau ne dépasse pas les 30 ou 40 voyageurs.
  • Les “gros” : ceux-ci peuvent transporter plus de 100 personnes. On les voit passer avec un gros nuage de gasoil qui s’échappe par l’arrière et inonde les ponts supérieurs. On se retrouve à plusieurs cars pour partir visiter les sites. Expérience non recommandée.

Notre séjour

  • Jour 1 – Arrivée avec prise en charge dès la sortie de l’avion. Nous avons été conduits à notre hôtel (Barcelo Cairo Pyramids). 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 “chaotique” et pauvre, et on ne se voyait pas sortir seuls dans les rues…
  • Jour 2 (matin) – Ce fut la visite des pyramides, avec un départ à 6h du matin. Des bus nous transportent sur les différents points d’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’une quinzaine de minutes, et les bêtes ne sont pas vraiment bien traitées… Il est possible d’entrer dans certaines pyramides (selon le tarif payé à l’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’occasion, et tant que vous êtes sur le site, allez vers le 9 Pyramids Lounge, 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 “musée du papyrus” où on nous montre comment sont faits les papyrus, mais le but est surtout de nous vendre des tableaux en papyrus !
  • Jour 2 (après-midi) – notre guide nous a emmené dans un restaurant pour “étrangers”. Pas très intéressant. Après avoir payé notre repas en euros, nous avions quartier libre : nous avons commandé un Uber (l’appli est bien pratique là bas) pour nous rendre au (nouveau) Grand Musée Égyptien qui est magnifique ! Les tickets peuvent être achetés sur place. On y trouve aussi des consignes gratuites pour laisser bagages, perches et autres.
  • Jour 2 (soir) – nous ne l’avons pas fait, mais nos compagnons de voyage ont diné au Rootfop 7000 et la vue sur les pyramides au moment du coucher du soleil était apparemment extraordinaire.
  • Jour 3 – levé à 3h du matin pour partir à l’aéroport avec un vol en direction de Luxor. Arrivée au bateau, puis visite du temple de Karnak et du temple d’Amon : 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…
  • Jour 4 – levé aux aurores pour aller dans la vallée des rois (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 & Mérenptah : le billet ne permet de visiter que 3 tombes, 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’accès aux tombeaux n’est pas du tout problématique car ce sont de larges couloirs aux murs entièrement décorés de hiéroglyphes multicouleurs.
    À noter que ce jour-là, d’autres personnes sont parties à 4h du matin pour aller faire de la montgolfière : l’intérêt principal est qu’on vole avec une dizaine d’autres ballons, mais il y a beaucoup de monde et l’endroit n’est pas fou-fou pour cette expérience à mon avis.
    Nous avons également visité le temple funéraire de la reine Hatchepsout qui est assez impressionnant.
    Enfin nous sommes allés dans l’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)…
  • Jour 5 – Notre bateau s’est arrêté à Edfou afin de visiter le magnifique temple d’Horus. Puis le soir, nous avons fait un stop sur une petite île au milieu du Nil afin d’y diner au barbecue. Ce fut également l’occasion de se baigner dans le fleuve : il a fallu pas mal insister auprès du capitaine, mais on ne regrette pas cette expérience.
  • Jour 6 – Nous arrivons au bout de la portion navigable du Nil, au pied du barrage d’Assouan. Nous avons visite le temple de Sobek et Haroëris à Kom Ombo (pas extraodinaire), puis le magnifique temple d’Isis à Philae, sur son bout d’île ! Petit tour au barrage : intéressant d’en connaître l’histoire, mais pas grand chose à voir. Et pour finir, un tour de felouque (sympa pour faire passer le temps).
  • Jour 7 – levé dans la nuit pour se rendre aux extraordinaires temples d’Abou Simbel ! La route est longue (3h30 au milieu du désert), mais le lieu est spectaculaire.

On considère que le voyage a été bien complet. L’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.

How to pass a parameter from the URL to a SharePoint Form (2025)

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 I deployed:

  1. Create a Power Automate Flow that will replace the default value of the field with a defined value
  2. Create a Power App to intercept the parameter from the URL, to trigger the above flow, and to redirect the user to the form
  3. The user will see the defined value in the field because we use the default value
  4. A few seconds later, the flow will change back the default value to blank

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).

1) The Power Automate Flow

The flow is called by a Power App with a string parameter.

Then we do an HTTP call to SharePoint with the below details:

  • Method: PATCH
  • Uri: _api/web/lists/GetByTitle(‘SHAREPOINT LIST NAME’)/Fields/GetByInternalNameOrTitle(‘FIELD_ID’)
  • Headers: “Accept: application/json;odata=nometadata”, “Content-Type: application/json;odata=nometadata”, and “IF-MATCH: *”
  • Body: we use a JSON {"DefaultValue": "VALUE PROVIDED BY APP"}

By default value, I mean this information (legacy SharePoint interface):

Once the default value of the field has been updated, we respond back to the Power App.

We add a 15-second delay.

And finally, we do another HTTP call to SharePoint, with the same info, except for the body that becomes {"DefaultValue":""} to reset the default value.

2) The Power App

Instead of giving the direct link to the form to the user, we’ll give them a link to the Power App. The URL must contains the param value (e.g. “&Title=Code_123456”).

The App can have a short text (e.g. “click the below button to get to the survey”) with a button “Go to the form”.

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.

To do so, for OnSelect on the button:

// 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", "&"
    )
);

// call the Power Automate Flow
'PowerApps–SetURLParamasDefaultValue'.Run(titleParam);

// then redirect to the form
Launch(urlToForm, {}, LaunchTarget.Replace);

3) Let’s the magic happen

When the user clicks on the button:

  • the flow runs,
  • the flow changes the default value using the provided param,
  • the flow says to the app to proceed,
  • the app redirects the user to the form,
  • the form shows up with the field that already contains the provided value
  • 15 seconds later (the time for the form to load), the flow resets the default value

Mise à jour d’un serveur Kimsufi (OVH) depuis Debian 11 (Bullseye) vers Debian 12 (Bookworm)

Cette mise à jour est similaire à ce qui a pu être fait précédemment.

Je vais essayer d’expliquer brièvement les étapes à suivre.

  1. D’abord s’assurer de la version actuelle de Debian avec la commande suivante :
    lsb_release -a
  2. On vérifie les problèmes liés à la mise à jour.
  3. Il est recommandé d’utiliser le programme /usr/bin/script pour enregistrer une transcription de la session de mise à niveau. Ainsi, quand un problème survient, on a un enregistrement de ce qui s’est passé. Pour démarrer un enregistrement, taper :
    script -t 2>~/upgrade-debian.time -a ~/upgrade-debian.script
  4. On va effectuer une mise à jour des paquets avec apt-get update && apt-get upgrade
  5. On va sauvegarder les données :
    mkdir /root/svg_special; cp -R /var/lib/dpkg /root/svg_special/; cp /var/lib/apt/extended_states /root/svg_special/; dpkg --get-selections "*" > /root/svg_special/dpkg_get_selection; cp -R /etc /root/svg_special/etc
  6. Si vous utilisez MariaDB, il peut être bien de faire une sauvegarde complète des bases de données :
    mysqldump -u root -p --all-databases > /root/svg_special/backup-bdd.sql
  7. Ensuite il est conseillé d’utiliser screen pour pouvoir se reconnecter (avec screen -r) à en cas de déconnexion :
    screen
  8. Le processus de mise à niveau décrit sur le site de Debian a été conçu pour des mises à niveau des systèmes « purs » sans paquet provenant d’autres sources. Pour une meilleure fiabilité du processus de mise à niveau, vous pourriez vouloir supprimer ces paquets tiers du système avant de commencer la mise à niveau :
    aptitude search '~i(!~ODebian)'
  9. On peut éventuellement purger les vieux paquets obsolètes. Pour cela on va d’abord les lister, puis on peut les purger si tout semble bon:
    aptitude search '~o'
    aptitude purge '~o'
  10. On peut lancer la commande dpkg --audit pour s’assurer que tout est bon avant la migration. On peut également taper dpkg --get-selections "*" | more et vérifier qu’aucun paquet n’est en on hold
  11. Maintenant il faut remplacer tous les “bullseye” de /etc/apt/sources.list par des “bookworm”.
    On pourra par exemple utiliser la commande suivante :

    sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list

    Si vous utilisez le dépôt “non-free” de Debian 11 (ouvrez le fichier /etc/apt/sources.list pour voir si vous avez des lignes qui contiennent le mot-clé “non-free”), alors il y a une modification supplémentaire à effectuer : il faut ajouter “non-free-firmware” à la suite du mot-clé “non-free”.
    Par exemple, la ligne deb http://security.debian.org/debian-security bookworm-security main contrib non-free deviendra deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
    On pourra par exemple utiliser la commande suivante :

    sed -i 's/non-free/non-free non-free-firmware/g' /etc/apt/sources.list

    On vérifiera aussi les fichiers qui se trouvent dans /etc/apt/sources.list.d afin d’y effectuer les mêmes modifications.

  12. On passe aux choses sérieuses, en commençant par mettre à jour les listes des paquets :
    apt-get update
  13. On va vérifier qu’on a la place suffisante (un message explicite apparait sinon) :
    apt -o APT::Get::Trivial-Only=true full-upgrade
  14. On va maintenant faire une mise à jour minimale :
    apt-get upgrade
  15. Et à partir de là le système va vous questionner… en général choisir l’option par défaut si vous ne savez pas quoi répondre
  16. Puis on continue avec
    apt full-upgrade

Cette dernière étape va durer un certain temps. Une fois terminé, vous pouvez redémarrer le serveur pour s’assurer que tout va bien.

PHP

Il est bien de vérifier que la version actuelle de PHP est correctement utilisée par Apache et qu’elle correspond à ce qu’on veut. Pour cela on vérifie la version avec:

php -v

Ensuite on regarde les versions de PHP disponibles dans les modules d’Apache :

ls -l /etc/apache2/mods-available/php*

Et on regarde celle activée :

ls -l /etc/apache2/mods-enabled/php*

On regarde également dans le dossier des modules pour vérifier quelle version on a :

ls -l /etc/apache2/modules/libphp*

Si la version souhaitée est manquante dans les modules, alors on l’installe, par exemple pour la 8.4 :

apt-get install php8.4 php8.4-mysql

On s’assure ensuite de bien activer la bonne version, par exemple en passant de la v7.4 à v8.4 :

a2dismod php7.4
a2enmod php8.4

Et on redémarre Apache :

systemctl restart apache2

MariaDB

Cela peut être l’occasion de mettre à jour MariaDB. Si vous aviez un fichier /etc/apt/sources.list.d/mariadb.list, vous pouvez le supprimer et le remplacer par le fichier mariadb.sources comme indiqué dans la documentation de MariaDB.

Puis, comme indiqué dans la doc :

apt-get update
apt-get install mariadb-server

Pour finir

Une fois les erreurs corrigées, on va nettoyer tous les paquets avec :

apt-get autoremove

Note : pour arrêter screen on fait CTRL + A puis k.

Quoi faire en Thaïlande (Bangkok, Chiang Mai et Koh Yao Yoi) ?

Voici un retour d’expérience suite à notre séjour en janvier 2025.

À savoir

  • La carte bancaire est peu acceptée là bas, il faudra donc prévoir du cash.
  • Prévoir des chaussures faciles à enlever/mettre car on doit se déchausser dans tous les temples !
  • Concernant les tenues dans les temples, il est en général accepté que les hommes soient en short et éventuellement débardeur (mais t-shirt recommandé), par contre les femmes devront avoir un pantalon et couvrir leurs épaules. La seule exception qu’on ait rencontré est le Grand Palais de Bangkok où les hommes doivent aussi porter un pantalon.
  • Pour les déplacements, l’application Grab (pour Android ou iOS) remplace Uber et vous permet de prendre facilement des VTC sans vous faire arnaquer ni devoir négocier.

Bangkok

  • Traversée du fleuve : des bateaux-bus assurent plusieurs arrêts le long de la rivière – vous pouvez par exemple prendre le bateau à Phra Arthit et vous arrêter au Sathorn Pier. Vous prenez les tickets directement sur place en indiquant votre destination – les trajets sont plutôt rapides (entre 15 et 45 minutes).
  • Le rooftop de la Tour MahaNakhon : allez-y au moment du coucher du soleil pour profiter d’une vue incroyable sur la ville. On y retrouve un sol en verre (il faut prendre des chaussons pour y aller et les photos sont interdites sur le sol en lui-même mais on peut vous prendre en photo depuis l’extérieur de la zone délimitée). Au rez de chaussée on y trouve aussi des restaurants et des animations en réalité virtuelle – prévoir une à deux heures de visite.
  • Les temples que nous avons aimés : le Grand Palais (mais énormément de monde donc prévoir une visite tôt le matin) et le Wat Arun (bien qu’il soit le temple du lever, pas de nécessiter de s’y rendre tôt le matin – il faut bien explorer les alentours pour ne pas louper les différentes dépendances), et le Wat Pho avec son bouddha allongé – prévoir une à deux heures par temple
  • Temples que nous n’avons pas pu faire : Wat Khuin Chan (on l’a vu depuis la rivière et ça avait l’air joli) et le Temple du Dragon (vu sur Internet)
  • Expédition à Ayutthaya : l’ancienne capitale n’est plus que ruines, mais on y découvre quelques temples sympas, dont celui avec la tête de bouddha (le Wat Mahathat). Nous avons utilisé GetYourGuide pour organiser une journée là bas avec un petit groupe et repas du midi – prévoir une journée de visite depuis Bangkok.

Chiang Mai

  • Le Silver Temple ne figure pas sur les guides, alors qu’il s’agit d’un des plus beaux temples ! Sûrement qu’il n’est pas mentionné car il est interdit aux femmes de pénétrer dans ce petit temple : elles pourront cependant entrer dans le sanctuaire et faire le tour du temple pour admirer les très nombreuses gravures – prévoir une trentaine de minutes sur place
  • Mae Kha Canal n’est pas non plus dans les guides : il s’agit d’une petit canal le long duquel plusieurs échoppes d’inspiration nippones se sont installées. La balade est à faire de nuit pour profiter des beaux éclairages et pour déguster quelques mets japonais – prévoir une heure, si vous y mangez
  • Le temple Wat Lok Moli, et le Wat Rajamontean qui se trouve juste en face, valent le détour ! Nous les avons trouvé différents des autres temples que l’on peut voir dans la région – prévoir une grosse demi-heure
  • Sur GetYourGuide on peut trouver des expéditions de quelques heures pour visiter le temple Wat Pha Lat (très beau car plongé au milieu de la nature) ainsi que le temple Wat Phrathat Doi Suthep (lieu hautement spirituelle avec son immense escalier et sa vue panoramique sur la région) ; notre pack comprenait un arrêt à la cascade de Huay Keaw : un lieu charmant mais pas exceptionnel – prévoir une grosse demi-journée pour l’expédition
  • Si vous cherchez un lieu plus authentique que le Night Bazaar, alors visitez le Warorot Market en journée : des tonnes de stands de nourriture et autres bricoles pour les locaux. Possibilité de grignoter quelques plats sur place – prévoir 45 minutes si vous trainez un peu
  • Pour les visites, il y a bien sûr les classiques comme Wat Phra Singh et Wat Chedi Luang qui sont à voir – prévoir 2 heures pour la visite des deux
  • Si vous n’êtes pas loin du temple Wat Chiang Man, arrêtez-y vous quelques minutes : il est paisible et agréable – prévoir moins de 30 minutes
  • Pour finir, vous avez quelques bars/restaurants au bord du fleuve qui sont agréables le soir, avec toutes leurs guirlandes, comme le River View Bar.

Baie de Phang Nga (Province de Phuket)

Nous avons séjourné dans le Santhiya Koh Yao Yai Resort : un hôtel absolument magique, mais que je ne recommanderais pas car l’île de Koh Yao Yai ne propose pas grand chose à voir… Si vous partez en mode “farniente” et que votre but est de traîner au bord de la piscine/mer toute la journée, alors vous y serez sûrement tranquilles, mais si vous souhaitez visiter les nombreuses îles de la baie, ou explorer les environs, ce n’est pas l’idéal.
Sans l’avoir faite, l’île jumelle (Koh Yao Noi) semble être plus animée.

L’unique journée sortie que nous avons faite est pour aller jusqu’à Hong Island (Ko Hong) qui possède un observatoire à 360 degrés. Un endroit sublime – de là notre bateau nous a déposé dans plusieurs plages/ilots où nous avons pu admirer des singes, chauves-souris, oiseaux, et poissons en tout genre.

AndroidManifest.xml from ADB

It’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. “com.netflix.ninja” is the package name for Netflix).

This command will return many information similar to what the AndroidManifest.xml can provide.

Power FX: Dynamically access an object property with a variable

I’m kind of new with Power Apps, and it’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 & JSONFormat.IgnoreUnsupportedTypes)) },
  Concat(
    ForAll(
      ColumnArray As ColumnName,
      ColumnName.Value & "=>" & Column( tempData, ColumnName.Value ) & "<br>"
    ),
    Value
  )
)

I’m transforming my record ThisItem to an UntypedObject to make it work with Column(), using JSON and by removing the problematic properties (thanks to JSONFormat.IgnoreBinaryData & JSONFormat.IgnoreUnsupportedTypes).

Then I iterate my array (a.k.a ColumnArray) that contains the property I need, and I use Column( tempData, ColumnName.Value ) to extract the column from the record!

My use case: 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 ThisItem based on the collection I defined before.

So, in App screen, I defined my collection like that:

ClearCollect(ColumnArray,["ID", "Title", "Description", "Target_x0020_Start_x0020_Date", "AssignedTo"]);
ClearCollect(UserColumns, ["AssignedTo"]);

Then in my Gallery, I have an HTMLText object with the below content:

"<div style='display:grid;grid-template-columns: 100px 50px 1fr 1fr 100px 150px;gap: 0px;height:65px;max-height:65px;overflo:hidden'><div style='"&cssTdStyle&";display:flex;justify-content:center;'><button type='button'>Edit</button></div>" &
With(
  { tempData: ParseJSON(JSON(ThisItem, JSONFormat.IgnoreBinaryData & JSONFormat.IgnoreUnsupportedTypes)) },
  Concat(
    ForAll(
      ColumnArray As ColumnName,
      "<div style='"&cssTdStyle&"'>" &
  If(
    ColumnName.Value in UserColumns,
    Column( tempData, ColumnName.Value ).DisplayName,
    Column( tempData, ColumnName.Value )
  )
  & "</div>"
    ),
    Value
  )
)
& "</div>"

This way I can make my display dynamic, based on a list of columns (that can be populated using a Power Automate Flow). I’ll have to identify which columns are User type, or similar ones, in order to access to the next property (like .DisplayName).