Les raccourcis clavier incontournables de Visual Studio

icon Tags de l'article :

Mars 03, 2014
Logo Visual Studio

Comme je me suis dit que ça pourrait vous intéresser... Du moins certains d'entre vous :

Voici la liste de tous les raccourcis Visual Studio que j'utilise presque tous les jours.

A apprendre par coeur quand vous passez du temps sur Visual Studio :

F12 : accéder à la référence
SHIFT + F12 : trouver toutes les références
F5 : lancer le DEBUG
CTRL + F5 : lancer l'application sans DEBUG
F6 : lancer le build
CTRL + PAUSE : arrêter l'opération en cours (build, déploiement, etc.)
SHIFT + F5 : arrêter le débug

CTRL + ; : faire apparaître le menu des types pour ensuite ajouter automatiquement un using (en faisant entrée)
CTRL + SHIFT + F : rechercher dans tous les fichiers
CTRL + , : accéder directement à une classe ou à un fichier en tapant son nom (ou un morceau de son nom)
CTRL + K + D ou CTRL + E + D : réindenter le fichier courant
CTRL + K + C ou CTRL + E + C : commenter la sélection
CTRL + K + U ou CTRL + E + U : décommenter la sélection
CTRL + M + O : plier toutes les méthodes et régions du fichier courant
CTRL + M + L : déplier toutes les méthodes et régions pliées

ALT + SHIFT + flèches ou sélection à la souris : sélectionner un bloc de texte sur plusieurs lignes
ALT + SHIFT + ENTREE : réduire les panels pour mieux voir le fichier courant
CTRL + F3 : recherche le terme sélectionné (F3 pour voir le terme suivant, etc.)
CTRL + SHIFT + V : remonter dans l'historique du presse-papier
CTRL + D + Q : espion express

En débug :

F10 : avancer d'un cran (on ne rentre pas dans un éventuel sous-traitement)
F11 : avancer d'un cran (on rentre dans un éventuel sous-traitement)
F5 : reprendre le déroulement normal (jusqu'au prochain point d'arrêt)
CTRL + SHIFT + F9 : supprimer tous les points d'arrêt

Bon dev à tous !

Un bon développeur restera un bon développeur, même sur d'autres langages

icon Tags de l'article : ,

Janvier 17, 2014


Ceux qui me connaissent un peu savent que je suis développeur .Net depuis maintenant... 4 ans. Avant cela, je développais beaucoup... en PHP. J’adorais ce langage. Je l'ai utilisé pendant presque 3 ans sur de nombreux projets : personnels, école, stages, etc.

Puis, j’ai découvert le .Net avec C#, Visual Studio et ASP.Net.
Smooth, efficace, programmer-friendly, le meilleur IDE du moment, des performances à tomber... tout ce qu’il fallait pour que je succombe et que je me plonge dans ce langage à fond.

Sauf que voilà, les projets en ASP.Net n'ont jamais été simples à héberger ni à partager... Et comme je voulais rendre MyCryptoChat utilisable par le plus grand monde, il fallait que je développe une version en PHP, le langage que je n’avais pas utilisé depuis 4 ans...

Et bien vous savez quoi ? Je suis bien meilleur en PHP aujourd’hui que je ne l’étais il y a 4 ans.

En effet, même si la syntaxe du langage change énormément du C#, je suis meilleur à plein de niveaux aujourd’hui :
* POO,
* Architecture,
* Algorithmie et logiques de conception,
* Optimisations et réflexions autour des performances,
* Analyse,
* Debug,
* ...

Au final je n’aurais galéré que deux jours pour porter mon projet ASP.Net MVC en PHP. Deux jours.

Le temps de rentrer dans le langage, de retrouver toutes les méthodes dont j'avais besoin, de faire des tests de performances, de tester, de corriger la majorité des bugs, de redécouvrir les limites du langage...

Deux jours.

Le langage change, mais les compétences restent.

Je ne suis pas un développeur .Net, je suis un développeur tout court.


Je ne connais peut-être pas *tout* le framework ni les méthodes, mais la doc est là pour ça.

