jeudi 5 mars 2015

Récupérer le dernier jour de la semaine du mois en cours en powershell

L'idée est de récupérer le dernier jour de la semaine (donc pas samedi ou dimanche) du mois courant.

Pour se faire, le plus simple, est de prendre le 1er jour du mois suivant, de retirer un jour afin d'obtenir le dernier jour du mois. Si ce jour est dimanche, on enlève 2 jours, si ce jour est samedi on en enlève qu'un. Si ce jour n'est ni samedi, ni dimanche, on le garde

En 2 lignes :

$nextMonthLastDay = (Get-Date -Month ((Get-Date).Month+1) -Day 1).AddDays(-1)
$nextTsDay = if(@{[DayOfWeek]::Sunday=$d.AddDays(-2);[DayOfWeek]::Saturday=$d.AddDays(-1)}[$d.DayOfWeek] -eq $null){$d}

vendredi 14 novembre 2014

Date oracle au format Http (RFC2616)

Pour avoir une date oracle formattée correctement pour un heaer HTTP(RFC2616), il est nécessaire d'utiliser le formation suivant : 'Dy,DD Mon YYYY HH24:mi:ss TZD'

Il sera également nécessaire de travailler avec des timestamp avec de pouvoir spécifier que l'heure et la date sont relatives à GMT. Ci-dessous une requête d'exemple qui affiche systimestamp dans le format souhaité:

select to_char(systimestamp AT TIME ZONE 'GMT','Dy,DD Mon YYYY HH24:mi:ss TZD')
from dual;


mercredi 8 octobre 2014

Envoyer un mail en powershell

La commande à utiliser en powershell pour envoyer un email est Send-MailMessage
Voici quelques exemples pour utiliser cette fonction:

Envoyer un mail en texte:

Send-MailMessage -To lui@blabla.com -From moi@blabla.com -Subject "Ceci est un test" -SmtpServer "smtpServer" -Body "Ceci est le corps du message"

Envoyer un mail dont le body est un fichier:

Send-MailMessage -To lui@blabla.com -From moi@blabla.com -Subject "Ceci est un test" -SmtpServer "smtpServer" -Body (get-content c:\file.txt -Raw)

 Envoyer un mail dont le body est un fichier html:

Send-MailMessage -To lui@blabla.com -From moi@blabla.com -Subject "Ceci est un test" -SmtpServer "smtpServer" -Body (get-content c:\file.html -Raw) -BodyAsHtml

Une alternative à Get-Content pour récupérer le contenu d'un fichier est de passer par la fonction statique System.IO.File.ReadAllText :

Send-MailMessage -To lui@blabla.com -From moi@blabla.com -Subject "Ceci est un test" -SmtpServer "smtpServer" -Body ([Io.File]::ReadAllText('H:\temp\test\ect988E.html')) -BodyAsHtml -Encoding 'UTF8'


Sources

dimanche 7 septembre 2014

JSDB.io - La base de données des librairies et frameworks javascript

JSDB.io est une base de données regroupant de nombreuses librairies et frameworks javascript utilisés pour le développement d'application client basé sur ce langage.

Chacune des entrées de cette librairie indique les informations suivantes:

  • Un lien vers la page d'accueil du framework
  • Une brève description
  • Un lien vers le project github
  • Des liens vers des CDN
  • Des liens vers des tutoriaux
Pour soumettre une librairie, il est nécessaire d'avoir un projet github contenant les sources du projet, que ce projet possède au moins 80 étoiles et que la librairie soit utilisable coté client.

Voila donc un lien utile a utiliser dés que vous cherchez une librairie qui peut vous aider : 

lundi 11 août 2014

Appeler un service WCF SOAP depuis Powershell


Powershell met à disposition le cmdlet New-WebServiceProxy pour créer un proxy pour appeler vos services WCF. Pour créer le proxy, il suffit de lui donner le WSDL du service a appeler.

Une fois le proxy généré, il suffit d'appeler la méthode correspondant à l'opération. Par exemple :

