jeudi 5 mars 2015
Récupérer le dernier jour de la semaine du mois en cours en powershell
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)
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
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) -BodyAsHtmlUne 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
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
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
Voici les liens vers mon copion disponible en A4 sur 2 pages ou en A4 sur une seule page avec 2 colonnes :
- Cheat-sheet PDF - Format A4 2 pages
- Cheat-sheet docx - Format A4 2 pages
- Cheat-sheet PDF - Format A4 1 page - 2 colonnes
- Cheat-sheet docx - Format A4 1 page - 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
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
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
- Sur la machine virtuelle (XP Mode) aller dans le dossier %allusersprofile%\start menu (C:\Documents and Settings\All Users\Start Menu)
- Créer un raccourci vers votre application dans ce dossier
- 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
Liens:
- Télécharger le XP Mode
mercredi 24 avril 2013
Sites de cours vidéos en ligne
- Microsoft Virtual academy
- lien : http://www.microsoftvirtualacademy.com
- gratuit
- DIMECASTS.NET
- lien : http://dimecasts.net/
- gratuit
- Channel 9
- lien : http://channel9.msdn.com/
- gratuit
- Plurasight
- lien : http://www.pluralsight.com/training
- payant
vendredi 15 mars 2013
Afficher le contenu d'un dossier avec IIS express
<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 ...
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 ?
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
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
mardi 17 juillet 2012
Client WCF à partir de l'interface .NET - le ChannelFactory
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
Voici le code des différents composants :
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
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






