Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Un tutor simple sur Silverlight 1.1

Benjamin Roux a publié dernièrement un tutor très simple sur Silverlight 1.1 pour VS 2008 bêta.

Bien que dépouillé ce papier permet à ceux qui ne connaissent pas de voir à l'oeuvre cette nouvelle techno MS explosive qui concurrence non pas flash comme on l'entend (trop) souvent, mais plutôt Flex mais en mieux..

Je conseille à ceux qui ne savent pas à quoi ressemble du code Silverlight de lire ce tutor ici.

Les sources du framework .NET publiées avec VS 2008 !

Voilà une bonne nouvelle : Microsoft va intégrer les sources du framework 3.5 dans Visual Studio 2008, notamment pour faciliter le debug.

Pas d'erreur toutefois: le framework ne devient pas "open source" pour autant, on a tout juste le droit de regarder les sources et de s'en servir pour debugger une application.

Nul doute aussi que la lecture du code source du framework permettra de mieux le comprendre, de s'inspirer des solutions et patterns utilisées pour sa conception et ainsi d'écrire un code encore plus en harmonie avec cette plateforme.

L'annonce de cette bonne nouvelle a été faite sur le blog de Scott Guthrie qui est General Manager chez MS et qui s'occupe notamment des équipes en charge du développement du CLR, de ASP.NET, de Silverlight, WPF, IIS 7.0, etc, etc. Un Monsieur sérieux et influent dont l'annonce vaut bien engagement et qui permet de prendre cette nouvelle très au sérieux. Les anglophones peuvent bien entendu lire la totalité de l'annonce sur le blog de Scott.

kick it on DotNetKicks.com

Une leçon du Rugby aux recruteurs d'informaticiens ?

Après avoir discuté il y a quelques temps dans un billet des leçons que les informaticiens pourraient donner aux politiques, il me semble que le match France / Nouvelle zélande qui a eu lieu hier soir sur le score de 20 à 18 pour la France pourrait bien être riche en enseignement pour tous, et pour les informaticiens en particulier.

Je m'explique. Les All-Black ont été les meilleurs, stratégiquement, techniquement, en terme de puissance physique, d'occupation du terrain, etc. C'est une évidence. La France a seulement été vaillante. Une équipe motivée constituée de bons éléments. Mais pas une équipe championne du monde, de l'aveu même de son entraîneur d'ailleurs.

Et pourtant la France a gagné le match de façon très honorable !

Cela pose problème à tous les sélectionneurs du monde, à tous les recruteurs, à tous les patrons d'équipes notamment dans notre beau métier me semble-t-il...

La norme et la mode dans notre profession est d'exiger des CV toujours plus "blindés", d'exiger une expérience sans faille plus longue parfois que l'existence des produits ou langages sur lesquels elle doit porter (je lu cent fois demander x années d'expérience sur des technos qui venaient de sortir...). Les tests d'embauche sont souvent menés par des gens qui ne pensent qu'à "coincer" le prétendant avec des questions très techniques, des bugs à trouver dans un code par exemple. Beaucoup de ces questionnaires sont basés sur le fameux "haha" c'est à dire que la réponse est évidente.. si on la connaît, et seulement dans ce cas...

