Afficher des bulles de notification dans la barre des tâches en C#

icon Tags de l'article : , ,

Avril 16, 2015
Hello,

Un besoin qui revient souvent en C#, pour des appli Winforms simples : pouvoir afficher des notifications dans la barre des tâches en C#.

Pour cela, j'utilise toujours la même méthode : un notifyIcon et l'appel à la méthode ShowBalloonTip :

this.notifyIconFormMain.Visible = true;
this.notifyIconFormMain.BalloonTipIcon = ToolTipIcon.Info;
this.notifyIconFormMain.BalloonTipTitle = "Relax your eyes";
this.notifyIconFormMain.BalloonTipText = string.Format("You will have to relax your eyes in {0} minutes.", minutes);
this.notifyIconFormMain.ShowBalloonTip(4); // 4 = le nombre de secondes d'affichage du message

Et voilà, une bulle apparaitra dans le coin de votre écran pour afficher votre message pendant 4 secondes !



Bon dev à tous !

Verrouiller une session en C#

icon Tags de l'article : , , ,

Avril 15, 2015
Hello,

Juste un mini article : comment verrouiller une session en C#.

La réponse est simple, à l'aide de ce petit morceau de code qui utilise user32.dll :

private const int WmSyscommand = 0x0112;
private const int ScMonitorpower = 0xF170;
private const int HwndBroadcast = 0xFFFF;
private const int ShutOffDisplay = 2;
[DllImport("user32.dll")]
private static extern void LockWorkStation();
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

Voilà, vous n'avez plus qu'à appeler la jolie méthode LockWorkStation qui s'occupera de verrouiller la session utilisateur ! Pensez juste à faire attention quand vous testez, car si vous mettez ça dans une boucle vous risquez d'être bloqué... [oui, ça sent le vécu]

Bon dev!

source

Une classe de base pour manipuler SQLite facilement en C#

icon Tags de l'article : ,

Avril 03, 2015
Hello à tous,

Aujourd'hui je vais vous parler de SQLite. Lors d'un projet récent, j'ai eu à manipuler une BDD SQLite en C#. Pour cela j'ai créé une classe qui peut vous intéresser.

La première étape, pour manipuler du SQLite, est d'installer le package Nuget SQLite (et ses prérequis).

Ensuite, j'ai créé cette classe abstraite :

using System;
using System.Collections.Generic;
using System.Data.SQLite;

public abstract class BaseDA<T>
{
	public string ConnectionString { get; set; }

	public BaseDA(string connectionString)
	{
		this.ConnectionString = connectionString;
	}

	protected T GetUniqueItem(string sql, Func<SQLiteDataReader, T> mappingMethod)
	{
		var connection = new SQLiteConnection(this.ConnectionString);

		try
		{
			var command = new SQLiteCommand(sql, connection);

			var reader = command.ExecuteReader();

			if (reader.Read())
			{
				return mappingMethod(reader);
			}
		}
		finally
		{
			connection.Close();
		}

		return default(T);
	}

	protected IEnumerable<T> GetItems(string sql, Func<SQLiteDataReader, T> mappingMethod)
	{
		var connection = new SQLiteConnection(this.ConnectionString);

		try
		{
			var command = new SQLiteCommand(sql, connection);

			var reader = command.ExecuteReader();

			var result = new List<T>();

			while (reader.Read())
			{
				result.Add(mappingMethod(reader));
			}

			return result;
		}
		finally
		{
			connection.Close();
		}
	}

	protected int ExecuteNonQuery(string sql)
	{
		var connection = new SQLiteConnection(this.ConnectionString);

		try
		{
			var command = new SQLiteCommand(sql, connection);

			return command.ExecuteNonQuery();
		}
		finally
		{
			connection.Close();
		}
	}
}

Comme vous le voyez, cette classe contient 3 méthodes basiques me permettant de requêter facilement ma BDD SQLite.

Je n'ai plus qu'à créer une classe qui hérite de cette classe abstraite, pour, par exemple, gérer mes utilisateurs :

using ApiManager.BusinessEntities;
using System.Collections.Generic;
using System.Data.SQLite;

public class UserDA : BaseDA<UserBE>
{
	public UserDA(string connectionString) : base(connectionString)
	{
	}

	public UserBE GetUserByLogin(string login)
	{
		var sql = string.Format("SELECT * FROM User WHERE Login='{0}'", login);

		return GetUniqueItem(sql, this.MapUser);
	}

	public IEnumerable<UserBE> GetUsers()
	{
		var sql = "SELECT * FROM User";

		return (IEnumerable<UserBE>)GetItems(sql, this.MapUser);
	}

