Windows Server : Bien redémarrer le service WebClient.

Symptôme : Des commandes “net use” ne fonctionnent pas (Erreur 67, 53, ou “The workstation driver is not installed”, “Le pilote de station de travail n’est pas installé”)
Diagnostic : Le service “WebClient” n’est pas démarré OU des services dépendants ne sont pas lancés (webdav).
Solution: Valable pour tout type de symptômes, voici les commandes à passer dans cet ordre :
net stop webclient
net stop mrxdav
net start mrxdav
net start webclient

Snake7 : Algorithme du mouvement du serpent

Voici comment j’ai développé le mouvement du serpent dans Snake7. Pour rappel, le serpent va dans toutes les directions de manière fluide (à l’inverse du serpent classique qui va de « carré en carré » dans 4 directions).
[youtube=http://www.youtube.com/watch?v=CbzXohlMvMc]
Situation de base : Le serpent est constitué de plusieurs tronçons et de la tête. Le joueur contrôle uniquement le déplacement de la tête, et les tronçons doivent suivre.
Problématiques : 

  • Un tronçon ne connait que le tronçon qui le précède. Il n’y a pas d’intérêt à ce qu’il connaisse la position ou le comportement de la tête.
  • Pas question non plus qu’un tronçon suive exactement le même chemin que le tronçon précédent (A l’instant t, la position du tronçon x ne sera pas la position du tronçon x-1 à l’instant t-1) : Cela donnerai un mouvement trop rigide !

Solution : A chaque instant, un tronçon doit toujours se trouver la même distance du tronçon précédent. Si le tronçon précédent s’éloigne, le tronçon doit s’en approcher par le chemin le plus court.
Voici un schéma de la structure du serpent , ici composé de 4 tronçons :

… où tous les segments rouges sont de la même longueur.
Scénario 
Prenons 2 tronçons A et B, séparés de la longueur « d ». B se déplace, A doit suivre et venir se « coller » à B en gardant la même distance « d » :

Comment déterminer le chemin que doit prendre A ? Schématisons un peu mieux la situation :

d, x1 et y1 sont connus ! Reste à connaitre x2 et y2 (déplacement horizontal et vertical de A)
Et bien pour cela, on ressort nos bons vieux théorèmes de Pythagore et Thalès !

Connaitre les versions du Framework .NET installées

Toutes les versions sont stockées en base de registre. Exécuter la commande MSDOS suivante :
reg query « HKLMSOFTWAREMicrosoftNET Framework SetupNDP »
Pour connaître les service pack associés, lire la version du framework voulue :
reg query « HKLMSOFTWAREMicrosoftNET Framework SetupNDPv3.5 »
Attention, à partir du framework 4.5, c’est cette clé qu’il faut vérifier : HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full
Pour le niveau du service pack, il faut récupérer la valeur « Release ». Voir ce billet : How to: Determine Which .NET Framework Versions Are Installed.

ASP.NET : L'impersonation

Mécanique de l’impersonation en ASP : pratique, mais pas simple…
L’impersonation signifie le fait de choisir sous quel compte seront exécutés les processus ASP.
Dans le web.config, la ligne suivante :
<identity impersonate="true" />
Signifie que le compte qui s’est connecté à IIS sera utilisé pour exécuter la logique côté serveur.
ATTENTION : Si le site est en accès anonyme, alors c’est le compte du pool d’application qui est utilisé (il en faut bien 1 !).
On peut forcer le compte utilisé pour l’impersonation :
<identity impersonate="true" userName="DOMAINusername" password="aaa"/>
Ceci n’empêche pas le compte Windows de se connecter au site, mais ce sera DOMAINusername qui exécutera la logique.
Du côté des sources :
HttpContext.Current.User : Renvoie le compte connecté à IIS (Windows intégré, anonyme, etc.) Quelque soit l’impersonation choisie.
WindowsIdentity.GetCurrent() : Renvoie le compte qui exécute la logique. Donc si l’impersonation est à « true » dans le web.config, on aura le même compte que Current.User…
Enfin, en cours d’excution, on peut décider que le compte connecté sera celui qui sert à l’impersonation :
WindowsIdentity ident = (WindowsIdentity)HttpContext.Current.User.Identity; // On caste avant...
ident.Impersonate();
Si jamais le Current.User était un accès anonyme, une exception surgit : « Une identité anonyme ne peut pas exécuter un emprunt d’identité. »
CQFD.

ASP.NET : Renvoyer un ContentType différent (excel, CSV, doc…)

ASP.NET : Renvoyer un ContentType différent (C#)
Quelques conseils quand une page renvoie un flux différent que du  "text/html" :

  • Préciser l’encoding : Response.ContentEncoding = System.Text.Encoding.Default;
  • Générer le contenu dans le Page_Load, et finir par : Response.End();
  • Exemple :

 protected void Page_Load(object sender, EventArgs e)
{

Response.Clear();
// Type de contenu de la réponse
Response.ContentEncoding = System.Text.Encoding.Default;
Response.Charset = "iso-8859-1";
Response.ContentType = "text/csv";

// Entête
Response.AddHeader("Pragma", "no-cache");
        // Force le navigateur à faire un "enregistrer sous..."
Response.AddHeader("Content-Disposition", "attachment; filename="fichier.csv"");
// Corp de la réponse
Response.Write("bla bla bla");
// Pas de cache
Response.CacheControl = "no-cache";
Response.Expires = -1;
Response.End();

}

NB : Dans le corps de la réponse, pour faire des retours à la ligne « propres », il faut utiliser : System.Environment.NewLine

Javascript : Fonction masquer / afficher un bloc

Lien qui masque ou affiche un élément dans une page web.
Voici comment faire pour créer un lien qui masque ou affiche un élément dans la page :
– Créer le lien : <a href="#" onclick="javascript:ShowOrHide('MonPanel')" >Masquer / Afficher</a>
– Donner le bon ID à l’élément à masquer / afficher : <div ID="MonPanel">Bla bla</div>
– Insérer cette fonction dans la page :
function ShowOrHide(CtrlID)
{
oCtrl = document.getElementById(CtrlID);
if (oCtrl)
{
if (oCtrl.style.display == "none" || oCtrl.style.display == "")
{
oCtrl.style.display = "block";
}
else
{
oCtrl.style.display = "none";
}
}
}

MOSS 2007 : Changer la masterpage

Oui Maître !
Si la feature « Infrastructure de publication Office SharePoint Server » ou « Publishing Infrastructure » est activée, il est possible d’accéder au menu « Page maitre » dans « Actions du site > Paramètres du site > [Aspect] Page Maitre ».
Il suffit alors d’ajouter une master page dans la galerie (toujours via les « paramètres du site »), et il devient alors facile de créer son propre thème de site.
Dans le cas d’un site WSS sans la feature de publication (donc pas d’IHM pour modifier la masterpage), il est toujours possible de créer sa propre feature qui va modifier la masterpage du site.
 

SharePoint 2007 : Package d'une solution WSP

La solution est la solution.
Je recommande fortement de packager le moindre developpement SharePoint dans une solution WSP. C’est à mon avis la pratique la plus sûre pour ne pas avoir de mauvaise surprise lors de la remontée d’un serveur après un crash.
Les outils :
VSeWSS – Visual Studio Extensions pour WSS : Add On pour Visual studio qui fournit les templates de dev. pour les workflows, sites ou listes. La solution la plus puissante (« deploy » package et ajoute et déploie la solution sur le serveur !).
WSP Builder : Le meilleur moyen de packager une solution WSP. Disponible sous CodePlex. Il suffit d’organiser convenablement sa solution Visual Studio, WSP Builder fait le reste !
STSDEV : Même type que WSP Builder, mais apparement plus contrignant et obsolète.

CAML (WSS) : Requête avec un champ "DateTime"

Iso machin
Pour qu’une date soit exploitable dans une requête CAML, il faut qu’elle soit d’un format ISO spécifique.
Convertir la date à l’aide de cette outil du framework SharePoint :
SPUtility.CreateISO8601DateTimeFromSystemDateTime(maDate);
La requête suivante fonctionnera sans problème :
maQuery = "<Where><Geq><FieldRef Name='ChampDate' /><Value Type='DateTime'>" + SPUtility.CreateISO8601DateTimeFromSystemDateTime(maDate) + </Value></Geq></Where>";

SPQuery sur SPList.GetItems retourne tous les éléments !

Cauet rit.
Dans le bout de code suivant :

SPQuery qry = new SPQuery();
qry.Query = "<Query><Where><Eq><FieldRef Name='Champ1' /><Value Type='Number'>0</Value></Eq></Where></Query>";

SPListItemCollection myData = mySPList.GetItems(qry);
« myData » contiendra l’ensemble des enregistrements de la liste « mySPList », sans tenir compte de ma requête « Where ».
Ceci vient de la requête CAML mal formée : il faut enlever les balises « <Query></Query> ». En effet, l’objet SPQuery de charge lui-même de les ajouter.
Source : http://sharepointxperience.blogspot.com/2007/10/spquery-returns-all-items.html