Certificat IISExpress manquant

icon Tags de l'article :

Novembre 24, 2014
Un petit bug sur lequel je suis tombé il y a quelques jours, alors que je voulais lancer en local un projet Azure :

Windows Azure Tools: Error: IISExpress Development certificate is not installed.

Pour le résoudre, on m'avait suggéré plusieurs choses :
- réinstaller le SDK, aucun effet
- vérifier les prérequis dans les composants Windows (étape 11 ici), OK
- vérifier qu'on a bien la dernière version d'IISExpress d'installée, OK

Mais en allant dans les certificats (mmc / certificats) je me suis rendu compte que je n'avais tout simplement pas de certificat "localhost" pour IISExpress.



A son installation, IISExpress est censé installer un certificat localhost pour l'utiliser par la suite... Pourtant absent ici.

La solution ? Réparer IISExpress.



Tout simplement !

Bon dev à tous !

Partager l'accès à sa base de données SQL Server avec quelqu'un

icon Tags de l'article : ,

Septembre 17, 2014
Un truc qui a priori parait simple, mais qui au final ne l'est pas tant que ça...

Voyons comment faire.

Déjà il faut ouvrir son SQL Server Management Studio, aller dans les propriétés du serveur, l'onglet Connections, et vérifier que l'option Allow remote connections to this server est bien cochée.



Ensuite il faut ouvrir Sql Server Configuration Manager, aller dans SQL Server Network Configuration, Protocols for MSSQLSERVER et passer TCP/IP en Enabled :



Vérifier également dans l'onglet Sécurité que la connexion via Windows ET SQL Server est autorisée.

Enfin, il faut aller ouvrir le port TCP 1433 dans le pare-feu Windows :



Et voilà, simple non ?

Allez, bon dev à tous ! :)

Un petit outil pour gérer ses fichiers de traduction en PHP

icon Tags de l'article : , ,

Septembre 17, 2014
Hello,

Juste pour ceux que ça intéresse, voici un petit outil très simple que j'ai développé pour moi afin de gérer les traductions dans mes applications en PHP.

Resmanager (sur Github)

Le fonctionnement est très simple :
  • on remplit le fichier resources.lng avec nos traductions
  • on lance le petit exécutable ResourcesSplitter.exe
  • ce dernier va générer automatiquement des fichiers PHP avec nos traductions, un fichier par langue
  • on n'a plus qu'à inclure/utiliser ces fichiers dans nos applications

Le petit exe est fait en .Net, il est très simple et son code source est également présent sur le repository (fichier ResourcesSplitter.cs).

Voilà, on ne sait jamais, ça vous servira peut-être ! Si vous avez des questions n'hésitez pas !

Bon développement à tous !

(Et oui, pour ceux qui se demandent, je m'en sert pour la nouvelle version à venir de MyCryptoChat :)

Android : découverte par la pratique et développement d'un jeu vidéo #1

icon Tags de l'article : , ,

Aout 14, 2014
Introduction

Quel type de jeu développer

Bon, la première étape, lorsqu'on veut développer un jeu vidéo, est de décider quel type de jeu vidéo on souhaite développer.

Certaines personnes me conseilleraient de commencer simple, avec un jeu type Morpion, tandis que d'autres me conseilleraient de commencer directement par un Super Mario 64 en 3D de la mort qui tue.

Je pense viser l'entre-deux, en choisissant de développer un clone de "Space Invaders en 2D". C'est un type de jeu très simple (avec un minimum de complexité à gérer) mais surtout il y a déjà beaucoup d'exemples en ligne. Ainsi je suis assuré de trouver des ressources et de l'aide en cas de blocage.



Quel device

Je veux faire un jeu pour Android, mais qui marchera aussi sur Windows.

Ce sont les deux OS que j'utilise le plus, et je compte bien développer un jeu tellement bon que j'y jouerais tout le temps, que ce soit sur mon PC ou sur mon smartphone !
Il est impossible, pour un simple développeur, de sortir un jeu disponible sur TOUS les supports... Mais en visant juste ces deux supports, je suis assuré de toucher 90% des gamers et autres geeks.
Enfin, je trouve qu'on manque trop de jeux de qualité sur Android. Autant remédier à ça tant qu'on y est.


Source image


Quel IDE

Il va falloir ensuite que je choisisse un IDE. Les deux principaux étant Eclipse et Android Studio.

La majorité des ressources en ligne (sur le développement Android) étant sur Eclipse, et trouvant qu'Android Studio manque un peu de maturité, j'ai décidé d'utiliser Eclipse.
Surtout qu'on peut désormais télécharger une version d'Eclipse qui embarque le SDK Android :D


Source image


Comment fonctionne un jeu vidéo 2D

Pour tout jeu vidéo 2D, il y a 5 notions simples à retenir :
  • La main game loop, la boucle principale dans le code où tout se passe.
  • Les sprites, qui sont les images qu'on affichera à l'écran. Il faut noter que dans un jeu 2D, TOUT est sprite. Les animations ne sont que l'enchainement de différents sprites.
  • Les collisions, et les actions qui en découlent (chevauchement, réactions, animations, etc.).
  • Les sons, parce que sans ça un jeu est fade.
  • Et enfin les contrôles utilisateur. Ca peut être le couple Clavier/Souris sur PC, le tactile sur smartphone, l'accéléromètre, les mouvements des mains à l'aide du Leap, un couple volant/pédalier, etc.

Grâce à ces 5 notions, nous pouvons créer n'importe quel type de jeu vidéo 2D ! :D

Appliquer ces notions

Aujourd'hui, il existe de nombreux Game Engines qui gèrent nativement ces 5 notions. A quoi bon tout recoder quand de très bonnes librairies existent pour ça ?
Moi ? Fainéant ? Pas du tout ! :)