	public bool AddUser(UserBE user)
	{
		var sql = string.Format("INSERT INTO User VALUES ('{0}', '{1}', {2})", user.Login, user.Password, user.IsAdmin ? "1" : "0");

		return ExecuteNonQuery(sql) == 1;
	}

	public bool DeleteUser(int idUser)
	{
		var sql = string.Format("DELETE FROM User WHERE Id = {0}", idUser);

		return ExecuteNonQuery(sql) == 1;
	}

	private UserBE MapUser(SQLiteDataReader reader)
	{
		return new UserBE()
		{
			Id = (int)reader["Id"],
			Login = reader["Login"].ToString(),
			IsAdmin = (bool)reader["IsAdmin"],
			Password = reader["Password"].ToString()
		};
	}
}

Voilà, en résumé :
  • Ma classe mère, BaseDA, contient 3 méthodes pour requêter la BDD à partir de la connection string passée dans le constructeur.
  • Ensuite on crée une classe qui hérite de BaseDA et qui appelera le constructeur de cette dernière.
  • Enfin, on n'a plus qu'à appeler les méthodes de la classe mère avec le SQL désiré (et la méthode de mapping reader => objet dans le cas des méthodes de Get)

Voilà, on ne sait jamais, ça vous servira peut-être un jour !

Bonne journée à tous... Et bon weekend !

Comment stocker ses mots de passe en .Net

icon Tags de l'article : , ,

Novembre 24, 2014
Il existe de nombreuses façons de stocker les mots de passe pour une application ou un site web. La triste nouvelle, c'est que la majorité des sites et des applications n'utilisent pas les bonnes.

Aujourd'hui nous allons voir comment bien faire les choses.

Déjà, voici les différentes façons de faire, de la plus ridicule à la plus paranoïaque :

  • Niveau 0 : tout en clair. Rien de bien compliqué, aucune sécurité, la moindre fuite de données et on doit demander à nos utilisateurs de changer de mots de passe... Vraiment pas top pour l'image. Sécurité : 0%

  • Niveau 1 : mots de passe hashés avec une clef en dur. Pourquoi pas, sauf que... ça ne sert à rien. Le hacker n'aura qu'à générer des rainbow tables à partir de votre clef, et il aura les correspondances en clair pour tous les mots de passe hashés en base. Sécurité : 1%

  • Niveau 2 : on hashe les mots de passe avec un sel, généré aléatoirement pour chaque utilisateur. Un petit peu mieux. Seul bémol : il suffit de régénérer des Rainbow Tables, une par utilisateur, et ... on a tous les mots de passe. Sécurité : 5%

  • Niveau 3 : on hashe les mots de passe avec un sel, généré aléatoirement pour chaque utilisateur, à l'aide d'un algorithme lent : BlowFish. Ici on corrige le principal problème du niveau 2 : générer des Rainbow Tables pour chaque utilisateur peut prendre des jours, voire des mois... Sécurité : 80%

  • Niveau 4 : on utilise un module physique pour hasher les mots de passe. Si quelqu'un essaye de le déplacer ou d'y accéder, il effacera automatiquement toutes les données. Vous l'avez compris, il s'agit du mode paranoïaque ! Sécurité : 99%

Vous l'aurez compris, on va surtout s'intéresser au niveau 3, facilement réalisable et ne demandant pas, lui, d'investissements financiers. La clef repose sur le fait d'avoir un sel généré unique par utilisateur, et d'utiliser l'algorithme lent BlowFish. A l'échelle d'un site web, le temps de hash de l'algorithme est court. Mais lorsqu'on fait du bruteforce, le temps pour générer un dictionnaire entier de mots de passe est gigantesque !

La mise en place est plutôt simple :

Il faut d'abord créer deux entrées dans notre base, une pour le mot de passe hashé, et une pour le sel. Il ne faut jamais stocker ni déplacer le mot de passe non hashé. Si vous voulez bien faire les choses, utilisez HTTPS et stockez le sel ailleurs.



Ensuite, il faut ajouter BCrypt.Net à notre projet (via NuGet) :



Cette implémentation de l'algorithme BlowFish offre 2 méthodes : GenerateSalt et HashPassword, à utiliser comme suit :



Maintenant vous n'avez plus qu'à implémenter la bonne logique dans votre code :
  • Lorsque l'utilisateur s'inscrit, on génère et stocke un salt aléatoire pour lui, puis on se sert de ce salt pour hasher son mot de passe.
  • Lorsqu'il se connecte, on récupère le salt, et on hashe le mot de passe saisi à l'aide du salt pour ensuite comparer les deux hashs générés.
  • Lorsqu'il a perdu son mot de passe, on génère un mot de passe et un salt aléatoires, pour ensuite lui envoyer un mail avec son nouveau mot de passe.

Voilà, j'espère que ce petit article vous a plu,

Bonne soirée à tous !

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 !