Advertise with Googlier.com
Inetsis BlogBlog dotNet, C#, Silverlight, SQL
http://blog.inetsis.fr/
http://www.rssboard.org/rss-specificationBlogEngine.NET 2.6.0.5en-GBhttp://blog.inetsis.fr/opml.axdhttp://www.dotnetblogengine.net/syndication.axdMy nameInetsis Blog0.0000000.000000Déployer sur azure<p>Voici quelques infos bien utiles pour déployer sur Azure.</p>
<p>L'idée est de compiler les sources, lancer une publication locale, zipper le résultat et l'uploader </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ée en paramètre, elle correspond au nom que vous avez indiqué dans visual studio </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ée</p>
<p><strong>4- Il reste simplement à 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érifier l'url vers l'api KUDU qui est la mê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 à l'interface de gestion (<a title="https://portal.azure.com" href="https://portal.azure.com" target="_blank">https://portal.azure.com</a>) et télécharger le profil de publication. Le login commence par un $ et le mot de passe est une longue suite de caractères, exemple :</p>
<pre class="brush: bash;">AZURE_LOGIN=$monapi
AZURE_PASSWORD=ZpuSQ3o9WXnSQeBbzu5qsrBgJ1b79aApkg8MoQEjriCxh6JLc0i6W1NJ6amS</pre>
<p style="text-align: center;"> <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érification du déploiement</strong></p>
<p>Aller dans les outils avancés et vérifier dans le dossier "site" si l'application a bien été déployée</p>
<p> <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> </p>
<p> <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éer un sous-site</strong></p>
<p>Pour déployer plusieurs site sur une même machine azure, il faut aller dans "Paramètres \ Paramètres de l'application" puis tout en bas dans "Applications et répertoires virtuels" et associer les répertoire au sous-site voulu</p>
<p> <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à 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#commenthttp://blog.inetsis.fr/post.aspx?id=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0Mon, 28 May 2018 17:26:00 +0100Dev C#Web Asp.NetMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=5d0837ad-f67c-4cb7-b5c9-2ee1365308e00http://blog.inetsis.fr/trackback.axd?id=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0http://blog.inetsis.fr/post/2018/05/28/Deployer-sur-azure.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=5d0837ad-f67c-4cb7-b5c9-2ee1365308e0Boucle sans fin<p>J'ai eu le cas récemment de relire un code C# utilisant une<span style="font-family: 'courier new', courier; color: #666699;"> BlockingCollection<T></span> qui est un peu particulière car elle permet de dépiler les items de la collection au fur et à 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 ça peut être cool parce qu'en procédant ainsi, la pile ne grossit pas trop et on grossit pas en mémoire ... mais bon ... le thread est bloqué quoi !!! En fonction du sénario, ça peut justement être trè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<T></span> avec un thread et une boucle sans fin ! 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ée à problème, pourtant, bien maitrisée, elle fait des miracles. Il n'y d'ailleurs que 3 choses à bien vérifier : </p>
<p><strong>1 - La gestion du thread</strong></p>
<div>Qui dit thread, dit forcement clô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>" qu'il faut passer à la création du thread et qui, lorsque vous appelez sa mé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;">élevé</span> codé. </div>
<p>Ensuite, quel objet thread utiliser ? Il y a le classique 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ée simplement un thread au sens OS du terme, c'est l'objet de base, le truc avec lequel vous serez jamais déçu ! Ensuite on a le <strong><span style="color: #99ccff;">ThreadPool</span></strong>, qui est un peu plus haut niveau et qui va gérer un ensemble de thread applicatif pour pas polluer l'OS, si vous faite beaucoup de création / destruction de petits thread dans votre appli, c'est l'objet idéal. Et puis ya le petit nouveau, le System.Threading.Tasks.<strong><span style="color: #99ccff;">Task</span></strong> qui est la nouvelle manière de faire avec les mots clefs async / await, c'est le thread next-gen, celui qui résoud tous vos problèmes et qui fait le café ...</p>
<p><strong>2 - La gestion des exception</strong></p>
<div>Mais revenons à notre boucle sans fin, qui a aussi besoin de bien savoir gérer ses exceptions, alors biensur, vous mettez un try/catch dans la boucle pour éviter les bétises, mais en plus, parce qu'il arrive toujours des trucs auxquels on a pas pensé, on ajoute un "<span style="font-family: 'courier new', courier; color: #333399;">ContinueWith()</span>" à 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à que le bât blesse, si votre boucle sans fin tourne tout le temps, votre processeur est à 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éterminante, 500 millisecondes c'est énorme mais pour un thread background c'est correcte, il est possible de descendre à 10 voir à 2 pour un traitement UI ou real-time. Il faut faire des tests et doser ...</div>
<p>Finalement, c'était pas si compliqué hein ? Aller le code type : </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é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> </p>
<div> 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#commenthttp://blog.inetsis.fr/post.aspx?id=b3917c98-25de-4401-b07a-cacfae1af1a2Mon, 27 Jun 2016 17:14:00 +0100Dev C#GeneralMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=b3917c98-25de-4401-b07a-cacfae1af1a20http://blog.inetsis.fr/trackback.axd?id=b3917c98-25de-4401-b07a-cacfae1af1a2http://blog.inetsis.fr/post/2016/06/27/Boucle-sans-fin.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=b3917c98-25de-4401-b07a-cacfae1af1a2L'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ésactivé.</p>
<p>Pour être malin, on va utiliser le principe de la <span style="font-family: 'courier new', courier; color: #333399;">ICommand</span> bindé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ésactivé. Ensuite on va supprimer entiè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 à binder <span style="color: #800000;">Fill</span> à <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 à 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;"><!--Image button : no template, hand cursor-->
<Style x:Key="btImg" TargetType="Button">
<Setter Property="Template" Value="{x:Null}" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!--L'image blanche-->
<ImageBrush x:Key="AddVipIcon" ImageSource="/Mon.Assembly;component/Images/add.png" />
<!--La jolie couleur bleue-->
<SolidColorBrush x:Name="c_blue" Color="#3572BA" />
<!--Le Converter-->
<fwk:BooleanConverter x:Key="CanAddToColorConv"
TrueValue="{StaticResource c_blue}" FalseValue="Gray" />
<!-- Et enfin le bouton -->
<Button Style="{StaticResource btImg}" Command="{Binding AddCommand}">
<!-- Le rectangle donne la couleur à l'image blanche en opacity mask -->
<!-- Le bouton gère son IsEnabled avec le CanExecute de la commande -->
<!-- Le converter sur Fill donne la couleur en fontion du IsEnabled : -->
<!-- actif = bleu / désactivé = gris -->
<Rectangle Width="16" Height="16" OpacityMask="{StaticResource AddVipIcon}"
Fill="{Binding IsEnabled,
RelativeSource={RelativeSource AncestorType=Button},
Converter={StaticResource CanAddToColorConv}}"/>
</Button></pre>
<p> </p>
<p>J'aime bien ce code car il utilise au maximum la puissance du XAML et on trouve des rappels inté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#commenthttp://blog.inetsis.fr/post.aspx?id=aaa51a0c-3232-42ea-be0f-88fd485fdbb0Wed, 20 Apr 2016 16:34:00 +0100Dev C#WPF & XamlMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=aaa51a0c-3232-42ea-be0f-88fd485fdbb00http://blog.inetsis.fr/trackback.axd?id=aaa51a0c-3232-42ea-be0f-88fd485fdbb0http://blog.inetsis.fr/post/2016/04/20/LOpacityMask-en-XAML.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=aaa51a0c-3232-42ea-be0f-88fd485fdbb0TFS : 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é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érents de la version serveur avec un "<strong>compare</strong>" sur un dossier à 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> </p>
<p>Dans la liste des fichiers modifié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é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'à dire à TFS de garder le fichier et à 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à, en quelques clics, vous avez rattrapé 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#commenthttp://blog.inetsis.fr/post.aspx?id=fa02bc24-0853-4ac1-a438-8de2a95ed3dfThu, 18 Feb 2016 12:51:00 +0100GeneralOutilsMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=fa02bc24-0853-4ac1-a438-8de2a95ed3df0http://blog.inetsis.fr/trackback.axd?id=fa02bc24-0853-4ac1-a438-8de2a95ed3dfhttp://blog.inetsis.fr/post/2016/02/18/TFS-Fichiers-modifies-hors-controle-de-source.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=fa02bc24-0853-4ac1-a438-8de2a95ed3dfTFS : Déplacer un Shelve vers une autre branche<p>Comment se faire avoir stupidement : vous avez commencez à développer, vous avez mis votre travail de coté en Shelve, mais depuis, vous avez banché et vote Shelve n'est plus sur les bonnes sources ... Aïe ... Pas de panique, comme toujours <strong>TFS</strong> a pensé à 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é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éveloppeur, qui se trouve dans le menu démarrer : Visual \ Tools \ VS Command Prompt, et naviguez vers l'emplacement de la branche (trè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ètre va alors s'ouvrir pour vous présenter les différences entre les deux branches. La plupart des fichiers seront automatiquement mergé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 à 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à, votre Shelve a changé de branche</p>
<p>Source : <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#commenthttp://blog.inetsis.fr/post.aspx?id=e20029d5-7de3-48ac-8a0a-c2c70da7c24aTue, 16 Feb 2016 13:31:00 +0100GeneralOutilsMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=e20029d5-7de3-48ac-8a0a-c2c70da7c24a0http://blog.inetsis.fr/trackback.axd?id=e20029d5-7de3-48ac-8a0a-c2c70da7c24ahttp://blog.inetsis.fr/post/2016/02/16/TFS-Deplacer-un-Shelve-vers-une-autre-branche.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=e20029d5-7de3-48ac-8a0a-c2c70da7c24aDé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égré nativement à Visual 2015, Microsoft pousse derrière, on code en C# et en XAML, ç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émarrer :</p>
<ul>
<li>Le starting guide en franç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 : <a title="Xamarin.Forms Namespace" href="https://developer.xamarin.com/api/namespace/Xamarin.Forms/" target="_blank">Xamarin.Forms Namespace</a></li>
<li>La hié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 </a></li>
</ul>
<div>Déjà avec ç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#commenthttp://blog.inetsis.fr/post.aspx?id=3cb998a8-c4bf-4d30-95f7-84ed884b04a8Mon, 28 Sep 2015 16:07:00 +0100Dev C#WPF & XamlMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=3cb998a8-c4bf-4d30-95f7-84ed884b04a80http://blog.inetsis.fr/trackback.axd?id=3cb998a8-c4bf-4d30-95f7-84ed884b04a8http://blog.inetsis.fr/post/2015/09/28/Demarrer-avec-Xamarin.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=3cb998a8-c4bf-4d30-95f7-84ed884b04a8Un peu de lecture pour la rentrée !<p>Trouver des petites solutions à des petits problème sur <a title="stackoverflow" href="http://stackoverflow.com/" target="_blank">stackoverflow </a>c'est déjà très bien. Mais pour apprendre des concepts ou une nouvelle techno, rien de mieux qu'un bon bouquin qui vous emmène de A à Z en passant par toutes les étapes qui vont biens !</p>
<p>Je vous recommande donc la lecture des très bons ouvrages NAXOS ! C'est très bien écrit, le développeur est talentueux, c'est en français, et c'est gratuit !! Que demander de plus ? Tout est là :</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#commenthttp://blog.inetsis.fr/post.aspx?id=5be40f50-092f-48a9-9c9c-c57c951fad78Tue, 01 Sep 2015 15:54:00 +0100Dev C#GeneralMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=5be40f50-092f-48a9-9c9c-c57c951fad780http://blog.inetsis.fr/trackback.axd?id=5be40f50-092f-48a9-9c9c-c57c951fad78http://blog.inetsis.fr/post/2015/09/01/Un-peu-de-lecture-pour-la-rentree-!.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=5be40f50-092f-48a9-9c9c-c57c951fad78Les nouveautés de C# 6<p>Visual studio 2015 est disponible depuis quelques semaines, c'est l'occasion de découvrir les nouveautés du langage C#6. Voici déjà en préambule l'historique des version de C# :</p>
<ul>
<li>C# est apparu en 2001 avec Visual Studio.Net </li>
<li>v2 en 2005 avec les classes partielles, les nullables, les méthodes anonymes et les générics</li>
<li>v3 en 2007 avec Linq, les var, les méthodes d'extension, les expressions lambda</li>
<li>v4 en 2010 avec les arguments nommés, les dynamics, la programmation parallèle</li>
<li>v5 en 2012 avec async / await, le [CallerMemberName]</li>
</ul>
<div>Pour cette nouvelle mouture, nous avons de le droits à des tips vraiment sympa :</div>
<div> </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été en string posait problè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écupérer le nom d'un symbole de manière générale. Ca fonctionne donc pour une propriété, un champ, une variable ou même une méthode.</div>
<div>
<pre class="brush: c-sharp;">nameof(objet.MaProp) -> "MaProp"
nameof(objet.MaFonc) -> "MaFonc"</pre>
</div>
<div> </div>
<div><strong>2 - La vérification de nullité avec ?.</strong></div>
<div>Voici maintenant un nouvel opérateur ! Le "?." évite les nullReferenceException en incluant un test de nullité à notre place. Si l'objet que l'on accède est null, alors la valeur renvoyé sera null aussi.</div>
<div>
<pre class="brush: c-sharp;">Person obj = null;
int? age = obj?.Age;
// Est la même chose que :
if (obj != null)
age = obj.Age;</pre>
</div>
<div>Ce qui est intéressant c'est que l'on peut enchainer les "?." pour éviter les tests à 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é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> </div>
<div><strong>3 - Le nouveau système de string.format</strong></div>
<div>Des formattage de chaine de caractère on en fait énormément, avec ce nouveau système, C# nous aide à obtenir un code plus lisible en utilisant les variables directement dans la chaine. Pour ce faire, on doit préfixer la chaine par "$" et l'on utilise les variable à place des numé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> </div>
<div><strong>4 - L'enrichissement des lambda</strong></div>
<div>Ce n'est pas vraiment une lambda, mais ça se rapproche d'une méthode anonyme, voici une manière plus concise d'écrire une propriété ou un méthode qui ne possè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 => this.Freres.Count();
// Ou
public int GetNbFreres() => this.Freres.Count();</pre>
</div>
<div> </div>
<div><strong>5 - Une nouvelle méthode d'initialisateur de dictionary et des getters</strong></div>
<div>Initialiser un dictionary n'est pas très intuitif, là encore C#6 nous aide à obtenir un code plus lisible : </div>
<div>
<pre class="brush: c-sharp;">var surnoms = new Dictionary<string, Person>
{
{ "Toto", new Person("Tom") },
{ "Papy", new Person("Jean") },
...
};
// Devient :
var surnoms = new Dictionary<string, Person>
{
["Toto"] = new Person("Tom"),
["Papy"] = new Person("Jean"),
...
};</pre>
</div>
<div>Et un peu dans le mê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> </div>
<div><strong>6 - Enrichissement du catch </strong></div>
<div>La limitation qui empêchait d'écrire un await dans un bloc catch ou finally est maintenant levée ! </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> </div>
<div><strong>7 - Using de namespace dans une portée</strong></div>
<div>Les using sont normalement définit en tê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 éviter les conflits de nommage par exemple. C'est maintenant possible avec une syntaxe un peu particulière. On peut aussi préciser un objet static que l'on utilise fréquement.</div>
<div>
<pre class="brush: c-sharp;">public void MaFonction()
{
// Using dans la porté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> </div>
<div>A noter que toutes ces é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#commenthttp://blog.inetsis.fr/post.aspx?id=7d5221aa-8ee7-4477-b884-33f064b63621Thu, 20 Aug 2015 10:20:00 +0100Dev C#Mercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=7d5221aa-8ee7-4477-b884-33f064b636210http://blog.inetsis.fr/trackback.axd?id=7d5221aa-8ee7-4477-b884-33f064b63621http://blog.inetsis.fr/post/2015/08/20/Les-nouveautes-de-C-6.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=7d5221aa-8ee7-4477-b884-33f064b63621Installer Windows depuis une clef USB<p>C'est le moment de passer à 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éer un clef USB bootable depuis un ISO : <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édure complète si besoin : <a title="FAQ" href="https://www.microsoft.com/fr-fr/download/windows-usb-dvd-download-tool" target="_blank">FAQ</a></p>
<p> </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#commenthttp://blog.inetsis.fr/post.aspx?id=26806a4b-4e02-48c7-be6a-88e7289e83bbWed, 12 Aug 2015 10:41:00 +0100GeneralMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=26806a4b-4e02-48c7-be6a-88e7289e83bb0http://blog.inetsis.fr/trackback.axd?id=26806a4b-4e02-48c7-be6a-88e7289e83bbhttp://blog.inetsis.fr/post/2015/08/12/Installer-Windows-depuis-une-clef-USB.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=26806a4b-4e02-48c7-be6a-88e7289e83bbDes boutons réactifs en Asp.net<p>Un tweak rapide pour <strong>désactiver un bouton</strong> dès que l'utilisateur a cliqué dessus pour éviter les appels multiples au serveur. Ajouter le onLoad pour prendre la main en code behind :</p>
<pre class="brush: xml;"><asp:Button ID="btSave" runat="server" CommandName="Update"
Text="Enregistrer" OnLoad="AddDisableEvent" /></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ème pour <strong>confirmer une action</strong> coté client :</p>
<pre class="brush: c-sharp;"><script type="text/javascript">
function displayBox() {
if (confirm("Voulez-vous ... blabla ... ?") == true)
{ return true; }
else
{ return false; }
}
</script>
et
<asp:LinkButton runat="server" Text="Envoyer" CommandArgument="<%# Item.Id %>"
OnClick="Envoyer_Click" OnClientClick="return displayBox();" /></pre>
<p>Le "OnClick" n'est pas appelé si le OnClientClick renvoie false !</p>
<p>Bien pratique pour rendre son UI plus ré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#commenthttp://blog.inetsis.fr/post.aspx?id=b51208f7-9d0a-40b8-9205-87cb10551b96Tue, 30 Jun 2015 10:31:00 +0100Web Asp.NetMercierhttp://blog.inetsis.fr/pingback.axdhttp://blog.inetsis.fr/post.aspx?id=b51208f7-9d0a-40b8-9205-87cb10551b960http://blog.inetsis.fr/trackback.axd?id=b51208f7-9d0a-40b8-9205-87cb10551b96http://blog.inetsis.fr/post/2015/06/30/Des-boutons-reactifs-en-Aspnet.aspx#commenthttp://blog.inetsis.fr/syndication.axd?post=b51208f7-9d0a-40b8-9205-87cb10551b96