$proxy = New-WebServiceProxy -uri $WSDLUrl;
$res = $proxy.HelloWorld();

Dans le but de faire du monitoring, j'ai écrit un petit script, disponible ci dessous, qui permet, sur base d'un wsdl et du nom de l'opération à appeler, de vérifier que l'opération sur un service s'exécute correctement:

[CmdletBinding(SupportsShouldProcess=$true)]
Param(
    [Parameter(Mandatory=$True)][string]$WSDLUrl,
    [Parameter(Mandatory=$True)][string]$MethodName
    )

Write-Verbose "WSDLUrl=$WSDLUrl"
Write-Verbose "MethodName=$MethodName"

try
{
    $proxy = New-WebServiceProxy -uri $WSDLUrl -ErrorAction Stop
    if(-not $proxy.$MethodName)
    {
        Write-Error "Method $MethodName is not declared on service defined at $WSDLUrl"
        exit 1;
    }
    $res = $proxy.$MethodName.Invoke();
}
catch
{
    Write-Error $_
    exit;
}

if($res)
{
    Write-Verbose $res;
}
else
{
    Write-Verbose "void";
}

Write-Host "service called"

Quelques sources intéressantes si vous souhaitez aller plus loin !

mardi 4 février 2014

Session state has created a session id, but cannot save it because the response was already flushed by the application.

Cette erreur peut se produire lorsque l'on essaie de récupérer le session id d'une session alors que la réponse au client a déja été envoyée. Le sessionID étant passé par cookies, si on n'en a pas envoyé au client, il n'est dés lors, plus possible de lui renvoyer cet ID.

Un petit workaround pour régler ce problème, consiste à toujours créer un sessionID pour chaque utilisateur. Pour implémenter ce comportement, on peut utiliser l'event Session_Start dans le Global.asax avec le code suivant:

void Session_Start(object sender, EventArgs e)
{
    string sessionId = Session.SessionID;
}

Comment déterminer à qui appartient un package oracle à l'exécution

La solution que l'on rencontre le plus souvent pour répondre à cette question, consiste à récupérer dans le context quel est le schéma actuel via la fonction sys_context:

sys_context('userenv', 'current_schema')

Cependant, cette méthode ne fonctionnera pas si l'on se trouve dans une procédure d'un package marquée comme devant s'exécuter en utilisant le schéma actuel (c'est à dire de l'appelant) et non le schéma dans lequel se trouve le package(utilisation de "authid current_user" plus d'info ici)

En effectuant, quelques recherches, j'ai trouvé une autre solution (voir ici) qui consiste à analyser la call stack. La première entrée de cette dernière contiendra le nom du schéma et le nom du package qui est appelé(owner.package), il suffira donc d'extraire la première partie (celle juste avant le point) pour connaitre le propriétaire du package.

Une implémentation est proposée sur le site ou j'ai trouvé la réponse à ma question : http://cbohl.blogspot.be/2011/01/determine-owner-of-package.html

lundi 7 octobre 2013

Formats de date en .Net - Cheat-Sheet

Vu que je me demande souvent si le format de date .Net des mois utilise un m minuscule ou majascule et quel caractère est utilisé pour les millisecondes je me suis fait une petite cheat-sheet (un copion quoi) accrochée à mon mur.

Voici les liens vers mon copion disponible en A4 sur 2 pages ou en A4 sur une seule page avec 2 colonnes :



mardi 1 octobre 2013

Ma fonction powershell retourne un tableau avec plusieurs éléments au lieu de l'objet demandé


Après un long débogage dans des scripts powershell je me sens obligé d'écrire un petit post sur ce blog. Cette session de débug aura au moins l'avantage de m'avoir appris ce qu'était le mot clé return en powershell et qu'il ne fallait pas se fier aux apparences !

Par exemple, la fonction :

function get-string
{
    'hello world' -match 'hello'
    return $Matches[0];
}
Que ce passera t-il si on appelle cette fonction dans le shell ? En tant que développeur C# je m'attendrai à avoir la valeur "hello" ou une chaîne de caractère.