Seulement deux jours, et je sais développer en PHP. Combien de jours me faudrait-il avant de commencer à être vraiment à l’aise avec le langage ? Seulement quelques jours de plus probablement...

C’est triste qu’en France nous ne soyons jugés qu’à notre niveau dans un langage. Développeur .Net et vous voulez faire du Java ? Mais vous êtes dingue !

Bref, je m’appelle Tommy et je suis développeur. Et toi, à quoi tu joues ?

Photo Credit: Wikipedia

MyCryptoChat, version 0.1 et code source en ligne

icon Tags de l'article : ,

Décembre 13, 2013


Bonjour à tous ! Comme promis il y a quelques jours, je viens juste de publier le code source de MyCryptoChat !

Ceux qui suivent déjà mes liens savent déjà de quoi je parle, alors voici un petit récapitulatif pour les autres...

MyCryptoChat est une petite application de chat très simple, sécurisée à la ZeroBin. C’est-à-dire que les conversations sont intégralement chiffrées côté client.

Vous créez une conversation, vous donnez le lien à un ami, et hop, vous pouvez converser en toute sécurité.
Les seules personnes qui peuvent accéder à la conversation sont celles qui ont eu l’url de la conversation et la clef de chiffrement contenue dans l’ancre (après le # dans l’url).

Les fonctionnalités en détail :
  • Ultra simple car seulement 2 boutons : “créer une salle de chat” et “envoyer le message”.
  • Les chiffrements et déchiffrements sont intégralement réalisés par le navigateur. Le serveur ne sait absolument pas ce que vous dites.
  • Chaque salle de chat a une durée de vie (de 15 minutes à 24 heures). A la fin, toute trace de la conversation aura disparu.
  • Les données sont chiffrées avec AES 256bits.
  • 1 minute après avoir quitté le chat, le serveur ne sait déjà plus qui vous étiez ni quelle était votre adresse IP (même les pseudos sont chiffrés !)
  • Vous pouvez changer vous-même la clef de chiffrement en modifiant l’ancre dans l’url (la partie après le #) avant d’envoyer votre premier message.
  • Le nombre de personnes qui suivent la conversation est affiché.
  • Génération d’avatars pour chaque utilisateur (afin d’éviter l’usurpation d’identité).

Vous trouverez toutes les informations ainsi que le code source sur la page du projet chez codeplex : http://mycryptochat.codeplex.com/

Sinon vous pouvez tester en live sur http://mycryptochat.azurewebsites.net/

Et si vous avez la moindre question, les commentaires sont là pour ça.

Allez, bon weekend à tous !

Photo Credit: rpongsaj

Créer un processus d'arrière-plan en ASP.Net

icon Tags de l'article :

Décembre 12, 2013
Clavier

Lorsqu'on travaille en ASP.Net, on a parfois besoin de créer un processus d’arrière-plan pour certains traitements.
Dans l’idéal, on devrait passer par une application externe (application console ou service Windows), mais malheureusement, il y a certaines situations dans lesquelles on ne peut pas… Par exemple : avoir à régulièrement faire le ménage dans nos variables d’application Web.

Du coup, nous allons donc devoir coder ça nous même.

Pour cela, nous allons jouer avec le Global.asax, et les méthodes Application_Start et Application_End.

Tout d’abord, dans Application_Start, nous allons créer un nouveau Thread, en arrière-plan (background) et le démarrer :

protected void Application_Start()
{
	// on crée notre objet thread qui pointe vers notre méthode MyBackgroundMethod
	Thread myBackgroundThread = new Thread(MyBackgroundMethod);
	// on spécifie qu’il s’agit d’un thread d’arrière-plan
	myBackgroundThread.IsBackground = true;
	// on le démarre
	myBackgroundThread.Start();

	// on le stocke dans une variable d’application
	Application["myBackgroundThread"] = myBackgroundThread;
}

Ensuite, nous arrêterons ce thread lorsque le service web s’arrêtera (donc dans Application_End) :

protected void Application_End()
{
	try
	{
		// on essaie de récupérer notre thread depuis la variable d’application
		Thread myBackgroundThread = (Thread)Application["myBackgroundThread"];
		// s’il tourney encore, on le coupe
		if (myBackgroundThread != null && myBackgroundThread.IsAlive == true)
		{
			myBackgroundThread.Abort();
		}
	}
	catch
	{

	}
}

Enfin, voici ma méthode MyBackgroundMethod avec mon code métier :

private void MyBackgroundMethod(object obj)
{
    while (true)
    {
        System.Threading.Thread.Sleep(60000);

        // Mon
        // code
        // métier
    }
}

Je pense que le code parle de lui-même, mais si vous avez des questions, n’hésitez pas !

Bon dev !

Source

Visual Studio Express 2013

icon Tags de l'article : ,

Décembre 11, 2013


Peu de gens le connaissent et l’utilisent, même parmi ceux qui développent en .Net.

J’ai testé cet IDE ces derniers jours, et je dois bien avouer que j’ai été bluffé. En effet, depuis quelques années, je travaille avec Visual Studio Pro / Premium / Ultimate, et j’étais persuadé que la version express (la version 100% gratuite) de cet IDE était une version édulcorée, sans saveur, avec laquelle il n’était pas possible de travailler sur de vrais projets.

Et bien pas du tout !

En 4 jours d’utilisation intensive (création de plus de 50 projets), la seule fonctionnalité qui m’a manqué était … l’espion express ! Et oui !

Le reste des fonctionnalités que j’utilise tous les jours dans le cadre professionnel est présent, qu’il s’agisse de l’indentation automatique, de la complétion, de la navigation dans le code, du debugging, de la publication simplifiée, de la gestion des services, des performances, …

Visual Studio Express est un EXCELLENT IDE.

Vous avez toujours voulu essayer le développement .Net ? Vous voulez développer des applications Web, Windows ou Windows Store très facilement, avec un IDE gratuit, puissant et efficace ? Ne cherchez plus, installez Visual Studio Express.

De plus tout ce que vous développez avec VOUS APPARTIENT. Vous n’avez aucun compte à rendre à Microsoft, et vous pouvez parfaitement vendre vos applications ou vos services. La croyance populaire qui veut que les applications développées avec Visual Studio Express ne peuvent être vendues est FAUSSE.

Ah, et pour ceux qui se demandent pourquoi je développe toujours sur du Microsoft : à cause de Visual Studio. Cet IDE est le meilleur de tous ceux sur lesquels j’ai travaillé. Tout est simplifié, performant, et efficace. Créer un web service qui permet de gérer les données d’une table ? 3 minutes. Créer un site web permettant de gérer une base de données de 10 tables ? Moins d’une heure. Créer un moteur de blog qui fonctionne ? 30 minutes. Je suis 10 fois plus productif sur Visual Studio lorsque je fais du .Net que sur Sublime lorsque je fais du PHP. (Bon, après il y a l’habitude du langage qui joue, mais bon. ;)

Parfois, je me demande si je ne devrais pas rédiger quelques tutoriels (ou tourner quelques vidéos) pour initier les gens au développement en .Net. C'est tellement simple et rapide... Ca vous intéresserait ?

Je tiens enfin à préciser que cet article n’est pas du tout sponsorisé. C’est juste l’avis d’un développeur qui adore cet IDE qu’est Visual Studio. Microsoft a réussi peu de choses bien ces dernières années, mais C#, Visual Studio et Windows Azure sont les exceptions qui montrent que Microsoft peut toujours envoyer du rêve :)

Du coup, pour ceux qui veulent le télécharger : http://www.microsoft.com/france/visual-studio/essayez/express.aspx

Bonne journée à tous !

Minification et compression de fichiers en ASP.Net MVC

icon Tags de l'article :

Octembre 31, 2013
Lorsqu'on travaille dans le web, on entend souvent parler de minification et de compression de fichiers. Principalement de fichiers JS & CSS.

De quoi s'agit-il ? Comment ça marche ? Comment faire ça avec ASP.Net ?

Vous trouverez toutes les réponses à ces questions dans ce petit article de votre serviteur, publié sur le blog de ma société :

La compression JS & CSS ? Rien de plus simple en ASP.Net MVC 4

Bonne lecture et bon dev à tous !

Copie complète d'un objet en C#

icon Tags de l'article :

Octembre 31, 2013
Clavier

En C#, il peut nous arriver d'avoir à copier complètement un objet, et non pas juste la référence à cet objet. Si c'est assez simple dans de nombreux cas (utiliser .Clone() sur chacun de ses attributs), ça peut devenir galère si notre objet contient plusieurs sous-objets, ou si notre objet a énormément de propriétés.

Il existe, heureusement, une solution très simple : utiliser la sérialisation binaire pour cloner notre objet.

public static T DeepClone<T>(T obj) where T : ISerializable
{
    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(ms, obj);
        ms.Position = 0;

        return (T)formatter.Deserialize(ms);
    }
}

Seule contrainte : notre objet doit-être sérialisable (il suffit pour cela de mettre [Serializable] au dessus de vos classes à cloner). Mais cette simple méthode de quatre lignes nous évitera d'avoir à faire des .Clone sur chacune des propriétés de notre objet !

Et on peut aller encore plus loin, grâce aux méthodes d'extensions :

public static class ExtensionMethods
{
    public static T DeepClone<T>(this T obj) where T : ISerializable
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, obj);
            stream.Position = 0;
            return (T)formatter.Deserialize(stream);
        }
    }
}

