StackOverflow en français

Il y a plus d’un an j’ai proposé, sur le nouvellement créé Stack Exchange Area 51, d’avoir une version de Stack Overflow pour les développeurs francophones. À ma grande surprise, les développeurs francophones ont suivi cette proposition et elle est maintenant dans la phase de “Commitment”, ou d’engagement sans même avoir fait de la pub!

Vous désirez vous engager vous aussi? Cliquer sur l’image ci-dessous pour supporter cette proposition!

Stack Exchange Q&A site proposal: Stack Overflow (in French)

Bon développement

SharePoint 2010 and VS2010: Scripts de post-déploiement

Le contexte

Vous développer une application SharePoint 2010 à l’aide de Visual Studio 2010 sur un serveur Windows 2008 64 bits. Vous désirer rouler un script post-déploiement (Powershell par exemple) pour déboguer:

image

Le problème

Lorsque vous y mettez un script, par exemple:

powershell $(ProjectDir)\PowerShellScript\MonSuperScriptPowerShell.ps1

Vous obtenez toujours une erreur lors de l’exécution du script:

Error occurred in deployment step 'Run Post-Deployment Command': The command "powershell $(ProjectDir)\PowerShellScript\MonSuperScriptPowerShell.ps1" exited with error code: 1.

Cette erreur est dû au fait que VS2010 roule dans un mode 32 bits, ainsi que ses scripts post-déploiement, et que les API de SharePoint 2010 roule dans un mode 64 bits. Ce qui crée des erreurs lors de l’exécution de ce dernier.

La solution

Il faut faire rouler le script en 64 bits pour qu’aucune erreur n’apparaisse. Pour ce faire, nous allons utiliser MSBuild pour faire cela.

Nous allons créer le script MonSuperScriptPowerShell.msbuild:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Install" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <Target Name="Install">    
        <Exec Command="powershell .\MonSuperScriptPowerShell.ps1" /> 
    </Target>
</Project>

Celui-ci lorsqu’il sera appelé roulera le script PowerShell dans le mode 64 bits et aucune erreur ne sera généré!

Voici la ligne de commande pour le lancer à partir de VS2010:

%WinDir%\Microsoft.NET\Framework64\v4.0.30319\MSBuild 
$(ProjectDir)\PowerShellScript\MonSuperScriptPowerShell.msbuild

Et voilà, le tour est joué!

Bon post-déploiement!

Source

StackOverflow

Métadonnées de fichiers Multimédia

En récupérant une liste de fichiers multimédia, je me suit retrouvé avec une liste de fichiers à 4 caractères et qui ne signifiait rien. Grrr.... J'ai alors décidé de faire un petit utilitaire pour me permettre de renommer les fichiers selon un pattern que j'avais déjà sur ma machine selon l'artiste, l'album et du titre de la chanson.

Mais une problématique surgit rapidement: Comment récupérer ces métadonnées (principalement des fichiers MP3)?

J'ai donc fait ce que je fais souvent lorsque j'ai une question, je fais une petite recherche. Et j'ai trouvé sur ce résultat de StackOverflow un lien vers le TagLib# (Fonctionnant aussi sur Mono)! Cette librairie de Novell fait tout le boulot pour moi! Il me permet d'accèder au métadonnées et ce pour de nombreux type de fichiers différents. Voici l'exemple basique parmi plusieurs fournit sur leur site:

try
{
   TagLib.File file = TagLib.File.Create ("/path/to/music/file.mp3");
   
   // Read some information.
   string    title   = file.Tag.Title;
   uint      track   = file.Tag.Track;
   string    album   = file.Tag.Album;
   string [] artists = file.Tag.Artists; // Remember, each song can have more than one artist.
   
   ... // Do stuff to title, album, artists.
   
   // Store that information in the tag.
   file.Tag.Title   = title;
   file.Tag.Track   = track;
   file.Tag.Album   = album;
   file.Tag.Artists = artists;
   
   file.Save ();
}
catch {...}

 

Donc si jamais vous avez besoin de métadonnées, je vous suggère grandement celle-ci!

Collection observable surveillant les modifications aux items

J'ai été confronté à une situation lors d'un développement d'une application WPF qui utilisait la classe ObservableCollection, voici la description:

Problème:

Collection d'items qui comporte plusieurs items (qui eux implémente l'interface INotifyPropertyChanged). Je dois faire certains calculs: Total des items à complétés, total des items complétés, items restants, etc. Mais lorsque qu'un de ces items changeait de statut et devenait complété, impossible de pousser l'information (push) à un niveau supérieur.

Solution proposée:

Utilisation d'un thread qui à chaque intervalle X, allez valider les totaux et mettre à jour les données sur l'interface, de façon tirer (pull). N'aimant pas vraiment cette idée et essayant de diminuer au minimum les pull pour privilégier les push, j'ai fait une petite recherche sur le sujet.

Solution implémentée:

J'ai trouvé la une solution sur StackOverflow, qui dérivait de ObservableCollection et implémentait l'interface INotifyPropertyChanged, soit la classe  ObservableCollectionEx<T>. Voici la classe en tant que telle:

 

public class ObservableCollectionEx : ObservableCollection where T : INotifyPropertyChanged 
  { 
    public ObservableCollectionEx() 
      : base() 
    { 
    } 
 
    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
      Unsubscribe(e.OldItems); 
      Subscribe(e.NewItems); 
      base.OnCollectionChanged(e); 
    } 
 
    private void Subscribe(System.Collections.IList iList) 
    { 
      if (iList != null) 
      { 
        foreach (T element in iList) 
          element.PropertyChanged += (x, y) => ContainedElementChanged(y); 
      } 
    } 
 
    private void Unsubscribe(System.Collections.IList iList) 
    { 
      if (iList != null) 
      { 
        foreach (T element in iList) 
          element.PropertyChanged -= (x, y) => ContainedElementChanged(y); 
      } 
    } 
 
    private void ContainedElementChanged(PropertyChangedEventArgs e) 
    { 
      OnPropertyChanged(e); 
    }
}

Très simple et surtout générique. Pour l'utilisation, soren.enemaerke (l'auteur original) propose ce petit bout de code:

ObservableCollectionEx collection = new ObservableCollectionEx(); 
((INotifyPropertyChanged)collection).PropertyChanged += (x,y) => ReactToChange();

Ce que je n'ai pas encore expérimenté, c'est d'étendre cette classe pour offrir un peu plus de fonctionnalités qui serait très utile, ce sera pour une prochaine fois.