Pour notre projet, nous allons donc utiliser libgdx, un game engine opensource (sous licence Apache 2). Développé en Java, il est cross-platform (Windows, Linux, Mac, Android, iOS, HTML), gère les fichiers audio, les contrôles utilisateur, les maths et la physique (gravité, mouvements, etc.), les fichiers, et enfin les graphismes 2D (OpenGL ES 2.0).

Libgdx est donc parfait pour nous, car il va nous permettre de créer un jeu Android ET Windows très facilement.


Source image


Et maintenant ?

Maintenant que nous avons vu le quoi, qui, comment et pourquoi... Nous allons pouvoir commencer à développer.

Pour ça direction la partie 2 qui arrivera d'ici une petite semaine.

Bon weekend, Stay tuned!

Nouveau projet : développement d'un jeu vidéo sur Android

icon Tags de l'article : , ,

Aout 14, 2014
Bonjour à tous !

Pour changer un peu du monde .Net, j'ai décidé de commencer une nouvelle série de tutoriels sur le développement Android.


Tous ceux qui me connaissent bien savent que je suis un grand passionné de jeux vidéos, et qu'un de mes rêves serait de monter ma boite de développement de jeux Windows & Android...
Sauf que je n'arrive pas à me motiver et à à trouver le temps de me plonger dans le développement Android.

J'ai donc décidé de faire ça de façon diluée et ludique, en publiant chaque semaine un article sur ce que j'ai fait, pourquoi, comment, et où j'en suis.
Je vais essayer de me tenir à mon objectif d'un article par semaine, pas plus pas moins, afin de me forcer à travailler dessus régulièrement. Tant pis si l'article n'est pas complet ou pas fini !

Et, qui sait, peut-être que ça vous sera utile et que vous aussi vous vous mettrez au développement de jeux sur Android !

La première étape de ce fabuleux voyage arrivera sous peu.

Stay tuned!

Tests unitaires, présentation

icon Tags de l'article : , ,

Mars 25, 2014
Aujourd'hui, je vais vous parler de tests unitaires.

On teste tous nos développements. Que ce soit en compilant et regardant rapidement si ça marche, en déroulant un cahier de tests, en faisant n'importe quoi pour voir si on arrive à planter l'application, etc.

Sauf qu'assez peu de gens font des tests unitaires.

C'est triste, car il s'agit du meilleur moyen d'améliorer considérablement la qualité de vos développements, mais aussi d'anticiper sur les différents bugs à venir.

En effet, beaucoup de développeurs auront tendance à considérer les tests unitaires comme une perte de temps, voire un truc plutôt gadget qui coute toujours plus que ce qu'il apporte.

Ce n'est pas vrai.

De vrais bons tests unitaires auront effectivement un cout assez lourd au départ, mais ce cout sera vite amorti si vous passez du temps sur votre application.

Ca peut sembler idiot, mais c'est vrai.

A chaque développement, il y a un risque de coder un ou plusieurs bug. Voire même de faire réapparaître un ancien bug. Les tests unitaires permettent d'éliminer 90% des bugs.

Le vrai problème qui se pose est donc : comment bien faire mes tests unitaires ?

Nous verrons cela très bientôt, dans de futurs articles :
  • Quand faire des tests unitaires ?
  • Les tests de connectivité
  • Présentation des tests unitaires pour la couche d'accès aux données
  • Présentation des tests unitaires pour la couche métier

Bonne soirée !

Faut-il créer sa variable dans la boucle, ou en dehors ?

icon Tags de l'article :

Mars 24, 2014
Il s'agit d'une question qu'on a tous, je pense, entendu au moins une fois. Il existe trois types de réponses :

  • Il faut créer ta variable dans ton for, comme ceci :

for(int i = 0 ; i < maListe.Count ; i++) 
{
	int monI = maListe[i];
}

  • Pas du tout, il faut la créer avant :

int monI;
for(int i = 0 ; i < maListe.Count ; i++) 
{
	monI = maListe[i];
}

  • Et la bonne réponse : ça ne change rien.

Il faut savoir que les "variables" éphémères (monI dans ce cas) n'existent que pour le développeur.

En effet, le compilateur est capable d'identifier les variables qui ont une utilisation très spécifique, dans un scope réduit. Il remplacera alors l'utilisation de la variable par un accès direct à cette dernière.

