Advertise with Googlier.com  Inetsis Blog Blog dotNet, C#, Silverlight, SQL http://blog.inetsis.fr/ http://www.rssboard.org/rss-specification BlogEngine.NET 2.6.0.5 en-GB http://blog.inetsis.fr/opml.axd http://www.dotnetblogengine.net/syndication.axd My name Inetsis Blog 0.000000 0.000000 Déployer sur azure <p>Voici quelques infos bien utiles pour d&eacute;ployer sur Azure.</p> <p>L'id&eacute;e est de compiler les sources, lancer une publication locale, zipper le r&eacute;sultat et l'uploader&nbsp;</p> <p><strong>1- Compilation</strong></p> <pre class="brush: c-sharp;">publishSiteName=monApp buildConfiguration=maConfig publishProfile=nomPublication pathMSBuild="C:/Program Files (x86)/MSBuild/14.0/Bin/msbuild.exe" # Execution du script. "$pathMSBuild" ./masolution.sln /property:configuration=$buildConfiguration /property:PublishProfile=$publishProfile /property:DeployOnBuild=true</pre> <p><strong>2- La publication locale</strong></p> <p>Le code ci-dessus, lance automatiquement la publication pass&eacute;e en param&egrave;tre, elle correspond au nom que vous avez indiqu&eacute; dans visual studio&nbsp;</p> <p style="text-align: center;"><img style="vertical-align: middle;" src="/IMAGES%2f2018%2f05%2f1.PNG.jpgx" width="550" /></p> <p><strong>3- Pour zipper, rien de compliquer</strong></p> <pre class="brush: bash;">deployArchiveFile="$publishSiteName.zip" pathDeploy="C:\Publish\Monapp\wwwroot\publishSiteName" "C:/Program Files/7-Zip/7zG.exe" a "./$deployArchiveFile" "$pathDeploy/*"</pre> <p>Ne pas oublier de supprimer le fichier une fois l'upload termin&eacute;e</p> <p><strong>4- Il reste simplement &agrave; envoyer sur Azure</strong></p> <pre class="brush: c-sharp;">completeAzureLogin="$AZURE_LOGIN:$AZURE_PASSWORD" echo "Upload de l'archive sur azure via l'API de KUDU" curl -X PUT --data-binary @$publishSiteName.zip https://monazure.scm.azurewebsites.net/api/zip/site/$publishSiteName/ -u $completeAzureLogin</pre> <p style="text-align: left;">Attention, bien v&eacute;rifier l'url vers l'api KUDU qui est la m&ecirc;me que l'url du site avec un .<strong>scm</strong>. en plus !</p> <p style="text-align: left;">Pour obtenir le login et le mode de passe de l'api zip, il faut se connecter &agrave; l'interface de gestion (<a title="https://portal.azure.com" href="https://portal.azure.com" target="_blank">https://portal.azure.com</a>) et t&eacute;l&eacute;charger le profil de publication. Le login commence par un $ et le mot de passe est une longue suite de caract&egrave;res, exemple :</p> <pre class="brush: bash;">AZURE_LOGIN=$monapi AZURE_PASSWORD=ZpuSQ3o9WXnSQeBbzu5qsrBgJ1b79aApkg8MoQEjriCxh6JLc0i6W1NJ6amS</pre> <p style="text-align: center;">&nbsp;<a onclick="window.open('http://blog.inetsis.fr/image.axd?picture=%2f2018%2f05%2f2.png','','width=950,height=400,left='+(screen.availWidth/2-475)+',top='+(screen.availHeight/2-200)+'');return false;" href="http://blog.inetsis.fr/image.axd?picture=%2f2018%2f05%2f2.png"><img class="null" style="vertical-align: middle;" src="/IMAGES%2f2018%2f05%2f2.png.jpgx" width="550" /></a></p> <p><strong>5- V&eacute;rification du d&eacute;ploiement</strong></p> <p>Aller dans les outils avanc&eacute;s et v&eacute;rifier dans le dossier "site" si l'application a bien &eacute;t&eacute; d&eacute;ploy&eacute;e</p> <p>&nbsp;<img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2018%2f05%2f3.png" width="400" /></p> <p>&nbsp;</p> <p>&nbsp;<img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2018%2f05%2f4.png" width="550" /></p> <p><strong>6- Cr&eacute;er un sous-site</strong></p> <p>Pour d&eacute;ployer plusieurs site sur une m&ecirc;me machine azure, il faut aller dans "Param&egrave;tres \ Param&egrave;tres de l'application" puis tout en bas dans "Applications et r&eacute;pertoires virtuels" et associer les r&eacute;pertoire au sous-site voulu</p> <p>&nbsp;<img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2018%2f05%2f5.png" width="550" /></p> <p>Voil&agrave; de quoi partir du bon pied !</p> <p>En PJ : les fichiers complets</p> <p><a href="http://blog.inetsis.fr/FILES%2f2018%2f05%2fcreate-zip-package-api.sh.axdx">create-zip-package-api.sh (762,00 bytes)</a></p> <p><a href="http://blog.inetsis.fr/FILES%2f2018%2f05%2fpublish-package-api.sh.axdx">publish-package-api.sh (1,21 kb)</a></p> <p><a href="http://blog.inetsis.fr/FILES%2f2018%2f05%2fpublish-package-rec.sh.axdx">publish-package-rec.sh (1,05 kb)</a></p> http://blog.inetsis.fr/post/2018/05/28/Deployer-sur-azure.aspx http://blog.inetsis.fr/post/2018/05/28/Deployer-sur-azure.aspx#comment http://blog.inetsis.fr/post.aspx?id=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0 Mon, 28 May 2018 17:26:00 +0100 Dev C# Web Asp.Net Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0 0 http://blog.inetsis.fr/trackback.axd?id=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0 http://blog.inetsis.fr/post/2018/05/28/Deployer-sur-azure.aspx#comment http://blog.inetsis.fr/syndication.axd?post=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0 Boucle sans fin <p>J'ai eu le cas r&eacute;cemment de&nbsp;relire un code C# utilisant une<span style="font-family: 'courier new', courier; color: #666699;"> BlockingCollection&lt;T&gt;</span> qui est un peu particuli&egrave;re car elle permet de d&eacute;piler les items de la collection au fur et &agrave; mesure qu'on en ajoute (donc threadsafe) et en plus, la petite maline bloque le thread producteur si la collection est pleine ! Bon sur le papier &ccedil;a peut &ecirc;tre cool parce qu'en proc&eacute;dant ainsi, la pile ne grossit pas trop et on grossit pas en m&eacute;moire ... mais bon ... le thread est bloqu&eacute; quoi !!! En fonction du s&eacute;nario, &ccedil;a peut justement &ecirc;tre tr&egrave;s BLOQUANT et engendrer un max de fragmentation ...</p> <p>Donc, comme souvent, back to basic : j'ai mis en place un bonne vieille stack threadsafe : <span style="font-family: 'courier new', courier; color: #333399;">ConcurrentQueue&lt;T&gt;</span> avec un thread et une boucle sans fin !&nbsp;C'est l'occasion de revenir sur cette conception simple mais pourtant bigrement efficace qu'est le <span style="font-family: 'courier new', courier; color: #333399;">while(true)</span>. Cette boucle est souvent associ&eacute;e &agrave; probl&egrave;me, pourtant, bien maitris&eacute;e, elle fait des miracles. Il n'y d'ailleurs que 3 choses &agrave; bien v&eacute;rifier :&nbsp;</p> <p><strong>1 - La gestion du thread</strong></p> <div>Qui dit thread, dit forcement cl&ocirc;ture bien propre du thread, pour se faire, vous devez utiliser un objet tout simple, le "<span style="font-family: 'courier new', courier; color: #333399;">CancellationTokenSource</span>"&nbsp;qu'il faut passer &agrave; la cr&eacute;ation du thread et qui, lorsque vous appelez sa m&eacute;thode "<span style="font-family: 'courier new', courier; color: #333399;">Cancel()</span>", va dire au thread de s'arreter gentiment parce qu'il est bien <span style="text-decoration: line-through;">&eacute;lev&eacute;</span> cod&eacute;.&nbsp;</div> <p>Ensuite, quel objet thread utiliser ? Il y a le classique&nbsp;System.Threading.<strong><span style="color: #99ccff;">Thread</span></strong> connu depuis la nuit des temps, qui porte bien son nom parce qu'il cr&eacute;e simplement un thread au sens OS du terme, c'est l'objet de base, le truc avec lequel vous serez jamais d&eacute;&ccedil;u ! Ensuite on a le <strong><span style="color: #99ccff;">ThreadPool</span></strong>, qui est un peu plus haut niveau et qui va g&eacute;rer un ensemble de thread applicatif pour pas polluer l'OS, si vous faite beaucoup de cr&eacute;ation / destruction de petits thread dans votre appli, c'est l'objet id&eacute;al. Et puis ya le petit nouveau, le&nbsp;System.Threading.Tasks.<strong><span style="color: #99ccff;">Task</span></strong> qui est la nouvelle mani&egrave;re de faire avec les mots clefs async / await, c'est le thread next-gen, celui qui r&eacute;soud tous vos probl&egrave;mes et qui fait le caf&eacute; ...</p> <p><strong>2 - La gestion des exception</strong></p> <div>Mais revenons &agrave; notre boucle sans fin, qui a aussi besoin de bien savoir g&eacute;rer ses exceptions, alors biensur, vous mettez un try/catch dans la boucle pour &eacute;viter les b&eacute;tises, mais en plus, parce qu'il arrive toujours des trucs auxquels on a pas pens&eacute;, on ajoute un "<span style="font-family: 'courier new', courier; color: #333399;">ContinueWith()</span>" &agrave; notre task pour la faire repartir ni vu ni connu !</div> <p><strong>3 - Laissez-la respirer !!</strong></p> <div>Et c'est bien souvent l&agrave; que le b&acirc;t blesse, si votre boucle sans fin tourne tout le temps, votre processeur est &agrave; 100% et vous pas content ! Donc il faut <span style="text-decoration: underline;">absolument</span> mettre un petit <span style="font-family: 'courier new', courier; color: #333399;">Thread.Sleep()</span> dans votre boucle pour laisser les autres processus prendre la main et continuer leurs jobs. Votre boucle sans fin aura ainsi le droit de parler comme les autres et non pas tout le temps. La valeur que vous aller mettre dans ce sleep est assez d&eacute;terminante, 500 millisecondes c'est &eacute;norme mais pour un thread background c'est correcte, il est possible de descendre &agrave; 10 voir &agrave; 2 pour un traitement UI ou real-time. Il faut faire des tests et doser ...</div> <p>Finalement, c'&eacute;tait pas si compliqu&eacute; hein ? Aller le code type :&nbsp;</p> <pre class="brush: c-sharp;">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { public class MonManager { private readonly CancellationTokenSource _cancel; private readonly Task _worker; public MonManager() { _cancel = new CancellationTokenSource(); _worker = new Task(DoWork, _cancel.Token, TaskCreationOptions.LongRunning); } private void DoWork() { do { try { // Le code de la boucle sans fin // ... // Avec le sleep pour laisser respirer Thread.Sleep(500); } catch (ExceptionMetier ex) { // Gestion des exceptions m&eacute;tiers throw; } } while (!_cancel.IsCancellationRequested); } public void Start() { _worker.Start(); _worker.ContinueWith(WorkerException, TaskContinuationOptions.OnlyOnFaulted); } public void Stop() { if (!_cancel.IsCancellationRequested) _cancel.Cancel(); } private void WorkerException(Task task) { // Gestion des exceptions techniques if (!_cancel.IsCancellationRequested) this.Start(); } } }</pre> <p>&nbsp;</p> <div>&nbsp;Avec un code aussi simple, pourquoi se priver ?</div> http://blog.inetsis.fr/post/2016/06/27/Boucle-sans-fin.aspx http://blog.inetsis.fr/post/2016/06/27/Boucle-sans-fin.aspx#comment http://blog.inetsis.fr/post.aspx?id=b3917c98-25de-4401-b07a-cacfae1af1a2 Mon, 27 Jun 2016 17:14:00 +0100 Dev C# General Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=b3917c98-25de-4401-b07a-cacfae1af1a2 0 http://blog.inetsis.fr/trackback.axd?id=b3917c98-25de-4401-b07a-cacfae1af1a2 http://blog.inetsis.fr/post/2016/06/27/Boucle-sans-fin.aspx#comment http://blog.inetsis.fr/syndication.axd?post=b3917c98-25de-4401-b07a-cacfae1af1a2 L'OpacityMask en XAML <p>J'ai besoin de faire un truc tout simple : un bouton image qui est bleu lorsqu'il est actif et gris lorsqu'il est d&eacute;sactiv&eacute;.</p> <p>Pour &ecirc;tre malin, on va utiliser le principe de la <span style="font-family: 'courier new', courier; color: #333399;">ICommand</span> bind&eacute;e sur un bouton, ainsi, lorsque le <span style="font-family: 'courier new', courier; color: #333399;">CanExecute()</span> retournera <span style="font-family: 'courier new', courier; color: #333399;">false</span>, le bouton sera d&eacute;sactiv&eacute;. Ensuite on va supprimer enti&egrave;rement le template du bouton et y placer notre image blanche en OpacityMask d'un rectangle sur lequel on pourra faire varier la couleur du <span style="color: #800000;">Fill</span> et ainsi coloriser l'image. Pour finir, il reste juste &agrave; binder <span style="color: #800000;">Fill</span> &agrave; <span style="background-color: #ffff99;">IsEnabled</span> du bouton.</p> <p><strong>1- Rappel de la syntaxe de la commande MVVM light :</strong></p> <pre class="brush: c-sharp;">public ICommand AddCommand { get; private set; } public Ctor() { this.AddCommand = new RelayCommand(this.AddVersion, this.AddVersionCanExecute); } private void AddVersion() { // Truc &agrave; faire } private bool AddVersionCanExecute() { // Peut-on faire le truc ? return this.SelectedVersion != null; }</pre> <p><strong>2- Code XAML :</strong></p> <pre class="brush: xml;">&lt;!--Image button : no template, hand cursor--&gt; &lt;Style x:Key="btImg" TargetType="Button"&gt; &lt;Setter Property="Template" Value="{x:Null}" /&gt; &lt;Setter Property="Cursor" Value="Hand" /&gt; &lt;Setter Property="VerticalAlignment" Value="Center" /&gt; &lt;/Style&gt; &lt;!--L'image blanche--&gt; &lt;ImageBrush x:Key="AddVipIcon" ImageSource="/Mon.Assembly;component/Images/add.png" /&gt; &lt;!--La jolie couleur bleue--&gt; &lt;SolidColorBrush x:Name="c_blue" Color="#3572BA" /&gt; &lt;!--Le Converter--&gt; &lt;fwk:BooleanConverter x:Key="CanAddToColorConv" TrueValue="{StaticResource c_blue}" FalseValue="Gray" /&gt; &lt;!-- Et enfin le bouton --&gt; &lt;Button Style="{StaticResource btImg}" Command="{Binding AddCommand}"&gt; &lt;!-- Le rectangle donne la couleur &agrave; l'image blanche en opacity mask --&gt; &lt;!-- Le bouton g&egrave;re son IsEnabled avec le CanExecute de la commande --&gt; &lt;!-- Le converter sur Fill donne la couleur en fontion du IsEnabled : --&gt; &lt;!-- actif = bleu / d&eacute;sactiv&eacute; = gris --&gt; &lt;Rectangle Width="16" Height="16" OpacityMask="{StaticResource AddVipIcon}" Fill="{Binding IsEnabled, RelativeSource={RelativeSource AncestorType=Button}, Converter={StaticResource CanAddToColorConv}}"/&gt; &lt;/Button&gt;</pre> <p>&nbsp;</p> <p>J'aime bien ce code car il utilise au maximum la puissance du XAML et on trouve des rappels int&eacute;ressants comme le findAncestor sur le type ou l'imageBrush</p> http://blog.inetsis.fr/post/2016/04/20/LOpacityMask-en-XAML.aspx http://blog.inetsis.fr/post/2016/04/20/LOpacityMask-en-XAML.aspx#comment http://blog.inetsis.fr/post.aspx?id=aaa51a0c-3232-42ea-be0f-88fd485fdbb0 Wed, 20 Apr 2016 16:34:00 +0100 Dev C# WPF & Xaml Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=aaa51a0c-3232-42ea-be0f-88fd485fdbb0 0 http://blog.inetsis.fr/trackback.axd?id=aaa51a0c-3232-42ea-be0f-88fd485fdbb0 http://blog.inetsis.fr/post/2016/04/20/LOpacityMask-en-XAML.aspx#comment http://blog.inetsis.fr/syndication.axd?post=aaa51a0c-3232-42ea-be0f-88fd485fdbb0 TFS : Fichiers modifiés hors contrôle de source <p>Voici une astuce avec TFS qui permet de reprendre en automatique, tous les "<strong>check out</strong>" sur les fichiers que vous avez modifi&eacute;s en dehors de Visual Studio et ainsi pouvoir faire votre commit dans de bonnes conditions.</p> <p>On commence par chercher les fichiers qui sont diff&eacute;rents de la version serveur avec un "<strong>compare</strong>" sur un dossier &agrave; partir du Source Control Explorer :</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2fCompare.png" /></p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2fCompare2.png" /></p> <p>&nbsp;</p> <p>Dans la liste des fichiers modifi&eacute;s, on a alors l'information si le verrou TFS est bien atif ou non dans la colonne "<strong>Pending Change</strong>". Il suffit donc de s&eacute;lectionner les fichiers qui ne sont pas "<strong>edit</strong>" et lancer l'outil de synchro avec TFS, le "<strong>Reconcile</strong>".</p> <p><a onclick="window.open('http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2fReconcile.png','Reconcile','width=850,height=450,left='+(screen.availWidth/2-425)+',top='+(screen.availHeight/2-225)+'');return false;" href="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2fReconcile.png"><img class="null" style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2fReconcile.png" width="550" height="293" /></a></p> <p>Il ne reste plus qu'&agrave; dire &agrave; TFS de garder le fichier et &agrave; faire le Checkout pour chaque fichier</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2fReconcile2.png" /></p> <p>Voil&agrave;, en quelques clics, vous avez rattrap&eacute; le coup !</p> http://blog.inetsis.fr/post/2016/02/18/TFS-Fichiers-modifies-hors-controle-de-source.aspx http://blog.inetsis.fr/post/2016/02/18/TFS-Fichiers-modifies-hors-controle-de-source.aspx#comment http://blog.inetsis.fr/post.aspx?id=fa02bc24-0853-4ac1-a438-8de2a95ed3df Thu, 18 Feb 2016 12:51:00 +0100 General Outils Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=fa02bc24-0853-4ac1-a438-8de2a95ed3df 0 http://blog.inetsis.fr/trackback.axd?id=fa02bc24-0853-4ac1-a438-8de2a95ed3df http://blog.inetsis.fr/post/2016/02/18/TFS-Fichiers-modifies-hors-controle-de-source.aspx#comment http://blog.inetsis.fr/syndication.axd?post=fa02bc24-0853-4ac1-a438-8de2a95ed3df TFS : Déplacer un Shelve vers une autre branche <p>Comment se faire avoir stupidement : vous avez commencez &agrave; d&eacute;velopper, vous avez mis votre travail de cot&eacute; en Shelve, mais depuis, vous avez banch&eacute; et vote Shelve n'est plus sur les bonnes sources ... A&iuml;e ... Pas de panique, comme toujours <strong>TFS</strong> a pens&eacute; &agrave; ce cas de figure ! Certe, il n'y a pas d'interface graphique, mais en mode ligne de command, on s'en sort.</p> <p><strong>1-</strong> Identifiez avec pr&eacute;cision le <strong>NOM du changeset</strong></p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f1.png" /></p> <p>Sur la capture ci-dessus, on voit que je suis dans la branche V1113. Avant d'aller plus loin, il faut absolument avoir la branche destinatrice en local sur votre poste. Donc, si ce n'est pas le cas, faite un "<strong>get lateste version</strong>". Ensuite, ouvrez la commande DOS d&eacute;veloppeur, qui se trouve dans le menu d&eacute;marrer : Visual \ Tools \ VS Command Prompt, et naviguez vers l'emplacement de la branche (tr&egrave;s important)</p> <p><strong>2-</strong> Utilisez la commande "<strong>unshelve /migrate</strong>" avec le nom du shelve :</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f2.png" /></p> <p>Une fen&egrave;tre va alors s'ouvrir pour vous pr&eacute;senter les diff&eacute;rences entre les deux branches. La plupart des fichiers seront automatiquement merg&eacute;s</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f4.png" /></p> <p><strong>3-</strong> Faites le merge &agrave; la main pour tous les autres en cliquant sur le bouton "<strong>Resolve</strong>"</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f5.png" /></p> <p><a onclick="window.open('http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f6.png','Merge','width=1370,height=830,left='+(screen.availWidth/2-685)+',top='+(screen.availHeight/2-415)+'');return false;" href="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f6.png"><img class="null" style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2016%2f07%2f6.png" width="600" /></a></p> <p>Voil&agrave;, votre Shelve a chang&eacute; de branche</p> <p>Source :&nbsp;<a href="http://benjii.me/2014/04/move-shelveset-to-different-branch-in-tfs/" target="_blank">http://benjii.me/2014/04/move-shelveset-to-different-branch-in-tfs/</a></p> http://blog.inetsis.fr/post/2016/02/16/TFS-Deplacer-un-Shelve-vers-une-autre-branche.aspx http://blog.inetsis.fr/post/2016/02/16/TFS-Deplacer-un-Shelve-vers-une-autre-branche.aspx#comment http://blog.inetsis.fr/post.aspx?id=e20029d5-7de3-48ac-8a0a-c2c70da7c24a Tue, 16 Feb 2016 13:31:00 +0100 General Outils Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=e20029d5-7de3-48ac-8a0a-c2c70da7c24a 0 http://blog.inetsis.fr/trackback.axd?id=e20029d5-7de3-48ac-8a0a-c2c70da7c24a http://blog.inetsis.fr/post/2016/02/16/TFS-Deplacer-un-Shelve-vers-une-autre-branche.aspx#comment http://blog.inetsis.fr/syndication.axd?post=e20029d5-7de3-48ac-8a0a-c2c70da7c24a Démarrer avec Xamarin <p>Nouveau challenge pour moi, faire du dev mobile ! J'ai fait un peu le tour de la question et il n'y a pas photo, c'est Xamarin qui sort du lot. Maintenant qu'il est int&eacute;gr&eacute; nativement &agrave; Visual 2015, Microsoft pousse derri&egrave;re, on code en C# et en XAML, &ccedil;a produit du code natif, moi je dis chapeau, c'est exactement ce qu'il faut, je kiff !</p> <p>Donc voici quelques liens qui m'ont permis de d&eacute;marrer :</p> <ul> <li>Le starting guide en fran&ccedil;ais : <a title="tuto xamarin" href="http://www.e-naxos.com/Blog/post/Windows-Phone-et-Android-en-mode-XamarinForms-avec-Mvvm-Light.aspx" target="_blank">Tuto Xamarin</a></li> <li>Ajouter la plateforme surface : <a title="Adding a Windows App" href="https://developer.xamarin.com/guides/xamarin-forms/platform-features/windows/installation/tablet/" target="_blank">Adding a windows app</a></li> <li>La bible :&nbsp;<a title="Xamarin.Forms Namespace" href="https://developer.xamarin.com/api/namespace/Xamarin.Forms/" target="_blank">Xamarin.Forms Namespace</a></li> <li>La hi&eacute;rarchie objet : <a title="Classes derived from Element" href="https://developer.xamarin.com/api/type/Xamarin.Forms.Element/" target="_blank">Classes derived from Element</a></li> <li>La mise en forme : <a title="Les layouts" href="https://developer.xamarin.com/guides/xamarin-forms/controls/layouts/" target="_blank">Forms layouts</a></li> <li>La gestion des images : <a title="Working with Images" href="https://developer.xamarin.com/guides/xamarin-forms/working-with/images/" target="_blank">Working with Images&nbsp;</a></li> </ul> <div>D&eacute;j&agrave; avec &ccedil;a, on est bien pour commencer, let's go to code !</div> http://blog.inetsis.fr/post/2015/09/28/Demarrer-avec-Xamarin.aspx http://blog.inetsis.fr/post/2015/09/28/Demarrer-avec-Xamarin.aspx#comment http://blog.inetsis.fr/post.aspx?id=3cb998a8-c4bf-4d30-95f7-84ed884b04a8 Mon, 28 Sep 2015 16:07:00 +0100 Dev C# WPF & Xaml Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=3cb998a8-c4bf-4d30-95f7-84ed884b04a8 0 http://blog.inetsis.fr/trackback.axd?id=3cb998a8-c4bf-4d30-95f7-84ed884b04a8 http://blog.inetsis.fr/post/2015/09/28/Demarrer-avec-Xamarin.aspx#comment http://blog.inetsis.fr/syndication.axd?post=3cb998a8-c4bf-4d30-95f7-84ed884b04a8 Un peu de lecture pour la rentrée ! <p>Trouver des petites solutions &agrave; des petits probl&egrave;me sur <a title="stackoverflow" href="http://stackoverflow.com/" target="_blank">stackoverflow </a>c'est d&eacute;j&agrave; tr&egrave;s bien. Mais pour apprendre des concepts ou une nouvelle techno, rien de mieux qu'un bon bouquin qui vous emm&egrave;ne de A &agrave; Z en passant par toutes les &eacute;tapes qui vont biens !</p> <p>Je vous recommande donc la lecture des tr&egrave;s bons ouvrages NAXOS ! C'est tr&egrave;s bien &eacute;crit, le d&eacute;veloppeur est talentueux, c'est en fran&ccedil;ais, et c'est gratuit !! Que demander de plus ? Tout est l&agrave; :</p> <p><a title="http://www.e-naxos.com/AllDotBlog.html" href="http://www.e-naxos.com/AllDotBlog.html" target="_blank">http://www.e-naxos.com/AllDotBlog.html</a></p> <p>Alors bonne lecture !</p> http://blog.inetsis.fr/post/2015/09/01/Un-peu-de-lecture-pour-la-rentree-!.aspx http://blog.inetsis.fr/post/2015/09/01/Un-peu-de-lecture-pour-la-rentree-!.aspx#comment http://blog.inetsis.fr/post.aspx?id=5be40f50-092f-48a9-9c9c-c57c951fad78 Tue, 01 Sep 2015 15:54:00 +0100 Dev C# General Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=5be40f50-092f-48a9-9c9c-c57c951fad78 0 http://blog.inetsis.fr/trackback.axd?id=5be40f50-092f-48a9-9c9c-c57c951fad78 http://blog.inetsis.fr/post/2015/09/01/Un-peu-de-lecture-pour-la-rentree-!.aspx#comment http://blog.inetsis.fr/syndication.axd?post=5be40f50-092f-48a9-9c9c-c57c951fad78 Les nouveautés de C# 6 <p>Visual studio 2015 est disponible depuis quelques semaines, c'est l'occasion de d&eacute;couvrir les nouveaut&eacute;s du langage C#6. Voici d&eacute;j&agrave; en pr&eacute;ambule l'historique des version de C# :</p> <ul> <li>C# est apparu en 2001 avec Visual Studio.Net&nbsp;</li> <li>v2 en 2005 avec les classes partielles, les nullables, les m&eacute;thodes anonymes et les g&eacute;n&eacute;rics</li> <li>v3 en 2007 avec Linq, les var, les m&eacute;thodes d'extension, les expressions lambda</li> <li>v4 en 2010 avec les arguments nomm&eacute;s, les dynamics, la programmation parall&egrave;le</li> <li>v5 en 2012 avec async / await, le [CallerMemberName]</li> </ul> <div>Pour cette nouvelle mouture, nous avons de le droits &agrave; des tips vraiment sympa :</div> <div>&nbsp;</div> <div><strong>1 - Le mot clef nameof</strong></div> <div>On l'attendait depuis l'utilisation massive de NotifyPropertyChanged dont l'utilisation du nom de le propri&eacute;t&eacute; en string posait probl&egrave;me de puis longtemps (voir <a href="http://blog.inetsis.fr/post/2013/11/20/Implementer-INotifyPropertyChanged.aspx" target="_blank">cet article</a>). Nous avons maintenant un mot clef qui permet de r&eacute;cup&eacute;rer le nom d'un symbole de mani&egrave;re g&eacute;n&eacute;rale. Ca fonctionne donc pour une propri&eacute;t&eacute;, un champ, une variable ou m&ecirc;me une m&eacute;thode.</div> <div> <pre class="brush: c-sharp;">nameof(objet.MaProp) -&gt; "MaProp" nameof(objet.MaFonc) -&gt; "MaFonc"</pre> </div> <div>&nbsp;</div> <div><strong>2 - La v&eacute;rification de nullit&eacute; avec ?.</strong></div> <div>Voici maintenant un nouvel op&eacute;rateur ! Le "?." &eacute;vite les nullReferenceException en incluant un test de nullit&eacute; &agrave; notre place. Si l'objet que l'on acc&egrave;de est null, alors la valeur renvoy&eacute; sera null aussi.</div> <div> <pre class="brush: c-sharp;">Person obj = null; int? age = obj?.Age; // Est la m&ecirc;me chose que : if (obj != null) age = obj.Age;</pre> </div> <div>Ce qui est int&eacute;ressant c'est que l'on peut enchainer les "?." pour &eacute;viter les tests &agrave; rallonge !</div> <div> <pre class="brush: c-sharp;">int? cp = person?.Mere?.Ville?.CodePostal</pre> </div> <div>Et si l'on veut donner une valeur par d&eacute;faut, il suffit de l'associer avec un double point d'interrogation</div> <div> <pre class="brush: c-sharp;">int age = peson?.Age ? ? 18;</pre> </div> <div>&nbsp;</div> <div><strong>3 - Le nouveau syst&egrave;me de string.format</strong></div> <div>Des formattage de chaine de caract&egrave;re on en fait &eacute;norm&eacute;ment, avec ce nouveau syst&egrave;me, C# nous aide &agrave; obtenir un code plus lisible en utilisant les variables directement dans la chaine. Pour ce faire, on doit pr&eacute;fixer la chaine par "$" et l'on utilise les variable &agrave; place des num&eacute;ros toujours entre "{}"</div> <div> <pre class="brush: c-sharp;">string c = $"Bonjour M.{person.Nom}, il est {DateTime.Now.Hour:T}";</pre> </div> <div>&nbsp;</div> <div><strong>4 - L'enrichissement des lambda</strong></div> <div>Ce n'est pas vraiment une lambda, mais &ccedil;a se rapproche d'une m&eacute;thode anonyme, voici une mani&egrave;re plus concise d'&eacute;crire une propri&eacute;t&eacute; ou un m&eacute;thode qui ne poss&egrave;de qu'une seule instruction "return"</div> <div> <pre class="brush: c-sharp;">public int NbFreres { get { return this.Freres.Count(); } } // Devient : public int NbFreres =&gt; this.Freres.Count(); // Ou public int GetNbFreres() =&gt; this.Freres.Count();</pre> </div> <div>&nbsp;</div> <div><strong>5 - Une nouvelle m&eacute;thode d'initialisateur de dictionary et des getters</strong></div> <div>Initialiser un dictionary n'est pas tr&egrave;s intuitif, l&agrave; encore C#6 nous aide &agrave; obtenir un code plus lisible :&nbsp;</div> <div> <pre class="brush: c-sharp;">var surnoms = new Dictionary&lt;string, Person&gt; { { "Toto", new Person("Tom") }, { "Papy", new Person("Jean") }, ... }; // Devient : var surnoms = new Dictionary&lt;string, Person&gt; { ["Toto"] = new Person("Tom"), ["Papy"] = new Person("Jean"), ... };</pre> </div> <div>Et un peu dans le m&ecirc;me esprit, il est maintenant possible d'initialiser les getters court :</div> <div> <pre class="brush: c-sharp;">int Age {get; set; } = 18;</pre> </div> <div>&nbsp;</div> <div><strong>6 - Enrichissement du catch&nbsp;</strong></div> <div>La limitation qui emp&ecirc;chait d'&eacute;crire un await dans un bloc catch ou finally est maintenant lev&eacute;e !&nbsp;</div> <div> <pre class="brush: c-sharp;">private async Task DoSomethingAsync() { try { // Some async code that can throw an exception ... } catch (Exception ex) { var dialog = new MessageDialog("Something went wrong!"); await dialog.ShowAsync(); } }</pre> </div> <div>De plus, il est possible de poser des conditions sur les blocs catch pour tester un code d'erreur par exemple :</div> <div> <pre class="brush: c-sharp;">try { ... } catch(IOException ex) if (ex.HResult == 0x80070020) { // File is in use by another process } catch(IOException ex) if (ex.HResult == 0x80070035) { // Network path was not found } catch(Exception ex) { // Something else happened }</pre> </div> <div>&nbsp;</div> <div><strong>7 - Using de namespace dans une port&eacute;e</strong></div> <div>Les using sont normalement d&eacute;finit en t&ecirc;te de fichier pour tout le fichier. Mais il peut arriver que l'on souhaite utiliser un using que dans une partie de son code, pour &eacute;viter les conflits de nommage par exemple. C'est maintenant possible avec une syntaxe un peu particuli&egrave;re. On peut aussi pr&eacute;ciser un objet static que l'on utilise fr&eacute;quement.</div> <div> <pre class="brush: c-sharp;">public void MaFonction() { // Using dans la port&eacute;e using static Inetsis.Helpers; ... // Utilisation directe d'un objet static using static System.Math; double distance = Sqrt(x * x + y * y); }</pre> </div> <div>&nbsp;</div> <div>A noter que toutes ces &eacute;volutions sont utilisables avec le framework 4;</div> http://blog.inetsis.fr/post/2015/08/20/Les-nouveautes-de-C-6.aspx http://blog.inetsis.fr/post/2015/08/20/Les-nouveautes-de-C-6.aspx#comment http://blog.inetsis.fr/post.aspx?id=7d5221aa-8ee7-4477-b884-33f064b63621 Thu, 20 Aug 2015 10:20:00 +0100 Dev C# Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=7d5221aa-8ee7-4477-b884-33f064b63621 0 http://blog.inetsis.fr/trackback.axd?id=7d5221aa-8ee7-4477-b884-33f064b63621 http://blog.inetsis.fr/post/2015/08/20/Les-nouveautes-de-C-6.aspx#comment http://blog.inetsis.fr/syndication.axd?post=7d5221aa-8ee7-4477-b884-33f064b63621 Installer Windows depuis une clef USB <p>C'est le moment de passer &agrave; Windows 10 mais malheureusement je n'ai pas de lecteur optique sur ma tablette alors comment faire ?</p> <p>Il suffit juste d'utiliser un outil qui va cr&eacute;er un clef USB bootable depuis un ISO :&nbsp;<strong>Windows USB/DVD Download Tool</strong></p> <p><a title="http://wudt.codeplex.com/" href="http://wudt.codeplex.com/" target="_blank">http://wudt.codeplex.com/</a></p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2015%2f08%2fusb1.png" /></p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://blog.inetsis.fr/image.axd?picture=%2f2015%2f08%2fusb2.png" /></p> <p>Et voici la proc&eacute;dure compl&egrave;te si besoin :&nbsp;<a title="FAQ" href="https://www.microsoft.com/fr-fr/download/windows-usb-dvd-download-tool" target="_blank">FAQ</a></p> <p>&nbsp;</p> http://blog.inetsis.fr/post/2015/08/12/Installer-Windows-depuis-une-clef-USB.aspx http://blog.inetsis.fr/post/2015/08/12/Installer-Windows-depuis-une-clef-USB.aspx#comment http://blog.inetsis.fr/post.aspx?id=26806a4b-4e02-48c7-be6a-88e7289e83bb Wed, 12 Aug 2015 10:41:00 +0100 General Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=26806a4b-4e02-48c7-be6a-88e7289e83bb 0 http://blog.inetsis.fr/trackback.axd?id=26806a4b-4e02-48c7-be6a-88e7289e83bb http://blog.inetsis.fr/post/2015/08/12/Installer-Windows-depuis-une-clef-USB.aspx#comment http://blog.inetsis.fr/syndication.axd?post=26806a4b-4e02-48c7-be6a-88e7289e83bb Des boutons réactifs en Asp.net <p>Un tweak rapide pour <strong>d&eacute;sactiver un bouton</strong> d&egrave;s que l'utilisateur a cliqu&eacute; dessus pour &eacute;viter les appels multiples au serveur. Ajouter le onLoad pour prendre la main en code behind :</p> <pre class="brush: xml;">&lt;asp:Button ID="btSave" runat="server" CommandName="Update" Text="Enregistrer" OnLoad="AddDisableEvent" /&gt;</pre> <p>Et ajouter du code javascript en concervant le callBack du click :</p> <pre class="brush: c-sharp;">protected void AddDisableEvent(object sender, EventArgs e) { var btSave = sender as Button; if (btSave != null) { // Ajouter le disabled du bouton enregistrer btSave.Attributes.Add("onclick", "this.disabled=true; this.value='En cours ...'; " + ClientScript.GetPostBackEventReference(btSave, null) + ";"); } }</pre> <p>Et un deuxi&egrave;me pour <strong>confirmer une action</strong> cot&eacute; client :</p> <pre class="brush: c-sharp;">&lt;script type="text/javascript"&gt; function displayBox() { if (confirm("Voulez-vous ... blabla ... ?") == true) { return true; } else { return false; } } &lt;/script&gt; et &lt;asp:LinkButton runat="server" Text="Envoyer" CommandArgument="&lt;%# Item.Id %&gt;" OnClick="Envoyer_Click" OnClientClick="return displayBox();" /&gt;</pre> <p>Le "OnClick" n'est pas appel&eacute; si le OnClientClick renvoie false !</p> <p>Bien pratique pour rendre son UI plus r&eacute;active.</p> http://blog.inetsis.fr/post/2015/06/30/Des-boutons-reactifs-en-Aspnet.aspx http://blog.inetsis.fr/post/2015/06/30/Des-boutons-reactifs-en-Aspnet.aspx#comment http://blog.inetsis.fr/post.aspx?id=b51208f7-9d0a-40b8-9205-87cb10551b96 Tue, 30 Jun 2015 10:31:00 +0100 Web Asp.Net Mercier http://blog.inetsis.fr/pingback.axd http://blog.inetsis.fr/post.aspx?id=b51208f7-9d0a-40b8-9205-87cb10551b96 0 http://blog.inetsis.fr/trackback.axd?id=b51208f7-9d0a-40b8-9205-87cb10551b96 http://blog.inetsis.fr/post/2015/06/30/Des-boutons-reactifs-en-Aspnet.aspx#comment http://blog.inetsis.fr/syndication.axd?post=b51208f7-9d0a-40b8-9205-87cb10551b96