Bref on veut des favoris, des tueurs, des gens capables de citer Stroustrup (et savoir l'écrire) dans le texte, et on espère qu'avec de tels candidats on pourra constituer une équipe performante, mieux : la plus performante.

L'équipe de France nous a prouvé hier soir que cette logique est absurde. On peut être dominé par des techniciens qui connaissent mieux leur fondamentaux, par des gens plus pointus techniquement, et pourtant on peut les battre avec une équipe plus faible mais inventive et très motivée...

Quand j'aurai à faire passer des entretiens d'embauche dans le futur, pour mon compte ou en tant que conseil pour mes clients, j'essayerai de me rappeler de la leçon que notre équipe de Rugby nous a donnée le soir du 6 octobre 2007...

BlogEngine, open source, C#, et excellent moteur de blog

Pour ceux qui ne connaissent pas ce projet, un petit billet sur ce super moteur de blog open source écrit en C# qu'est BlogEngine.Net.

Le présent blog est géré par ce moteur qui supporte aussi bien le stockage XML simple et sans contrainte d'installation sur le serveur que SQL Server. Facile à mettre en oeuvre, fonctionne du premier coup et un code qui n'est pas une usine à gaz.

Si vous êtes intéressés, n'hésitez pas à visiter la page du projet :

BlogEngine.NET

kick it on DotNetKicks.com

Une instruction méconnue de C#

Quelques mots sur un opérateur méconnu de C# qui pourtant s'avère très efficace..

Vous connaissez la syntaxe: x = (test) ? (sivrai) : (sifaux);
Cela permet en une instruction d'attribuer la valeur "sivrai" ou "sifaux" à x selon le résultat du test. Cela est très pratique et clarifie la lecture du source comparativement à l'utilisation d'un if/else.

Mais connaissez-vous la version courte de cet opérateur conditionnel ?

Le cas d'utilisation est très fréquent dans un code bien protégé : il s'agit en général d'affectuer une valeur à une variable si la valeur est non nulle, sinon d'affecter une valeur par défaut. Exemple :
string s = variable==null ? "chaîne nulle" : variable;
Ici on se protège contre le fait que la variable "variable" peut être nulle. Dans ce cas on affecte à "s" une chaîne par défaut, sinon on affecte "variable". L'utilisation de l'opérateur ?: se justifie pleinement ici (si on suppose par exemple que "variable" est un paramètre passé à la méthode en cours qui peut, même si cela n'est pas prévu, être passé à null). Cet opérateur rend l'écriture plus concise que l'utilisation de if/else qui serait:
string s; 
if (variable==null) s="chaîne nulle"; else s=variable;

Mais il y a encore plus court !

Le cas évoqué étant très fréquent, C# propose un autre opérateur conditionnel, le ??.
Ce dernier est spécialement étudié pour tester les nuls.
De fait, notre test exemple s'écrit désormais :
string s = variable ?? "chaîne vide";

En réalité l'opérateur ?? a surtout été ajouté pour gérer les types nullables. Lorsqu'on affecte une variable nullable à une autre qui ne l'est pas, il est en effet nécessaire de tester le null pour éviter une exception.
Exemple :

int? a = null; 
int y = a ?? -1;

ici, "a" est un integer nullable, que nous initialisons d'ailleurs à null, alors que "y" est un integer "standard" ne pouvant pas prendre la valeur nulle. L'utilisation de ?? est donc obligatoire ici pour éviter l'exception.
On comprend mieux la raison d'être de cet opérateur ajouté dans C# 2.0 puisque c'est dans cette version qu'on aussi été ajoutés les types nullables.

Néanmoins cette instruction très peu utilisée et méconnue rend aussi service en dehors du contexte des types nullables, notamment avec les types objets qui eux sont nullables depuis toujours. Notre exemple avec une variable string en est une illustration.

Bon développements ! (truffés désormais de "??" qui vous feront passer pour un guru de C# :-) )

Windows Movie Maker plante dès le lancement

Même s'il faut bien l'avouer, le seul soft d'édition de vidéo qui tienne la route sur PC est Adobe Première dès lors qu'on souhaite faire des choses un peu précises, Windows Movie Maker qui est intégré dans XP et Vista est une solution simple, gratuite et assez puissante pour bon nombre d'utilisateurs.

Hélas de très nombreuses personnes rencontrent le même problème : WMM crash dès le lancement. Parfois il semble que qedit.dll soit incriminé. Après de très nombreuses recherches infructueuses, j'ai trouvé la solution qui marche, en tout cas dans mon cas.

La description du problème est peu importante en soi (une histoire de cache des effets directvideo semble-t-il), la solution est tellement déconcertante de simplicité :

  1. localiser le répertoire Program Files/Intervideo
  2. le renommer en TempXXX (comme vous le voulez en fait)
  3. Lancer WMM, et là magie ça marche... Refermer l'appli
  4. renommer correctement le répertoire Intervideo

Et là WMM fonctionne désormais comme un charme...

Bien entendu si vous n'avez pas le répertoire Intervideo ça vient d'ailleurs, mais dans le principe c'est qu'un soft sur votre disque installe des filtres Directvideo ce qui brouille la création du cache de WMM. il suffit d'appliquer la même méthode sur le répertoire de l'application en question à la place de Intervideo et ça devrait marcher aussi.

kick it on DotNetKicks.com

L'informatique : l'avenir de la politique ?

Nos politiques devraient s'adjoindre les conseils d'informaticiens et de logiciens, ils feraient moins de bêtises...

En effet, seul un logicien possède le savoir et et les outils qui permettrait de mettre de l'ordre dans l'énorme base de règles que sont les lois. Notre pays compte 9000 lois et 120.000 décrets (recensement 2000) qui se contredisent et nous gouvernent, c'est un état de fait délirant. Un grand nettoyage comme le fit Napoléon avec son code éponyme est pourtant aujourd'hui à nouveau nécessaire. Peut-on faire confiance aux politiques en place pour un tel travail ? non, bien entendu.

Quant aux informaticiens ils apprendraient aux politiques que la course à la croissance est une erreur. Pendant des années les constructeurs de PC ont misé sur une vitesse de plus en plus grande des processeurs. Cette course folle s'arrête un jour, et on doit apprendre à faire toujours mieux (le progrès) mais sans forcément disposer d'éléments plus rapides. Meilleures architectures, parallèlisme (multi coeur) sont les réponses de l'informatique. Les politiques et les économistes libéraux devraient s'en inspirer et réviser leur copie.

Il faudrait alors faire comprendre aux politiques que "miser" sur des croissances de 2 à 3 % par an ne peut qu'aggraver la situation : il faudra bien un jour gérer le progrès et le bien être sans aucune croissance absolue, sauf à vouloir monopoliser toutes les ressources de la terre pour une poignée de nations, avec son lot de guerres à venir pour l'appropriation de ces ressources. Capitalisme forcené et libéralisme à l'américaine sont les cancers de nos civilisations, qui causeront notre chutte comme on s'étonne des siècles après qu'un empire comme celui de Rome ait pu un jour s'effondrer.

De même vouloir une natalité forte pour assurer le paiement des retraites est une hérésie. Ces nouveaux-nés, plus nombreux à chaque génération appellent donc encore plus de nouveaux nés dans la génération suivante pour payer leur retraite ! Comment peut-on avoir le cran de baser une politique sur ce qui est un cul-de-sac et un paradoxe logique ? Comment envoyer au mur notre pays avec des arguments aussi farfelus sans que personne ne réagisse ? Comment des gens peuvent-ils appuyer, voter, applaudir les discours d'un président qui fait le "pari" d'une croissance perpétuelle ?

Le bon sens n'est, hélas, pas la chose la mieux partagée, le philosophe se trompait lourdement.

Pister les modifications de schéma (SQL Server)

Maintenir une base de données est toujours délicat notamment en raison des modifications de schéma parfois nécessaires durant le développement d'une application ou sa maintenance.

De même il peut s'avérer utile de pister, chez un client/utilisateur, toute modification du schéma qui pourrait destabiliser l'application (tout en rendant celle-ci coupable des problèmes éventuels, donc engageant votre responsabilité...).

Reconstruire l'historique des modifications de schéma pour ensuite les centraliser dans un script de mise à jour de la base de données peut aussi être un plus très appréciable.

Mais comment pister et conserver ces modifications et où les stocker de façon sûres ?

Avec SQL Server la réponse tient en un simple trigger et en l'utilisation habile du type de donnée XML !

Vous l'avez compris le suivi des modifications sera stocké dans la base elle-même, pratique et fiable cela évite la présence de fichiers annexes risquant d'être perdus.

Etape 1 : Créer la table pour stocker les modifications

CREATE TABLE [Audit].[ModifSchema](

[EventID] [int] IDENTITY(1,1) NOT NULL,
[EventData] [xml] NULL,

PRIMARY KEY CLUSTERED
(
   [EventID]
ASC
) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Etape 2 : Créer le trigger

CREATE TRIGGER [Trig_AuditModifSchema]
ON
DATABASE
FOR
DDL_DATABASE_LEVEL_EVENTS
AS
INSERT
INTO Audit.ModifSchema(EventData
)
SELECT EVENTDATA
()
GO
ENABLE TRIGGER [Trig_AuditModifSchema] ON DATABASE

Etape 3 : il n'y a pas d'étape 3 c'est FINI !

Désormais, lors de toute modification du schéma de la base de donnée un événement sera enregistré dans la table et il sera possible de consulter, sous la forme d'une entrée XML facilement lisible et analysable par tout outil ou portion de code, l'ensemble des modifications. Voici un exemple : 

<EVENT_INSTANCE>
    <
EventType>ALTER_TABLE</EventType
>
    <
PostTime>2007-06-03T20:12:05.813</PostTime
>
    <
SPID>55</SPID
>
    <
ServerName>CHI100906</ServerName
>
    <
LoginName>MYDOMAIN\myusername</LoginName
>
    <
UserName>dbo</UserName
>
    <
DatabaseName>Sales</DatabaseName
>
    <
SchemaName>dbo</SchemaName
>
    <
ObjectName>Products</ObjectName
>
    <
ObjectType>TABLE</ObjectType
>
    <
TSQLCommand
>
        <
SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON"      QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"
/>
        <
CommandText>
ALTER TABLE dbo.Products
    DROP COLUMN testremove
       </CommandText
>
  </
TSQLCommand
>
</
EVENT_INSTANCE>

A noter, la fonction EVENTDATA() est fournie par SQL Server à l'intérieur d'un trigger DLL et renvoie toutes les données sous la forme d'un document XML.

Cette idée astucieuse a été publiée par plusieurs auteurs sous différentes formes, je ne m'en attribue pas la paternité. On la retrouve par exemple sur le Richard's C# blog, un blog riche que je conseille pour ceux qui lisent l'anglais, of course.

 

kick it on DotNetKicks.com

Nouvelle rentrée, nouveau blog !

Bienvenue à toutes et à tous !

"Vous mé réconnéssé ? " Laughing

Pour ceux qui ne savent pas qui je suis, en deux mots : dirigeant de e-naxos, auteur de plusieurs ouvrages sur Delphi et C# chez Eyrolles, partenaire Borland de longue date (même si depuis le tournant Codegear nos voies se sont séparées), partenaire Microsoft. Ceux qui fréquentent ces milieux m'ont reconnu.

Ce nouveau blog, installé sur mon propre serveur, va me permettre de m'exprimer avec le maximum de liberté.

Non pas que le blog que je possède de longue date sur Developpez soit spécialement censuré, mais vous savez ce que c'est, il ne faut pas froisser untel, ou tel autre qui prend la mouche parce qu'on ne dit pas que du bien de tel produit ou éditeur ... Censure réelle ou auto-censure, le résultat est le même.

J'avais donc besoin d'un espace autogéré, j'ai trouve BlogEngine, un très beau moteur de blog open source en C#, et voilà comment est né Dot.Blog ! Blog avant tout technique, mes humeurs n'y seront pas donc forcément absentes mais Dot.Blog ne sera pas un blog d'opinion. 

C#, le framework .NET, Visual Studio, SQL Serveur, Silverlight, Ajax, Linq, sont autant de sujets qui me viennent à l'esprit et qui feront bientôt l'objet de billets ici.

Alors marquez cette page et revenez souvent y lire et y commenter les billets !

A très bientôt,

Olivier