Voici ce que me retourne la commande get-string:
True
hello
Deux valeurs ! Comment est-ce possible ? Je n'ai qu'un seul return dans ma fonction et la valeur $Matches[0] ne contient que la chaine "hello" si j'affiche cette valeur ou si j'ajoute un watcher sur cette variable. Que s'est-il donc passé ?

Si on prend le temps de lire la documentation about_return depuis le shell ou sur internet, on peut y lire que le mot clé return retourne également toutes sorties non interceptées. Le mot clé match retourne un booléen pour indiquer si un match a été réalisé ou non. Donc une donnée booléenne est envoyée et non récupérée dans la fonction. Cette donnée est donc ajoutée à la sortie de la fonction en plus de l'objet retourné via le mot clé return.

mardi 23 juillet 2013

ORA-12018 lors de la creation d'une vue materialisée avec un database link

Ce matin, j'ai voulu recréer sur une base de données Oracle, une vue matérialisée avec un Fast refresh utilisant un database link. La particularité de cette vue materialisée est qu'elle utilise un dblink portant le même nom que le schéma sur lequel se trouve la table que je souhaite avoir dans ma vue matérialisée.

Il semblerait que cette particularité génère une erreur sur certaines versions d'Oracle.

SQL> CREATE MATERIALIZED VIEW local.mytable BUILD IMMEDIATE REFRESH FAST As Select * From master.mytable@master; 

CREATE MATERIALIZED VIEW local.mytable BUILD IMMEDIATE REFRESH FAST As Select * From master.mytable@master 
ERROR at line 1: ORA-12018: following error encountered during code generation for "local"."mytable" 
ORA-00942: table or view does not exist 

Un workaround pour contourner cette erreur consiste à d'abord la vue materialisée en Complete Refresh puis de la modifier pour qu'elle utilise un Fast refresh. Donc ici pour ma table mytable:

CREATE MATERIALIZED VIEW MyMaterializedView BUILD IMMEDIATE REFRESH COMPLETE As Select * From master.mytable@master;
Alter MATERIALIZED VIEW MyMaterializedView REFRESH FAST;
 
Je n'ai pas trouvé d'explications claires sur le pourquoi de ce bug mais en tout cas le workaround semble bien fonctionner.

lundi 13 mai 2013

Comment déterminer si un Type dispose d'un constructeur sans paramètre

Il existe plusieurs solution pour déterminer par réflexion si un Type dispose d'un constructeur sans paramètre. Voici 2 manières de faire :
  • typeof(TypeT).GetConstructors().Any(c => !c.GetParameters().Any())
  • typeof(TypeT).GetConstructor(Type.EmptyTypes) != null 

Bonne réflexion !



jeudi 25 avril 2013

Ajouter un programme du XP Mode dans windows 7 en seamless mode

Le XP Mode l'utilisation d'applications fonctionnant sur windows XP sur Windows 7. Le XP Mode est simplement une machine Virtuelle "Windows Virtual PC avec une image de windows XP Professionnel installée dessus.
Virtual PC permet un mode "seamless". Le seamless mode permet de travailler avec les fenêtres des applications tournant sur la VM sur le bureau de la machine host. Cela donne l'impression qu'il n'y a pas du tout de machine virtuelle et que tout est géré par l'OS de la machine hôte.

Il est possible de lancer directement depuis Windows 7 des applications s’exécutant en XP Mode en seamless mode depuis le menu démarrer de Windows 7. Voici la petite procédure à suivre : 

  1. Sur la machine virtuelle (XP Mode) aller dans le dossier %allusersprofile%\start menu (C:\Documents and Settings\All Users\Start Menu)
  2. Créer un raccourci vers votre application dans ce dossier
  3. Après quelques secondes, votre lien s'affichera dans le dossier "Windows Virtual PC/Windows XP Mode Applications" de votre Windows 7 et démarrera automatiquement le XP Mode et votre application
 Et voila !

Liens:

mercredi 24 avril 2013

