--- type: archive source: OneNote PA-Perso periode: 2019-2026 --- # Notes techniques - Import OneNote ## SQL (22 mai 2020) Index clustered : Index ordonné, 1 index par table Plan de formation Bonnes pratiques - : Limiter le nombre de colonnes retournés - idéal - Over Indexing : Ne jamais créer des index pour rien - Duplicate Index : Management - --- ## Linux Ubuntu (25 avril 2024) Formation 1 --- ## WSL (4 novembre 2025) Installation wsl.exe --install Ubuntu-24.04 sudo apt install -y curl git zip unzip sudo apt install php - PHP & extensions indispensables sudo apt update sudo apt install -y php php-cli php-xml php-mbstring php-zip php-curl php-intl php-sqlite3 php-mysql unzip git php -v - Composer composer -V || { cd ~ php -r "copy('https://getcomposer.org/installer','composer-setup.php');" php composer-setup.php sudo mv composer.phar /usr/local/bin/composer composer -V } - Symfony CLI (recommandé) curl -sS https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh | sudo bash sudo apt install -y symfony-cli symfony -v 1) Installer Composer (si besoin) composer -V || { cd ~ php -r "copy('https://getcomposer.org/installer','composer-setup.php');" php composer-setup.php sudo mv composer.phar /usr/local/bin/composer composer -V } 2) Installer les vendors du projet Place-toi à la racine du projet (celle qui contient composer.json) : cd /mnt/d/travail/cockpit/cockpit-api # Si tu as un composer.lock : composer install --no-interaction # S’il n’y a PAS de composer.lock (ou projet tout neuf) : # composer update --no-interaction --- ## EfCore (9 mai 2022) Amorcage des données - Data Seed : https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding set ASPNETCORE_ENVIRONMENT='Development.PA' Update-database 20220818151253_Alerte_V2 Installation du tool global --- ## Dapper (26 janvier 2023) Products/GetProductById I6TM47 (4673.7 ms) Thu, 26 Jan 2023 16:35:30 GMT duration (ms) sql (ms) https://prod.yeswehome.6tm.eu/api/v1.0/products/645a334c-70d4-4d04-8d2d-614f9d0dac44 2.9 0.9 (1) Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 4667.9 4200.9 (10) sql: 89.9 % more columns show trivial Call Type Step Duration (from start) Call Stack Command sql - Open https://prod.yeswehome.6tm.eu/api/v1.0/products/645a334c-70d4-4d04-8d2d-614f9d0dac44 0.2 ms (T+1.5 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader https://prod.yeswehome.6tm.eu/api/v1.0/products/645a334c-70d4-4d04-8d2d-614f9d0dac44 0.5 ms (T+1.7 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECTTOP(1) [c].[Id], [c].[Actif], [c].[AdresseID], [c].[ClientParentID], [c].[DateCreation], [c].[DateLastSynchro], [c].[DateUpdate], [c].[DistributeurID], [c].[FormeJuridique], [c].[IdentifiantExterne], [c].[IsSynchronizationRunning], [c].[Logo], [c].[Nom], [c].[PaysID], [c].[TypesDeStructure] FROM[Clients] AS[c] WHERE[c].[Id] = 2de82684-e644-418f-9385-9c7d574ec15e sql - Close https://prod.yeswehome.6tm.eu/api/v1.0/products/645a334c-70d4-4d04-8d2d-614f9d0dac44 0.2 ms (T+2.4 ms) SingleOrDefault > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4.8 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.6 ms (T+5.1 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECT[t].[Id], [t].[Actif], [t].[AffichageDimensionEpaisseur], [t].[CatalogueID], [t].[ClasseEnergetique], [t].[CodeEAN], [t].[CodeEANDeRemplacement], [t].[CodeEANEquivalent], [t].[CodeTransport], [t].[DateCreation], [t].[DateUpdate], [t].[Description], [t].[Duree], [t].[Hashtags], [t].[IdentifiantExterne], [t].[IsDecline], [t].[Libelle], [t].[MarqueID], [t].[ParentId], [t].[PiecesDetachesCommentaire], [t].[PiecesDetachesDuree], [t].[Points], [t].[PointsDePose], [t].[PointsDeSacem], [t].[PrixConseille], [t].[ReferenceCommande], [t].[ReferenceFabriquant], [t].[ReferenceInterne], [t].[Relation], [t].[Sens], [t].[Statut], [t].[TvaTaux], [t].[TvaTauxReduit], [t].[UniteDeVente], [p0].[Id], [p0].[Actif], [p0].[AffichageDimensionEpaisseur], [p0].[CatalogueID], [p0].[ClasseEnergetique], [p0].[CodeEAN], [p0].[CodeEANDeRemplacement], [p0].[CodeEANEquivalent], [p0].[CodeTransport], [p0].[DateCreation], [p0].[DateUpdate], [p0].[Description], [p0].[Duree], [p0].[Hashtags], [p0].[IdentifiantExterne], [p0].[IsDecline], [p0].[Libelle], [p0].[MarqueID], [p0].[ParentId], [p0].[PiecesDetachesCommentaire], [p0].[PiecesDetachesDuree], [p0].[Points], [p0].[PointsDePose], [p0].[PointsDeSacem], [p0].[PrixConseille], [p0].[ReferenceCommande], [p0].[ReferenceFabriquant], [p0].[ReferenceInterne], [p0].[Relation], [p0].[Sens], [p0].[Statut], [p0].[TvaTaux], [p0].[TvaTauxReduit], [p0].[UniteDeVente] FROM( SELECTTOP(1) [p].[Id], [p].[Actif], [p].[AffichageDimensionEpaisseur], [p].[CatalogueID], [p].[ClasseEnergetique], [p].[CodeEAN], [p].[CodeEANDeRemplacement], [p].[CodeEANEquivalent], [p].[CodeTransport], [p].[DateCreation], [p].[DateUpdate], [p].[Description], [p].[Duree], [p].[Hashtags], [p].[IdentifiantExterne], [p].[IsDecline], [p].[Libelle], [p].[MarqueID], [p].[ParentId], [p].[PiecesDetachesCommentaire], [p].[PiecesDetachesDuree], [p].[Points], [p].[PointsDePose], [p].[PointsDeSacem], [p].[PrixConseille], [p].[ReferenceCommande], [p].[ReferenceFabriquant], [p].[ReferenceInterne], [p].[Relation], [p].[Sens], [p].[Statut], [p].[TvaTaux], [p].[TvaTauxReduit], [p].[UniteDeVente] FROM[Produits] AS[p] WHERE[p].[Id] = 645a334c-70d4-4d04-8d2d-614f9d0dac44 ) AS[t] LEFTJOIN[Produits] AS[p0] ON[t].[Id] = [p0].[ParentId] ORDERBY[t].[Id], [p0].[Id] 232.70 ms Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync — 232.70 ms sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+238.4 ms) SingleOrDefault > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.3 ms (T+240.1 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 189.4 ms (T+240.5 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECT[t0].[Libelle], [t0].[CaracteristiquesDistributeurID] AS[Id], [t0].[Valeur], [t0].[Ordre] FROM( SELECTDISTINCT[c].[Libelle], [p1].[CaracteristiquesDistributeurID], [p1].[Valeur], [c].[Ordre] FROM[Produits] AS[p] INNERJOIN[Produits] AS[p0] ON[p].[Id] = [p0].[ParentId] INNERJOIN[ProduitCaracteristiqueDistributeurs] AS[p1] ON[p0].[Id] = [p1].[ProduitID] INNERJOIN[CaracteristiqueDistributeurs] AS[c] ON[p1].[CaracteristiquesDistributeurID] = [c].[Id] WHERE(([p].[Id] = 645a334c-70d4-4d04-8d2d-614f9d0dac44) AND([p].[Actif] = CAST(1ASbit))) ANDEXISTS( SELECT1FROM[Produits] AS[p2] INNERJOIN( SELECT[p3].[ProduitID], [p3].[CaracteristiquesDistributeurID], [p3].[DateCreation], [p3].[DateUpdate], [p3].[Id], [p3].[IsDeclinable], [p3].[Valeur] FROM[ProduitCaracteristiqueDistributeurs] AS[p3] WHERE[p3].[IsDeclinable] = CAST(1ASbit) ) AS[t] ON[p2].[Id] = [t].[ProduitID] WHERE([p2].[Id] = 645a334c-70d4-4d04-8d2d-614f9d0dac44) AND([t].[CaracteristiquesDistributeurID] = [p1].[CaracteristiquesDistributeurID])) ) AS[t0] ORDERBY[t0].[Ordre] sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+430.4 ms) GetDeclinableCaract > ToList > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() 37.20 ms Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync — 37.20 ms sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+468.0 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() 4.30 ms Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync — 4.30 ms sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 383.8 ms (T+472.7 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECT[t].[Id], [t].[Actif], [t].[AffichageDimensionEpaisseur], [t].[CatalogueID], [t].[ClasseEnergetique], [t].[CodeEAN], [t].[CodeEANDeRemplacement], [t].[CodeEANEquivalent], [t].[CodeTransport], [t].[DateCreation], [t].[DateUpdate], [t].[Description], [t].[Duree], [t].[Hashtags], [t].[IdentifiantExterne], [t].[IsDecline], [t].[Libelle], [t].[MarqueID], [t].[ParentId], [t].[PiecesDetachesCommentaire], [t].[PiecesDetachesDuree], [t].[Points], [t].[PointsDePose], [t].[PointsDeSacem], [t].[PrixConseille], [t].[ReferenceCommande], [t].[ReferenceFabriquant], [t].[ReferenceInterne], [t].[Relation], [t].[Sens], [t].[Statut], [t].[TvaTaux], [t].[TvaTauxReduit], [t].[UniteDeVente], [t].[Id0], [p2].[ProduitID], [p2].[CaracteristiquesDistributeurID], [p2].[DateCreation], [p2].[DateUpdate], [p2].[Id], [p2].[IsDeclinable], [p2].[Valeur] FROM( SELECTTOP(1) [p0].[Id], [p0].[Actif], [p0].[AffichageDimensionEpaisseur], [p0].[CatalogueID], [p0].[ClasseEnergetique], [p0].[CodeEAN], [p0].[CodeEANDeRemplacement], [p0].[CodeEANEquivalent], [p0].[CodeTransport], [p0].[DateCreation], [p0].[DateUpdate], [p0].[Description], [p0].[Duree], [p0].[Hashtags], [p0].[IdentifiantExterne], [p0].[IsDecline], [p0].[Libelle], [p0].[MarqueID], [p0].[ParentId], [p0].[PiecesDetachesCommentaire], [p0].[PiecesDetachesDuree], [p0].[Points], [p0].[PointsDePose], [p0].[PointsDeSacem], [p0].[PrixConseille], [p0].[ReferenceCommande], [p0].[ReferenceFabriquant], [p0].[ReferenceInterne], [p0].[Relation], [p0].[Sens], [p0].[Statut], [p0].[TvaTaux], [p0].[TvaTauxReduit], [p0].[UniteDeVente], [p].[Id] AS[Id0] FROM[Produits] AS[p] INNERJOIN[Produits] AS[p0] ON[p].[Id] = [p0].[ParentId] WHERE([p].[Id] = 645a334c-70d4-4d04-8d2d-614f9d0dac44) AND(( SELECTCOUNT(*) FROM[ProduitCaracteristiqueDistributeurs] AS[p1] WHERE([p0].[Id] = [p1].[ProduitID]) ANDEXISTS( SELECT1FROM( SELECTTOP() I.value('@Guid0[1] cast as xs:string?', 'uniqueidentifier') AS[Guid0], I.value('@String0[1] cast as xs:string?', 'varchar(max)') AS[String0] FROM.nodes('/R/V') N(I) ) AS[q] WHERE([q].[Guid0] = [p1].[CaracteristiquesDistributeurID]) AND([q].[String0] = [p1].[Valeur]))) = 4) ORDERBY[p0].[DateCreation] ) AS[t] LEFTJOIN[ProduitCaracteristiqueDistributeurs] AS[p2] ON[t].[Id] = [p2].[ProduitID] ORDERBY[t].[DateCreation], [t].[Id0], [t].[Id], [p2].[ProduitID], [p2].[CaracteristiquesDistributeurID] 40.00 ms Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync — 40.00 ms sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+896.5 ms) SingleOrDefault > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() 8.80 ms Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync — 8.80 ms sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.3 ms (T+905.7 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 1551.1 ms (T+906.4 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECT[t0].[Libelle], [t0].[CaracteristiquesDistributeurID] AS[Id], [t0].[Valeur], [t0].[Ordre] FROM( SELECTDISTINCT[c].[Libelle], [p1].[CaracteristiquesDistributeurID], [p1].[Valeur], [c].[Ordre] FROM[Produits] AS[p] INNERJOIN[Produits] AS[p0] ON[p].[Id] = [p0].[ParentId] INNERJOIN[ProduitCaracteristiqueDistributeurs] AS[p1] ON[p0].[Id] = [p1].[ProduitID] INNERJOIN[CaracteristiqueDistributeurs] AS[c] ON[p1].[CaracteristiquesDistributeurID] = [c].[Id] WHERE((([p].[Id] = 645a334c-70d4-4d04-8d2d-614f9d0dac44) AND([p].[Actif] = CAST(1ASbit))) AND(( SELECTCOUNT(*) FROM[ProduitCaracteristiqueDistributeurs] AS[p2] WHERE([p0].[Id] = [p2].[ProduitID]) ANDEXISTS( SELECT1FROM( SELECTTOP() I.value('@Guid0[1] cast as xs:string?', 'uniqueidentifier') AS[Guid0], I.value('@String0[1] cast as xs:string?', 'varchar(max)') AS[String0] FROM.nodes('/R/V') N(I) ) AS[q] WHERE([q].[Guid0] = [p2].[CaracteristiquesDistributeurID]) AND([q].[String0] = [p2].[Valeur]))) = 4)) ANDEXISTS( SELECT1FROM[Produits] AS[p3] INNERJOIN( SELECT[p4].[ProduitID], [p4].[CaracteristiquesDistributeurID], [p4].[DateCreation], [p4].[DateUpdate], [p4].[Id], [p4].[IsDeclinable], [p4].[Valeur] FROM[ProduitCaracteristiqueDistributeurs] AS[p4] WHERE[p4].[IsDeclinable] = CAST(1ASbit) ) AS[t] ON[p3].[Id] = [t].[ProduitID] WHERE([p3].[Id] = 645a334c-70d4-4d04-8d2d-614f9d0dac44) AND([t].[CaracteristiquesDistributeurID] = [p1].[CaracteristiquesDistributeurID])) ) AS[t0] ORDERBY[t0].[Ordre] sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+2457.7 ms) GetDeclinableCaract > ToList > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.3 ms (T+2460.0 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 2067.3 ms (T+2460.4 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECT[t3].[c], [t3].[Id], [t3].[Libelle], [t3].[Id0], [t3].[Libelle0], [t3].[Id1], [t3].[Nom], [t3].[c0], [t3].[Points], [t3].[Id2], [t3].[Libelle1], [t3].[PrixConseille], [t3].[ParentId], [t3].[c1], [t3].[ReferenceFabriquant], [t3].[c2], [t3].[ReferenceCommande], [t3].[Id3], [t3].[Libelle2], [t3].[c3], [t3].[c4], [t3].[Libelle3], [t3].[Description], [t3].[ReferenceFabriquant0], [t3].[c5], [t3].[Id4], [t3].[Id5], [t3].[Id6], [t3].[RegroupementID], [t3].[ProduitID], [t3].[Id7], [t4].[Id], [t4].[DateCreation], [t4].[DateUpdate], [t4].[DistributeurId], [t4].[HasValues], [t4].[IdentifiantExterne], [t4].[Libelle], [t4].[Ordre], [t4].[Theme], [t4].[TypeMetier], [t4].[ProduitID], [t4].[CaracteristiquesDistributeurID], [t4].[CaracteristiquePimID], [t4].[CaracteristiqueDistributeurID], [t4].[DateCreation0], [t4].[DateUpdate0], [t4].[Id0], [t5].[TypeDeFichier], [t5].[Ordre], [t5].[URL], [t5].[Description], [t5].[Libelle], [t5].[Id], [p4].[Id], [p4].[Actif], [p4].[ClientAcheteurID], [p4].[DateCreation], [p4].[DateUpdate], [p4].[Description], [p4].[Libelle], [p4].[Ordre], [p4].[ProduitID], [p4].[TypeDeFichier], [p4].[URL], [t6].[TypeDeFichier], [t6].[Ordre], [t6].[URL], [t6].[Description], [t6].[Libelle], [t6].[Id], [p6].[Id], CAST([p6].[TypeEcotaxeId] ASint), [p6].[Code], [p6].[MontantHt], [p6].[MontantTtc], [p6].[ProduitID], [p6].[TypeEcotaxeId], [t7].[Id], [t7].[ClientID], [t7].[DateCreation], [t7].[DateUpdate], [t7].[IdentifiantExterne], [t7].[Libelle], [t7].[Ordre], [t7].[Theme], [t7].[Valeur], [t7].[IsDeclinable], [t7].[Id0], [t8].[Id], [t8].[DateCreation], [t8].[DateUpdate], [t8].[DistributeurId], [t8].[HasValues], [t8].[IdentifiantExterne], [t8].[Libelle], [t8].[Ordre], [t8].[Theme], [t8].[TypeMetier], [t8].[Valeur], [t8].[IsDeclinable], [t8].[ProduitID], [t8].[CaracteristiquesDistributeurID], [t8].[CaracteristiquePimID], [t8].[CaracteristiqueDistributeurID], [t8].[DateCreation0], [t8].[DateUpdate0], [t8].[Id0], [t10].[Id], [t10].[Code], [t10].[ProduitID], [t10].[NomenclatureID], [t10].[Id0], [t10].[NomenclaturePimID], [t10].[NomenclatureDistributeurID], [c5].[Id], [c5].[ClientID], [c5].[DateCreation], [c5].[DateUpdate], [c5].[Description], [c5].[Libelle], [c5].[PrixConseille], [c5].[ProduitID], [c5].[ReferenceFabriquant] FROM( SELECTTOP(1) CASEWHEN[p].[ParentId] ISNULLTHENCAST(1ASbit) ELSECAST(0ASbit) ENDAS[c], [p0].[Id], [p0].[Libelle], [m].[Id] AS[Id0], [m].[Libelle] AS[Libelle0], [c0].[Id] AS[Id1], [c0].[Nom], COALESCE([p].[Description], N'') AS[c0], [p].[Points], [p].[Id] AS[Id2], [p].[Libelle] AS[Libelle1], [p].[PrixConseille], [p].[ParentId], COALESCE([p].[Hashtags], N'') AS[c1], [p].[ReferenceFabriquant], CASEWHEN[p1].[Id] ISNOTNULLTHENCAST(1ASbit) ELSECAST(0ASbit) ENDAS[c2], [p].[ReferenceCommande], [t0].[Id] AS[Id3], [t0].[Libelle] AS[Libelle2], [t0].[c] AS[c3], CASEWHENEXISTS( SELECT1FROM[ClientProduitSurcharge] AS[c] WHERE[p].[Id] = [c].[ProduitID]) THENCAST(1ASbit) ELSECAST(0ASbit) ENDAS[c4], [t2].[Libelle] AS[Libelle3], [t2].[Description], [t2].[ReferenceFabriquant] AS[ReferenceFabriquant0], [t2].[c] AS[c5], [d].[Id] AS[Id4], [a].[Id] AS[Id5], [p1].[Id] AS[Id6], [t0].[RegroupementID], [t0].[ProduitID], [t2].[Id] AS[Id7] FROM[Produits] AS[p] INNERJOIN[Catalogues] AS[c0] ON[p].[CatalogueID] = [c0].[Id] INNERJOIN[Distributeurs] AS[d] ON[c0].[DistributeurID] = [d].[Id] INNERJOIN[Adresses] AS[a] ON[d].[AdresseID] = [a].[Id] INNERJOIN[Pays] AS[p0] ON[a].[PaysID] = [p0].[Id] INNERJOIN[Marques] AS[m] ON[p].[MarqueID] = [m].[Id] LEFTJOIN[Produits] AS[p1] ON[p].[ParentId] = [p1].[Id] LEFTJOIN( SELECT[t].[Id], [t].[Libelle], [t].[c], [t].[RegroupementID], [t].[ProduitID] FROM( SELECT[r0].[Id], [r0].[Libelle], 1AS[c], [r].[RegroupementID], [r].[ProduitID], ROW_NUMBER() OVER(PARTITIONBY[r].[ProduitID] ORDERBY[r].[RegroupementID], [r].[ProduitID], [r0].[Id]) AS[row] FROM[RegroupementProduits] AS[r] INNERJOIN[Regroupement] AS[r0] ON[r].[RegroupementID] = [r0].[Id] ) AS[t] WHERE[t].[row] <= 1) AS[t0] ON[p].[Id] = [t0].[ProduitID] LEFTJOIN( SELECT[t1].[Libelle], [t1].[Description], [t1].[ReferenceFabriquant], [t1].[c], [t1].[Id], [t1].[ProduitID] FROM( SELECT[c1].[Libelle], [c1].[Description], [c1].[ReferenceFabriquant], 1AS[c], [c1].[Id], [c1].[ProduitID], ROW_NUMBER() OVER(PARTITIONBY[c1].[ProduitID] ORDERBY[c1].[Id]) AS[row] FROM[ClientProduitSurcharge] AS[c1] ) AS[t1] WHERE[t1].[row] <= 1) AS[t2] ON[p].[Id] = [t2].[ProduitID] WHERE([p].[Id] = 1188a6a4-9558-4d63-b180-c76016bb7ef4) AND([p].[Actif] = CAST(1ASbit)) ) AS[t3] LEFTJOIN( SELECT[c2].[Id], [c2].[DateCreation], [c2].[DateUpdate], [c2].[DistributeurId], [c2].[HasValues], [c2].[IdentifiantExterne], [c2].[Libelle], [c2].[Ordre], [c2].[Theme], [c2].[TypeMetier], [p2].[ProduitID], [p2].[CaracteristiquesDistributeurID], [m0].[CaracteristiquePimID], [m0].[CaracteristiqueDistributeurID], [m0].[DateCreation] AS[DateCreation0], [m0].[DateUpdate] AS[DateUpdate0], [m0].[Id] AS[Id0] FROM[ProduitCaracteristiqueDistributeurs] AS[p2] INNERJOIN[CaracteristiqueDistributeurs] AS[c2] ON[p2].[CaracteristiquesDistributeurID] = [c2].[Id] LEFTJOIN[MappageCaracteristiquePimCaracteristiqueDistributeur] AS[m0] ON[c2].[Id] = [m0].[CaracteristiqueDistributeurID] ) AS[t4] ON[t3].[Id2] = [t4].[ProduitID] LEFTJOIN( SELECT[p3].[TypeDeFichier], [p3].[Ordre], [p3].[URL], [p3].[Description], [p3].[Libelle], [p3].[Id], [p3].[ProduitID] FROM[ProduitFichiers] AS[p3] WHERE[p3].[Actif] = CAST(1ASbit) ) AS[t5] ON[t3].[Id2] = [t5].[ProduitID] LEFTJOIN[ProduitFichiers] AS[p4] ON[t3].[Id6] = [p4].[ProduitID] LEFTJOIN( SELECT[p5].[TypeDeFichier], [p5].[Ordre], [p5].[URL], [p5].[Description], [p5].[Libelle], [p5].[Id], [p5].[ProduitID] FROM[ProduitFichiers] AS[p5] WHERE[p5].[Actif] = CAST(1ASbit) ) AS[t6] ON[t3].[Id6] = [t6].[ProduitID] LEFTJOIN[ProduitEcotaxe] AS[p6] ON[t3].[Id2] = [p6].[ProduitID] LEFTJOIN( SELECT[c3].[Id], [c3].[ClientID], [c3].[DateCreation], [c3].[DateUpdate], [c3].[IdentifiantExterne], [c3].[Libelle], [c3].[Ordre], [c3].[Theme], [p7].[Valeur], [p7].[IsDeclinable], [p7].[Id] AS[Id0], [p7].[ProduitID] FROM[ProduitCaracteristiqueAcheteur] AS[p7] INNERJOIN[CaracteristiquesAcheteur] AS[c3] ON[p7].[CaracteristiquesAcheteurID] = [c3].[Id] ) AS[t7] ON[t3].[Id2] = [t7].[ProduitID] LEFTJOIN( SELECT[c4].[Id], [c4].[DateCreation], [c4].[DateUpdate], [c4].[DistributeurId], [c4].[HasValues], [c4].[IdentifiantExterne], [c4].[Libelle], [c4].[Ordre], [c4].[Theme], [c4].[TypeMetier], [p8].[Valeur], [p8].[IsDeclinable], [p8].[ProduitID], [p8].[CaracteristiquesDistributeurID], [m1].[CaracteristiquePimID], [m1].[CaracteristiqueDistributeurID], [m1].[DateCreation] AS[DateCreation0], [m1].[DateUpdate] AS[DateUpdate0], [m1].[Id] AS[Id0] FROM[ProduitCaracteristiqueDistributeurs] AS[p8] INNERJOIN[CaracteristiqueDistributeurs] AS[c4] ON[p8].[CaracteristiquesDistributeurID] = [c4].[Id] LEFTJOIN[MappageCaracteristiquePimCaracteristiqueDistributeur] AS[m1] ON[c4].[Id] = [m1].[CaracteristiqueDistributeurID] ) AS[t8] ON[t3].[Id2] = [t8].[ProduitID] LEFTJOIN( SELECT[t9].[Id], [t9].[Code], [p9].[ProduitID], [p9].[NomenclatureID], [n].[Id] AS[Id0], [t9].[NomenclaturePimID], [t9].[NomenclatureDistributeurID] FROM[ProduitNomenclatureDistributeurs] AS[p9] INNERJOIN[NomenclatureDistributeurs] AS[n] ON[p9].[NomenclatureID] = [n].[Id] INNERJOIN( SELECT[n0].[Id], [n0].[Code], [m2].[NomenclaturePimID], [m2].[NomenclatureDistributeurID] FROM[MappageNomenclaturePimNomenclatureDistributeur] AS[m2] INNERJOIN[NomenclaturePIMs] AS[n0] ON[m2].[NomenclaturePimID] = [n0].[Id] ) AS[t9] ON[n].[Id] = [t9].[NomenclatureDistributeurID] ) AS[t10] ON[t3].[Id2] = [t10].[ProduitID] LEFTJOIN[ClientProduitSurcharge] AS[c5] ON[t3].[Id2] = [c5].[ProduitID] ORDERBY[t3].[Id2], [t3].[Id1], [t3].[Id4], [t3].[Id5], [t3].[Id], [t3].[Id0], [t3].[Id6], [t3].[RegroupementID], [t3].[ProduitID], [t3].[Id3], [t3].[Id7], [t4].[ProduitID], [t4].[CaracteristiquesDistributeurID], [t4].[Id], [t4].[CaracteristiquePimID], [t4].[CaracteristiqueDistributeurID], [t5].[Id], [p4].[Id], [t6].[Id], [p6].[ProduitID], [p6].[TypeEcotaxeId], [t7].[Id0], [t7].[Id], [t8].[ProduitID], [t8].[CaracteristiquesDistributeurID], [t8].[Id], [t8].[CaracteristiquePimID], [t8].[CaracteristiqueDistributeurID], [t10].[ProduitID], [t10].[NomenclatureID], [t10].[Id0], [t10].[NomenclaturePimID], [t10].[NomenclatureDistributeurID], [t10].[Id], [c5].[Id] 135.10 ms Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync — 135.10 ms sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+4662.8 ms) SingleOrDefault > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4664.4 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.9 ms (T+4664.8 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECTTOP(1) [g].[Id], [g].[Actif], [g].[CatalogueID], [g].[ClientAcheteurID], [g].[CoefficientAchatParDefaut], [g].[CoefficientAjustementAchatParDefaut], [g].[CoefficientDeVenteParDefaut], [g].[DateCreation], [g].[DateDeDebutDeValidite], [g].[DateDeFinDeValidite], [g].[DateUpdate], [g].[Description], [g].[Exclu], [g].[GrilleTarifaireMaitreID], [g].[IdentifiantExterne], [g].[Libelle] FROM[Clients] AS[c] INNERJOIN[ClientTarifs] AS[c0] ON[c].[Id] = [c0].[ClientID] INNERJOIN[GrilleTarifaires] AS[g] ON[c0].[TarifID] = [g].[Id] WHERE(([c].[Id] = 2de82684-e644-418f-9385-9c7d574ec15e) AND([c0].[Actif] = CAST(1ASbit))) AND(((([g].[CatalogueID] = 75549207-8571-4d2a-a74f-2437d9d9dd51) AND([g].[Actif] = CAST(1ASbit))) AND([g].[DateDeFinDeValidite] >= GETDATE())) AND([g].[DateDeDebutDeValidite] <= GETDATE())) ORDERBY[g].[DateDeDebutDeValidite] DESC sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4665.9 ms) SingleOrDefault > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() sql - Open Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4666.3 ms) InitializeReader > ExecuteReader > Open > OpenInternal > ConnectionOpening > BroadcastConnectionOpening > DispatchEventData > Write Connection Open() sql - ExecuteReader Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+4666.6 ms) Execute > InitializeReader > ExecuteReader > CommandReaderExecuting > BroadcastCommandExecuting > DispatchEventData > Write SELECT[g].[ProduitID], [g].[GrilleTarifaireID], [g].[CodeEAN], [g].[CoefficientAchat], [g].[CoefficientAjustementAchat], [g].[CoefficientDeVente], [g].[DateCreation], [g].[DateReappro], [g].[DateUpdate], [g].[Exclu], [g].[Id], [g].[IdentifiantExterne], [g].[IsAvailable], [g].[QuantiteEnReappro], [g].[QuantiteEnReliquat], [g].[ReferenceFabriquant], [g].[Stock] FROM[GrilleTarifaireProduits] AS[g] WHERE([g].[GrilleTarifaireID] = 740e759c-e245-4c88-8cd3-2562f9a6f356) AND([g].[ProduitID] = 1188a6a4-9558-4d63-b180-c76016bb7ef4) sql - Close Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4667.1 ms) ToArray > AddRange > Dispose > Dispose > Close > ConnectionClosing > BroadcastConnectionClosing > DispatchEventData > Write Connection Close() sql - OpenAsync Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.3 ms (T+4667.8 ms) OpenInternalAsync > Start > Start > MoveNext > ConnectionOpeningAsync > BroadcastConnectionOpening > DispatchEventData > Write Connection OpenAsync() sql - ExecuteReader (Async) Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 1.1 ms (T+4668.2 ms) ExecuteReaderAsync > Start > Start > MoveNext > CommandReaderExecutingAsync > BroadcastCommandExecuting > DispatchEventData > Write SELECT[t].[Id], [t].[Actif], [t].[CatalogueID], [t].[ClientAcheteurID], [t].[CoefficientAchatParDefaut], [t].[CoefficientAjustementAchatParDefaut], [t].[CoefficientDeVenteParDefaut], [t].[DateCreation], [t].[DateDeDebutDeValidite], [t].[DateDeFinDeValidite], [t].[DateUpdate], [t].[Description], [t].[Exclu], [t].[GrilleTarifaireMaitreID], [t].[IdentifiantExterne], [t].[Libelle], [t0].[Id], [t0].[Actif], [t0].[CatalogueID], [t0].[ClientAcheteurID], [t0].[CoefficientAchatParDefaut], [t0].[CoefficientAjustementAchatParDefaut], [t0].[CoefficientDeVenteParDefaut], [t0].[DateCreation], [t0].[DateDeDebutDeValidite], [t0].[DateDeFinDeValidite], [t0].[DateUpdate], [t0].[Description], [t0].[Exclu], [t0].[GrilleTarifaireMaitreID], [t0].[IdentifiantExterne], [t0].[Libelle] FROM( SELECTTOP(1) [g].[Id], [g].[Actif], [g].[CatalogueID], [g].[ClientAcheteurID], [g].[CoefficientAchatParDefaut], [g].[CoefficientAjustementAchatParDefaut], [g].[CoefficientDeVenteParDefaut], [g].[DateCreation], [g].[DateDeDebutDeValidite], [g].[DateDeFinDeValidite], [g].[DateUpdate], [g].[Description], [g].[Exclu], [g].[GrilleTarifaireMaitreID], [g].[IdentifiantExterne], [g].[Libelle] FROM[GrilleTarifaires] AS[g] WHERE[g].[Id] = 740e759c-e245-4c88-8cd3-2562f9a6f356 ) AS[t] LEFTJOIN( SELECT[g0].[Id], [g0].[Actif], [g0].[CatalogueID], [g0].[ClientAcheteurID], [g0].[CoefficientAchatParDefaut], [g0].[CoefficientAjustementAchatParDefaut], [g0].[CoefficientDeVenteParDefaut], [g0].[DateCreation], [g0].[DateDeDebutDeValidite], [g0].[DateDeFinDeValidite], [g0].[DateUpdate], [g0].[Description], [g0].[Exclu], [g0].[GrilleTarifaireMaitreID], [g0].[IdentifiantExterne], [g0].[Libelle] FROM[GrilleTarifaires] AS[g0] WHERE([g0].[ClientAcheteurID] = 2de82684-e644-418f-9385-9c7d574ec15e) AND([g0].[GrilleTarifaireMaitreID] = 740e759c-e245-4c88-8cd3-2562f9a6f356) ) AS[t0] ON[t].[Id] = [t0].[GrilleTarifaireMaitreID] ORDERBY[t].[Id], [t0].[Id] sql - CloseAsync Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4669.6 ms) MoveNext > CloseAsync > Start > Start > MoveNext > ConnectionClosingAsync > BroadcastConnectionClosing > DispatchEventData > Write Connection CloseAsync() sql - OpenAsync Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4670.0 ms) OpenInternalAsync > Start > Start > MoveNext > ConnectionOpeningAsync > BroadcastConnectionOpening > DispatchEventData > Write Connection OpenAsync() sql - ExecuteReader (Async) Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.4 ms (T+4670.3 ms) ExecuteReaderAsync > Start > Start > MoveNext > CommandReaderExecutingAsync > BroadcastCommandExecuting > DispatchEventData > Write SELECTTOP(1) [g].[ProduitID], [g].[GrilleTarifaireID], [g].[CodeEAN], [g].[CoefficientAchat], [g].[CoefficientAjustementAchat], [g].[CoefficientDeVente], [g].[DateCreation], [g].[DateReappro], [g].[DateUpdate], [g].[Exclu], [g].[Id], [g].[IdentifiantExterne], [g].[IsAvailable], [g].[QuantiteEnReappro], [g].[QuantiteEnReliquat], [g].[ReferenceFabriquant], [g].[Stock] FROM[GrilleTarifaireProduits] AS[g] WHERE([g].[GrilleTarifaireID] = 740e759c-e245-4c88-8cd3-2562f9a6f356) AND([g].[ProduitID] = 1188a6a4-9558-4d63-b180-c76016bb7ef4) sql - CloseAsync Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.1 ms (T+4670.8 ms) MoveNext > CloseAsync > Start > Start > MoveNext > ConnectionClosingAsync > BroadcastConnectionClosing > DispatchEventData > Write Connection CloseAsync() sql - OpenAsync Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.2 ms (T+4671.1 ms) OpenInternalAsync > Start > Start > MoveNext > ConnectionOpeningAsync > BroadcastConnectionOpening > DispatchEventData > Write Connection OpenAsync() sql - ExecuteReader (Async) Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.5 ms (T+4671.4 ms) ExecuteReaderAsync > Start > Start > MoveNext > CommandReaderExecutingAsync > BroadcastCommandExecuting > DispatchEventData > Write SELECTTOP(1) [g].[ProduitID], [g].[GrilleTarifaireID], [g].[CodeEAN], [g].[CoefficientAchat], [g].[CoefficientAjustementAchat], [g].[CoefficientDeVente], [g].[DateCreation], [g].[DateReappro], [g].[DateUpdate], [g].[Exclu], [g].[Id], [g].[IdentifiantExterne], [g].[IsAvailable], [g].[QuantiteEnReappro], [g].[QuantiteEnReliquat], [g].[ReferenceFabriquant], [g].[Stock] FROM[GrilleTarifaireProduits] AS[g] WHERE([g].[GrilleTarifaireID] = 551ec3f9-169f-4534-9c5d-8e6d3e810b22) AND([g].[ProduitID] = 1188a6a4-9558-4d63-b180-c76016bb7ef4) sql - CloseAsync Controller Action: A6tm.Gesteos.Pim.GatewayApi.Controllers.ProductsController.GetProductByIdAsync 0.1 ms (T+4672.0 ms) MoveNext > CloseAsync > Start > Start > MoveNext > ConnectionClosingAsync > BroadcastConnectionClosing > DispatchEventData > Write Connection CloseAsync() toggle trivial gaps À partir de l’adresse Connexion --- ## auto parallels (28 juin 2022) https://gearupwindows.com/windows11-missing-checkbox-users-must-enter-a-user-name-and-password-to-use-this-computer/ Passer la valeur à 0 --- ## Linux (29 juin 2022) Mise en place ubuntu : https://doc.ubuntu-fr.org/wsl Tuto: Mettre en place un environnement de développement avec wsl2 + Docker + VSCode + PhpStorm. Ubuntu --- ## VSCode (4 juin 2022) Plugins : - Émet - EsLint - Prettier - Es7 react redux - Raccourcis composant: rfc - GitLens - MarkDownLint - Docker Config Eslint and Prettier in Visual Studio Code for React js development | by Manish Mandal | How To React | Medium yarn add eslint --dev yarn run eslint --init yarn global add prettier --- ## Hooks (4 août 2022) UseRef pour avoir la ref d’un composant --- ## pnpm (5 février 2023) - npm install -g pnpm - pnpm config set store-dir D:/.pnpm-store Vite pnpm create vite app.checkandimprove Choisir React + TypeScript Disque - --- ## nettoyage espace purgeable (18 mai 2022) Cd /volumes && ls Cd Donnees for d in $(tmutil listlocalsnapshotdates | grep "-"); do sudo tmutil deletelocalsnapshots $d; done --- ## AzureAd (14 juillet 2022) - Install-Module -Name --- ## Rappel ES6 (25 juillet 2022) Différence entre var, let, const - var a une portée globale => il faut éviter de l'utiliser (exemple si on utilise le même nom qu'une variable d'une bilbiothèque - let a une portée de block => utiliser systématiquement let Fonctions fléchées : - Facilite la syntaxe, notamment pour les callbacks - Attention dans une fonction fléchées this est le contexte englobant (window par exemple), this dans une fontion classique est le contexte appelant (l'objet par exemple) Spread operator = > étendre console.log(…arr) => renvoie tous les élements du tableau arr2 […arr1,4] Rest operator => dans les paramètres d'une fonction Function add(a,b,…args) => tous les aarguments qui restent Fonctions pures : ne dépendent pas d'un contexte exterieurs, renvoi toujours la même chose => évite les erreurs, paradigmes de la programmation fonctionnelle. Fonctions d'ordre supérieur : prend une fonction en paramètre ou en retourne une ou les 2. => fait partie de la programmation fonctionnelle, permet d'avoir des fonctions pouvant faire plus de choses. Exemple de fonctions d'ordre > : map,filter, foreach Destructuring ; const {nom, population} = pays; Const GetNomPays = ({nom} => nom; Console.log(data(pays)); --- ## Documentation (6 août 2022) Quel est le pb : - Peu de doc, rarement à jour Résultats attendus : - La doc est générée automatiquement et permet de comprendre le projet Living Documentation : vo us allez aimer la documentation ! (Cyrille Martraire) But de la documentation : - Transmettre la connaissance - Rendre accessible - Peut être obligatoire - Garder la connaissance dans le temps => Le savoir Transmission d'info - La + efficace : la conversation : maximum de bande passante, d'interaction, juste à temps (pas de travail à l'avance, pas de stock = pas de gaspillage) - Pair Programming : investissement sur la documentation et la transformation - Le Code est de la documentation - Est-ce qu'en lisant le code je comprends le métier Idée : Investing Wall, Obession Wall => savoir stable Savoir Stable : EverGreenDocument => uniquement les éléments stables Pour les comportements métier => BDD : conversation - scénario A voir SpecFlow, pciklesdoc, cucumber Mermaid : dPlaintext - diagram Docx fx : - Installer le zip dans d:\travail\_doc\docfx\ - Dans le projet : d:\travail\_doc\docfx\docfx init -q - d:\travail\_doc\docfx\docfx "D:\Travail\6tm\prod.6tm.com\docs\docfx\docfx_project\docfx.json" --serve Docusaurus : npx create-docusaurus@latest docs.prod.6tm.com classic --typescript Y Quels sont les pbs : - Doc xml de visual studio => trop technique, la valeur ajoutée est noyée - SpecFlow et gherkin => les --- ## Architecture (6 août 2022) DDD, en vrai pour le développeur (Cyrille Martraire) --- ## Code Legacy (25 décembre 2022) [Software Crafts·wo·manship] Dette technique et entropie du logiciel (Arnaud Lemaire) Code Legacy : - Il coûte plus cher à maintenir qu'il ne rapporte - Ajouter une fonctionnalité coûte plus cher qu'elle ne rapporte --- ## Micro-services (25 décembre 2022) On achète de la complexité obligatoire : Ca répond à quel besoin : - Au fait qu'on a des charges très différentes en fonction des zones du SI C'est rarement le cas et encore mieux ce n'est jamais le cas en début de projet - Vidéo à 22 minutes [Software Crafts·wo·manship] Dette technique et entropie du logiciel (Arnaud Lemaire) Vérifier si la complexité de la solution est bien fonction de la complexité du problème Faire simple ce n'est pas facile : - ne pas confondre simplicite et facilité, complexite et compliqué - La facilité est subjective quand la simplicité est objective Visual --- ## Studio 2022 (10 août 2022) - IIS à jour - Visual studio 2022 avec module linguistique - Codemaid - Markdown - Visual studio code - SQL 2019 - Node - SourceTree - Configuration des droits - Powershell 7 - Copier le fichier nuget Visual --- ## Flux (28 août 2022) Valeur ajoutée = ce que le client est prêt à payer Pour développer le CA : augmenter les capacités en supprimant les goulots du flux --- ## Docker (29 août 2022) Portainer.io : piloter swarm, docker pour les nuls Swarm : cluser de docker - Stack = 1 ensemble de service et 1 service = un ensemble de docker Traefik : 2eme rupture protocolaire route vers le port qui va bien, gère les certificats letsencrypt - 10K / an Thomas : 3 vms - clusters Résultats attendus : - Utiliser sur des preprods : - Utilisable sur les environnements de dev <-> => Comprendre les limites et bonnes pratiques de Docker : - Debug : compliqué - Test - windows / IIS 1 - Haute disponibilité : crash de VM => reprise sur un autre nœud Exemple gitLab avec maj 2 - PRA - PCA : Datacenter => Restau - 3 - Optimiser déploiment 4 --- ## runner (14 septembre 2023) Suivre les étapes depuis gitlab Elastic --- ## Pull request (8 janvier 2026) Rebase avec l’update-ref Fowler met en avant l’approche Ship / Show / Ask comme compromis pour garder une intégration fréquente tout en profitant des PR : - Ship : merge direct (pas de PR) - Show : merge tout de suite, mais ouvre une PR pour review/visibilité - Ask : PR avant merge (quand tu as besoin d’accord/discussion) r = rebase --interactive --update-refs --autosquash Gîtlens dans vscode https://github.com/benoitmasson/stacked-prs-demo Dan north ce qu’on veut tester c’est ce qui apporte de la valeur au produit Valeur Produit : quelle est le prochain comportement que mon utilisateur attend Garantit que la valeur produite est toujours présente Exemple concret Prompt de l’ia questionner le test Créé avec OneNote. ---