Dot.Blog

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

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