Sites de cours vidéos en ligne

Voici une liste de sites permettant de suivre des cours/formations/workshops pour les développeurs .Net


vendredi 15 mars 2013

Afficher le contenu d'un dossier avec IIS express

Par défaut IIS express ne permet pas d'explorer le contenu d'un dossier. Si vous souhaitez changer ce comportement, voici la procédure à suivre :

Ouvrez le fichier de configuration d'IIS express:
[Windows7]
C:\Users\{Username}\Documents\IISExpress\config\applicationhost.config

Ensuite il faut aller ajouter ou modifier l'élément "directoryBrowse" qui se trouve dans /configuration/system.webServer. Cet élément doit être configuré de la manière suivante :  

C'est à dire :

<configuration>
[...]
<system .webserver>
[...]
<directorybrowse enabled="true"/>
[...]


[...] représente d'autres éléments qui ne nous concernent pas.

dimanche 3 mars 2013

Attention le petit oiseau va sortir ...

Après LockHunter, voici un autre petit outil bien pratique que j'utilise souvent lors de mes journées de développeur : Greenshot.

Cet outil permet de prendre des captures d'écran (screenshots). Une fois installé, vous disposez d'une nouvelle icône (un G vert)dans votre barre des tâches qui vous permet de configurer Greenshot.

Greenshot permet de prendre une capture d'écran d'une fenêtre en particulier, d'une zone de votre écran ou de votre écran au complet. Une fois la capture réalisée, il est possible d'ajouter des annotations sur votre capture avant de la sauvegarder en png, jpeg, gif, bmp, ... en gros n'importe quel format d'image standard.

Greenshot est téléchargeable sur le site http://getgreenshot.org/

Mais qui locke mon fichier ?

N'avez vous jamais eu l'envie d'exploser votre clavier lorsque vous souhaitez supprimer/déplacer un fichier et que Windows vous affiche un gentil message d'erreur vous indiquant que ce fichier est actuellement bloqué par un autre processus ? Une petite voix résonne alors dans votre tête et hurle: "Mais qui locke mon fichier ?!?!".

Afin d'éviter une immense frustration, voici un petit logiciel fort sympathique qui va grandement vous servir : LockHunter : http://lockhunter.com/

LockHunter vous indique, entre autres, quel process bloque actuellement le fichier que vous lui avez demandé d'inspecter et vous permet de forcer la suppression ou de terminer ce processus. Le logiciel s'intègre à l'explorateur Windows et est accessible au moyen d'un simple clique droit sur un fichier.

Fini l'énervement et un grand merci à la société CrystalRich d'avoir développé ce petit outil bien pratique !

vendredi 19 octobre 2012

Récupérer la taille des dossiers dans le répertoire courant

Voici un petit script powershell qui permet de récupérer les dossiers du répertoire courant et d'indiquer leur taille en Gb:

Get-ChildItem |
where {$_.PsIsContainer} |
select @{Name="SizeGb";Expression={(Get-ChildItem $_ -Recurse | Measure-Object Length -Sum).Sum/1Gb}},Name |
Format-table -AutoSize

mercredi 25 juillet 2012

Générer des ressources licenses buildées (App_Licenses.dll) à partir des fichiers licences.licx - Build Runtime Licenses

Comment générer des ressources licenses buildées (App_Licenses.dll) à partir des fichiers licences.licx? Après de nombreuses recherche voici un résumé de ces recherches ainsi que la solution à cette question.

Les fichiers licenses.licx sont des fichiers textes qui contiennent le nom de l'assembly ainsi que le nom du composant sur lequel agit une licence d'utilisation. Les applications ASP.Net (et les WCF applications) ont besoin d'avoir une dll qui comprends la licence car ces applications ne s'exécutent pas par elles-mêmes, elles sont exécutée par un process IIS. Pour ces applications, il ne suffit pas de simplement ajouter le fichier licenses.licx dans votre assembly et de lancer la compilation, mais il est nécessaire de les liers à des ressources compilées qui contiendra la license. On vous expliquera que pour générer ces assembly il suffit de faire un clic droit dans l'explorateur de solution de visual studio 2010 et de cliquer sur "Build Runtime Licenses". Le problème c'est que mise à part si vous travaillez sur un site Web vous ne verrez pas cette option. 