Grâce à ce petit morceau de code, vous pouvez désormais cloner n'importe quel objet sérialisable en utilisant .DeepClone(). Pratique non ?

Bon, inutile de vous rappeler que Cloner vos objets est une mauvaise idée (performances, mémoire, tout ça...). Mais lorsqu'on n'a pas le choix, ce code est vraiment pratique.

Bon dev à tous !

Conseils pour les développeurs

icon Tags de l'article :

Octembre 18, 2013


J’avais vu passer, il y a quelques temps, des articles de conseils pour les développeurs sur certains blogs. Voici ceux que je donnerais à de jeunes développeurs :

  • Si vous aimez vraiment le développement, n’en faites pas votre travail. ( http://codingly.com/2008/12/29/degage-sale-programmeur/ )
  • Faites des sauvegardes de vos projets régulièrement !
  • Nommez vos versions et faites des snapshots de TOUTES vos versions (même une version temporairement livrée quelque part). Vous devez à tout moment pouvoir retrouver le code d’une version livrée pour corriger un bug critique.
  • Ne perdez pas de temps à commenter... Trop long, impossible à mettre à jour, à maintenir, commentaires flous ou perturbants, etc. Préférez des noms d’objets et de méthodes clairs, quitte à ce qu’ils soient très longs (ma_methode_qui_fait_ceci_a_partir_de_cela ou alors MaMethodeQuiFaitCeciAPartirDeCela par exemple). Ne commentez que la logique métier un peu compliquée.
  • Commentez (comment ça je me contredis ?) votre code dans le cas d’une méthode dépréciée ou amenée à disparaître... Indiquez la version courante et pourquoi.
  • Ne cherchez pas à écrire un code parfait. Le mieux est l’ennemi du bien. Faites un code qui marche et dans lequel vous vous retrouvez. Ensuite, lorsque tout fonctionnera et que vous aurez du temps, vous pourrez refactorer votre code. Il vaut mieux un site mal codé trop bien qu’un site pourri mais bien codé.
  • Ne cherchez pas à créer une application qui fait tout ce que vous avez en tête : vous ne la finirez jamais. Commencez par une version 0.1 qui fait le minimum, puis travaillez sur de nouvelles versions, légères, chacune apportant une seule fonctionnalité, au fur et à mesure.
  • Ne soyez pas avare... Sortir un site ou une application avec un max de publicité fera fuir la majorité de vos utilisateurs. Faites vous un nom… c’est bien plus important. Il vaut mieux vendre 100 000 applications qui rapportent chacune 1 centime par an que 100 applications qui rapportent 10 euros par mois… Car 100 000 personnes ont une force d’émulation et de communication sur votre application que vous n’aurez jamais... (Ou alors il faut vous demander pourquoi vous développez... Pour vous, ou pour l’argent ?)
  • Développez même si ce que vous voulez développer existe déjà. Ca vous intéresserait de le développer ? Faites le.
  • Ne développez pas si quelque chose existe déjà (hum !). Dans le cas où vous avez besoin d’un outil pour une utilisation one shot ou pour un truc un peu compliqué, et que le développer ne vous motive pas plus que ça, cherchez un outil tout fait.
  • N’oubliez pas que déployer et faire fonctionner une application sur un autre environnement peut prendre énormément de temps !
  • Ne vous spécialisez pas sur une technologie. Devenir un "expert" sur une seule techno vous rendra petit à petit allergique à d’autres technos qui auraient pu vous plaire davantage ! (.Net, Ruby, PHP, C++, Java, Python, ...)
  • Si vous travaillez dans le développement, spécialisez vous (la majorité des entreprises cherchent des experts qui maitrisent leur langage et leur framework).
  • Testez, testez, testez, testez, testez et faites tester !
  • Allez au plus simple ! Restez minimalistes ! Pourquoi Google, Amazon et Twitter marchent-ils si bien ? Parce qu’ils sont simplifiés à l’extrême. Privilégiez le simple et attirant au compliqué qui fait si peur !

Bon dev à tous !

Nettoyer un sélecteur jQuery

icon Tags de l'article :

Octembre 09, 2013
Aujourd'hui j'ai rencontré un léger souci avec jQuery.
J'avais besoin de récupérer un objet HTML dont l'id contenait des crochets [ ], et ceci :

$('#MonInput[3]')

me renvoyait undefined à chaque fois.
En fait les crochets servent à autre chose dans les requêtes jQuery. Il faut donc les échapper avec "\\" pour que notre requête sur l'id marche :

$('#MonInput\\[3\\]')

Sauf qu'échapper à chaque fois les caractères, lorsqu'on en a beaucoup, ce n'est pas forcément pratique. De plus si le sélecteur de notre input est dans une variable, il faut faire des replace...
Le plus simple était donc de faire une méthode pour ça :

function CleanSelector(selector) {
    return selector.replace(/([^a-zA-Z0-9_-])/g, '\\\\$1');
}

Cette méthode va échapper avec "\\" tous les caractères non alphanumériques (+ underscore et tiret) !
Nous n'avons donc plus qu'à appeler notre méthode :

$('#' + CleanSelector(monInputSelector))

Et voilà le travail !
Bonne journée à tous !

Récupérer la valeur de l'attribut Display Name d'une propriété en ASP.Net MVC

icon Tags de l'article :

Octembre 08, 2013
Lorsqu'on développe en ASP.Net MVC, on a parfois besoin d'afficher un label avec un nom clair pour une des propriétés de notre ViewModel. Chose que nous faisons avec l'attribut "Display" :

[Display(Name = "Nom complet")]
[StringLength(50)]
public string NomComplet { get; set; }

Nous pouvons ensuite afficher notre label correspondant à l'aide de :

@Html.LabelFor(model => model.NomComplet)

Sauf que le code généré sera un objet html "Label", sous la forme :

<label for="NomComplet">Nom complet</label>

Donc pas toujours exploitable. En effet, il se peut que nous n'ayons besoin que de la valeur de l'attribut Display(Name) !

Et bien en fait... La solution est très simple, il suffit d'utiliser :

@Html.DisplayNameFor(model => model.NomComplet)

Evident non ? Pourtant je suis passé à côté et je l'avais recodé à la main :

public static MvcHtmlString GetDisplayName<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
	var metaData = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
	string displayName = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression));
	return MvcHtmlString.Create(displayName);
}

La solution est parfois juste sous nos yeux...

EDIT : Sauf que voilà ! Il y a un piège ! Ce que le DisplayNameFor renvoie est encodé en HTML (vu qu'il s'agit d'une MvcHtmlString) !

Du coup, deux possibilités pour récupérer notre label sans l'encodage HTML :

Utiliser Html.Raw et HttpUtility.Decode :

@Html.Raw(HttpUtility.HtmlDecode(Html.DisplayNameFor(model => model.NomComplet).ToString()))

Ou alors utiliser une version modifiée du GetDisplayName créé précédemment :

public static IHtmlString GetDisplayName<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
	var metaData = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
	string displayName = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression));
	return htmlHelper.Raw(displayName);
}