Sur notre exemple :

for(int i = 0 ; i < maListe.Count ; i++) 
{
	int monI = maListe[i];
}

// génèrera strictement le même code MSIL que :

int monI;
for(int i = 0 ; i < maListe.Count ; i++) 
{
	monI = maListe[i];
}
// je n'utilise plus monI à partir d'ici

L'endroit où nous créerons notre variable monI n'a donc aucun impact sur le code MSIL généré.

Néanmoins, il est plutôt conseillé de la créer à l'intérieur du for, et ce pour plusieurs raisons :
  • L'optimiseur comprendra directement que la variable ne sera utilisée que dans la boucle et pas en dehors,
  • On ne transportera pas, à chaque itération, la valeur précédente,
  • On ne risque pas, par inadvertance, de la réutiliser en dehors de la boucle.

Mais il s'agit plus d'une bonne pratique que d'une optimisation.

Bonne soirée et bon dev à tous !

Méthodes d'extensions C# - 2

icon Tags de l'article :

Mars 24, 2014
Bonjour à tous !

Prêts pour une nouvelle fournée de méthodes d'extensions C# super-méga-ultra utiles ?

C'est parti !

Déjà, une méthode d'extension pour la classe string afin de faire bien plus rapidement nos String.Format (et non pas string.Format) :

public static string Format(this string s, params object[] args)
{
    return String.Format(s, args);
}

// et son appel

string myString = "{0} {1}";
myString.Format("Hello", "World");

Ensuite, une autre petite méthode qui va nous servir de raccourci : créer notre propre méthode d'extension Log sur la classe Exception pour unifier le logging de nos erreurs :

public static void Log(this Exception obj)
{
    // votre logique de logging ici
}

// et son utilisation

try
{
    // votre code
}
catch(Exception ex)
{
    ex.Log();
}

Ces deux petites méthodes vous feront gagner un temps fou, croyez-moi ;)

Bon dev à tous !

Méthodes d'extensions C# - 1

icon Tags de l'article :

Mars 21, 2014
Hello à tous,

J'ai décidé de commencer une petite série d'articles sur les méthodes d'extensions vraiment utiles.

A force de développer en C# sur différents projets, je me suis rendu compte que je m'étais constitué un joli petit pool de méthodes d'extensions... que je vais partager avec vous. Merci qui ? :)

Pour commencer, voici une méthode d'extension qui sert à faire un .Contains() case-insensitive sur une collection. Ca peut sembler simple et idiot, mais le faire à la main plusieurs fois est encore plus embêtant :

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    return source.IndexOf(toCheck, comp) >= 0;
}

// et son appel

bool contains = myString.Contains("hello", StringComparison.OrdinalIgnoreCase);

Et pour continuer sur cette lancée, voici une petite méthode d'extension pour vérifier si notre objet est présent dans une liste d'objets passés en paramètres, bien plus utile que ça en a l'air :

public static bool IsIn<T>(this T source, params T[] list)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    return list.Contains(source);
}

// et son appel

if (myString.IsIn("string1", "string2", "string3", "string4"))
{
    // do something
}

Bon weekend et bon dev à tous !

DateTime.Now ou DateTime.UtcNow

icon Tags de l'article :

Mars 20, 2014
Et vous, comment vous faites avec les dates ? - Doc Emmet Brown, ou pas.

Aujourd'hui on utilise tous les dates dans nos applications : récupération de la date courante, stockage d'une date précise, calculs sur des dates, etc.

Sauf qu'il existe deux façons de récupérer et de manipuler la date courante :

DateTime.Now
// ou
DateTime.UtcNow

Maintenant la question : laquelle utiliser ?

La réponse est simple : DateTime.UtcNow.

Pourquoi ?

Déjà DateTime.UtcNow est bien plus performant que DateTime.Now (du fait de ne pas avoir à gérer le fuseau horaires et les changements d'heure).

Ensuite, stocker des dates au format UTC permet d'éviter les nombreux problèmes d'incohérences sur les dates. En effet, utiliser DateTime.Now vous posera problème dès que vous hébergerez votre application dans un autre fuseau horaire (merci le Cloud !), dès que vous migrerez vos données, dès que vous effectuerez des calculs sur les dates, ...

Après vous pouvez toujours convertir la date pour l'afficher ou la manipuler, mais pour le stockage et à la récupération, il faut privilégier DateTime.UtcNow.

Vous ne direz pas qu'on ne vous a pas prévenu !

EDIT : Attention, il existe une exception : la réutilisation de dates. Lorsqu'on veut stocker une donnée au format date la réutiliser (par exemple planifier un rendez-vous récurrent tous les vendredis à 9h00), il ne faut pas la stocker au format UTC. Pourquoi ? Si on la stocke au format UTC et qu'on la convertie à chaque fois, le jour où on changera d'heure... Notre rendez-vous aussi changera d'heure ! Dans ce genre de situations (assez rares, il faut bien l'admettre), la solution est d'utiliser le DateTimeOffset.