Alors, comment faire ? Il suffit de simplement ouvrir votre solution comme un Site Web (File > Open > Web Site) et de déposer votre fichier licenses.licx à la racine de votre projet. Et la, miracle, vous avez l'option "Build Runtime Licenses" disponible qui va vous générer le fameux fichier App_Licenses.dll dans le dossier Bin de votre application. Il ne reste plus qu'a rajouter cette assembly aux références de votre projet et fini les problèmes de licenses sur vos application asp.Net !

Cette solution marche également pour les projets de type "Wcf Application".

mardi 17 juillet 2012

Client WCF à partir de l'interface .NET - le ChannelFactory

Souvent, pour réaliser un client sur un service WCF, on passe par une "Service Reference". Ce type de référence, va générer du code(Visual Studio) et notamment un client qui implémente une interface compatible avec l'interface du service. Après génération de ce code, si vous regarder votre code, vous trouverez d'une part l'interface au niveau de votre service et d'autre part l'interface générée gentiment par Visual Studio. Les datacontracts utilisés par votre service seront également dupliqués du coté du client.

L'avantage de cette solution est sa facilité de mise en place et l'indépendance du client par rapport au service. Le désavantage est cette duplication du code. Si vous êtes détenteur du code du service et donc de ses contrats, pourquoi ne pas directement utiliser ces contrats au lieu d'en régénérer dans votre assembly cliente ? Pour éviter cette duplication, il est possible de créer un client wcf à partir du contrat via la classe System.ServiceModel.ChannelFactory. Comment utiliser ce ChannelFactory ?

Pour voir le fonctionnement, nous allons faire une petite solution visual studio qui comprendra:
  • Un assembly avec l'interface du service(Contracts)
  • Un assembly avec l'implémentation du service(Services) - reférence Contracts
  • Un host pour le service (SVCHost) - référence Services et Contracts
  • Une console qui sera client du service (ConsoleClient) - référence Contracts
N'oubliez pas d'ajouter les références vers System.ServiceModel et System.Runtime.Serialization sur vos projets. Vous devriez alors avoir quelque chose comme :
Voici le code des différents composants :

Le code du host (hello.svc)
 Le code du client
Comme nous pouvons le voir ici, il n'y a pas de code généré. Le client référence simplement l'assembly contenant les interfaces et WCF va nous généré un client au travers de la classe ChannelFactory.

Le gros avantage est que si vous modifier votre interface, vous pouvez directement voir les impacts. Cette solution ne fonctionne néanmoins que dans un système fermé (entièrement sous contrôle d'une seule entité). Si vos services sont ouverts, vous ne pouvez pas fournir forcément fournir votre assembly de contrats. Dans ce cas la, une service reference s'impose !

Sources :

mardi 10 juillet 2012

Définir les styles par défaut dans Word

Certaines configuration de Word ne montre pas les styles que vous utilisez le plus souvent. Dans mon cas, je suis tombé sur une machine ou Word ne me proposait pas les styles Titre1,Titre2,Titre3 ou Heading1, Heading2, Heading3 si votre MS Office est en anglais.


Alors comment faire pour configurer son bandeau ? Pour les styles, voici la procédure à suivre :
  • Afficher la fenetre des styles (ctrl+alt+shift+s ou cliquer sur la petite flèche de la boite des style comme montré sur l'image ci dessous
  •  Afficher la boite de dialogue Manage Styles
  •  A partir de cette fenêtre, dans l'onglet Recommend, vous pouvez définir les styles à afficher par défaut (Show), à cacher (Hide) ou à cacher tant qu'il n'est pas utilisé (Hide until used)


  • Enfin, vous avez la possibilité de préciser que vous souhaiter garder la configuration pour votre document ou pour tous les documents qui ont le même template