Profits SNCF 2007
Juste pour rebondir sur cette annonce :
ça serait bien avec l'argent gagné de mettre des prises electriques dans toutes les wagons et pas qu'en première, personnelement, le wifi ne m'interesse pas dans un train.
Eric Besson et le "développement de l'économie numérique".
Ou comment boire du coca avec du bon fromage, Après avoir passé sous silence ce pan entier de l'economie lors des presidentielles, gauche ou droite. Après avoir oublié ce poste lors du gouvernement v1.0.
Voila qu'on nous mets un pantin, son seul fait d'arme etant d'avoir trahis en pleine campagne sa propre candidate, ce qui a été recompensé par son entrée dans un gouvernement qui pouvait vraiment se passer de ses "competences" et utiliser plutot celles de son propre camps, je pense a JF Copé, qui a montré la voie en informatisant les declarations d'impots et autres.
Franchement l'economie numérique vaut bien mieux que ça et doit etre traitée avec beaucoup plus de serieux et plus d'égards.
Un ministère dédié au meme titre que l'agriculture serait un minimum, je ne connais pas les chiffres mais je suis pret a parier qu'il y a plus d'informaticiens , web designers, chef de projet, ect.. qui travaillent dans l'economie numérique que dans l'agriculture a l'heure actuelle.
http://fr.wikipedia.org/wiki/%C3%89ric_Besson (absolument rien sur un la mise en place d'un projet lié a l'informatique)
Comment inclure logparser 2.2 dans un bootstrapper clickonce
Suite à une question que l'on vient de me poser par mail concernant visual logparser, voici la procedure a suivre pour ajouter logparser 2.2 comme prerequis dans un boostrapper d'application deployée via clickonce et d'une manière générale comment ajouter un composant.
1 - Telecharger bootstrapper manifest générator
Ajouter un nouveau "Package Manifest"
indiquer le nom du package :
Ensuite il faut ajouter le fichier d'installation , bouton droit sur package, "Add Install File"
pour le msi, il faut le telecharger via l'adresse suivante :
on indique alors tous les parametres :
On compile le projet
Vous remarquerez le build ouput, le boot strapper generator a crée un nouveau repertoire contenant le msi de logparser dans le repository des packages clickonce.
Maintenant il suffit de regarder dans visualstudio et l'on voit apparaitre logparser 2.2 dans la liste des prerequis.
Comment gerer la sortie de veille dans un service windows ?
Il est vrai que les services windows sont plutot dediés aux serveurs mais il arrive que certains service soient installés sur des postes clients, dans ce cas le client peut très bien mettre sa machine en veille ce qui arrete le service, la reprise n'est pas automatique, pour detectecter la sortie du mode veille il faut l'indiquer au service. Dans le constructeur par exemple on indique que l'on veut "Handler" les evenements concernant l'alimentation de la machine hote.
CanHandleEventPower = true;
ensuite pour "reveiller" ses process lors du redemarrage il faut overrider la methode OnPowerEvent et relancer un OnStart
protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
{
// Sortie du mode veille
if (powerStatus == PowerBroadcastStatus.ResumeSuspend)
{
OnStart(null);
}
return true;
}
UDPTraceListener et EntLib3.1 Logging application block
J'ai recemment mis en place un service NT et je voulais voir en temps réel ce qui se passait dans mes process, utilisant le logging application block , j'ai ecrit un TraceListener custom, qui ecrit la trace sur un port UDP. A l'aide d'un utilitaire en console, il est possible de voir passer en temps reel toute la trace, voici comment faire :
UdpTraceListener.cs
1: using System.Net;
2: using System.Net.Sockets;
3: using System.Text;
4: 5: using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
6: using Microsoft.Practices.EnterpriseLibrary.Logging;
7: using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
8: using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
9: 10: namespace Serialcoder.Logging
11: {12: [ConfigurationElementType(typeof(Configuration.UDPTraceListenerData))]
13: public class UDPTraceListener : FormattedTraceListenerBase
14: {15: private Microsoft.Practices.EnterpriseLibrary.Logging.LogEntry m_entry;
16: UdpClient m_Sock; 17: IPEndPoint m_Iep; 18: 19: public UDPTraceListener()
20: : base()
21: { 22: } 23: 24: public UDPTraceListener(ILogFormatter formatter)
25: : base(formatter)
26: { 27: } 28: 29: public UDPTraceListener(int port, ILogFormatter formatter)
30: : base(formatter)
31: {32: m_Sock = new UdpClient();
33: m_Iep = new IPEndPoint(IPAddress.Broadcast, port);
34: } 35: 36: public override void Write(string message)
37: {38: byte[] data = Encoding.UTF8.GetBytes(message);
39: m_Sock.Send(data, data.Length, m_Iep); 40: InstrumentationProvider.FireTraceListenerEntryWrittenEvent(); 41: } 42: 43: public override void WriteLine(string message)
44: { 45: Write(message); 46: } 47: 48: public override void TraceData(System.Diagnostics.TraceEventCache eventCache, string source, System.Diagnostics.TraceEventType eventType, int id, object data)
49: { 50: m_entry = (LogEntry)data;51: string message = this.Formatter.Format(m_entry);
52: this.Write(message);
53: } 54: 55: public override bool IsThreadSafe
56: { 57: get 58: {59: return true;
60: } 61: } 62: 63: protected override string[] GetSupportedAttributes()
64: {65: return new string[2] { "formatter", "port" };
66: } 67: 68: protected override void Dispose(bool disposing)
69: {70: base.Dispose(disposing);
71: m_Sock.Close();72: m_Iep = null;
73: m_Sock = null;
74: } 75: 76: } 77: }Le fichier de configuration :
1: using System.Configuration;
2: using System.Diagnostics;
3: 4: using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
5: using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;
6: using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
7: using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
8: using Microsoft.Practices.ObjectBuilder;
9: 10: namespace Serialcoder.Logging.Configuration
11: {12: [Assembler(typeof(UDPTraceListenerAssembler))]
13: public class UDPTraceListenerData : TraceListenerData
14: {15: private const string PORT = "port";
16: private const string FORMATTERNAMEPROPERTY = "formatter";
17: 18: public UDPTraceListenerData()
19: { 20: } 21: 22: public UDPTraceListenerData(int port, string formatterName)
23: : this("unnamed", port, formatterName)
24: { 25: } 26: 27: public UDPTraceListenerData(string name, int port, string formatterName)
28: : this(name, port, formatterName, TraceOptions.None)
29: { 30: } 31: 32: public UDPTraceListenerData(string name, int port, string formatterName, TraceOptions traceOptions)
33: : base(name, typeof(UDPTraceListener), traceOptions)
34: {35: this.Port = port;
36: this.Formatter = formatterName;
37: } 38: 39: [ConfigurationProperty(PORT,IsRequired=true)]
40: public int Port
41: {42: get { return (int)base[PORT]; }
43: set { base[PORT] = value; }
44: } 45: 46: [ConfigurationProperty(FORMATTERNAMEPROPERTY, IsRequired = false)]
47: public string Formatter
48: {49: get { return (string)base[FORMATTERNAMEPROPERTY]; }
50: set { base[FORMATTERNAMEPROPERTY] = value; }
51: } 52: 53: } 54: 55: public class UDPTraceListenerAssembler : TraceListenerAsssembler
56: {57: public override TraceListener Assemble(IBuilderContext context, Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.TraceListenerData objectConfiguration, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
58: { 59: UDPTraceListenerData castedObjectConfiguration 60: = (UDPTraceListenerData)objectConfiguration; 61: 62: ILogFormatter formatter = GetFormatter(context, castedObjectConfiguration.Formatter, configurationSource, reflectionCache); 63: 64: TraceListener createObject = new UDPTraceListener(castedObjectConfiguration.Port, formatter);
65: return createObject;
66: } 67: } 68: 69: }la partie interessante de ce code est l'ecriture sur un port udp réaliser par :
<add port="20202" listenerDataType="Serialcoder.Logging.Configuration.UDPTraceListenerData, Serialcoder.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null"
traceOutputOptions="None" type="Serialcoder.Logging.UDPTraceListner, Serialcoder.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null"
name="UDP Trace Listener" formatter="Condensed Informations" />
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4: 5: namespace ServiceTraceListnerConsole
6: {7: class Program
8: {9: static void Main(string[] args)
10: {11: if (args == null || args.Length != 2)
12: {13: Console.WriteLine("Using :");
14: Console.WriteLine();15: Console.WriteLine("ServiceTraceListnerConsole <IPEndpoint> <Port>");
16: Console.WriteLine();17: Console.WriteLine("Example :");
18: Console.WriteLine("ServiceTraceListnerConsole 192.168.1.1 20202");
19: return;
20: } 21: 22: new ServiceListner(args[0], Convert.ToInt32(args[1]));
23: } 24: } 25: }et son fichier d'ecoute du port UDP :
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4: using System.Threading;
5: using System.Net;
6: 7: namespace ServiceTraceListnerConsole
8: {9: public class ServiceListner
10: {11: private string m_IPEndPoint;
12: private int m_Port;
13: private System.Threading.Thread m_Thread;
14: private System.Threading.ManualResetEvent m_EventStop;
15: private System.Net.Sockets.UdpClient m_Sock;
16: 17: public ServiceListner(string ipEndPoint , int port)
18: { 19: m_IPEndPoint = ipEndPoint; 20: m_Port = port;21: m_EventStop = new System.Threading.ManualResetEvent(false);
22: m_Thread = new System.Threading.Thread(Listen);
23: m_Thread.Start(); 24: } 25: 26: private void Listen()
27: {28: // IPEndPoint iep = new IPEndPoint(IPAddress.Parse(m_IPEndPoint), m_Port);
29: m_Sock = new System.Net.Sockets.UdpClient(m_Port);
30: while (true)
31: {32: IAsyncResult result = m_Sock.BeginReceive(new AsyncCallback(ReceiveMessage), null);
33: WaitHandle[] handles = new WaitHandle[] { m_EventStop, result.AsyncWaitHandle };
34: int index = WaitHandle.WaitAny(handles);
35: if (index == 0)
36: { 37: m_Sock.Close();38: break;
39: } 40: } 41: } 42: 43: private void ReceiveMessage(IAsyncResult ar)
44: {45: IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
46: byte[] data = m_Sock.EndReceive(ar, ref iep);
47: string message = Encoding.UTF8.GetString(data);
48: Console.WriteLine(message); 49: } 50: } 51: }Sur les applications existantes utilisant le LAB il s'uffit d'utiliser ce listener pour voir apparaitre la trace dans une console, ceci peut etre interessant pendant la phase d'installation d'un nouveau service ou dans une application web.
ERP Studio - Mise à jour du 5 mars 2008
Cette mise à jour est l'occasion pour mettre en place les nouvelles fonctionnalités suivantes :
- Nouvelle page de deploiement de l'application
Comme nous l'avions annoncé, nous avons changé de Framework pour suivre le plus possible les innovations apportées par Microsoft et avons migré toute l'application sur le .Net Framework 3.5, à la clé, un gain de productivité pour les developpeur et donc la mise en place plus rapide de vos demandes.
- Modification de la boite de login/password
Il n'y a plus qu'une seule boite qui regroupe le splash screen et la procedure de login, le demarrage du logiciel à été acceleré.
Il est possible de charger la configuration du serveur via un fichier que l'on peut mettre sur une clé usb par exemple.
- Extension du principe de colorisation des listes
maintenant il est possible de coloriser avec un theme que l'on peut appliquer en temps réél et qui est sauvé dans les paramètres utilisateurs.
Ce principe est appliqué sur toutes les listes, un nouveau mode aussi est present sur le attributs de chaque entité et permet lui aussi une colorisation en fonction des de certains critères.
- Liste des produits et délai moyen de livraison
Une nouvelle colonne fait son apparition dans la liste des produits, le délai moyen de livraison pour les clients, il est calculé statistiquemnet sur 2 ans glissant et permet d'annoncer a son client le délai moyen constaté pour le livrer quand le produit n'est pas en stock, a ajouté au delai moyen de reception deja pris en compte.
- Nouvelle propriété pour le produit, disponibilité à la vente
Il est possible de spécifier pour un produit s'il est disponible a la vente, pour l'instant cet etat est binaire, il est prevu de pouvoir spécifier des périodes.
- Ajout d'une colonne commentaire sur le tarif produit fournisseur
il est possible d'ajouter un commentaire par tarif par produit fournisseur, celui-ci est reporté systematiquement dans la commande fournisseur
- Commande mono fournisseur centrale d'achat
il est possible de passer massivement en commande fournisseur tous les produits mono fournisseurs en rupture a partir du moment ou il sont réservés par un ou plusieurs clients, il suffit d'indiquer la date limite de temps pour la reservation, généralement nous avons constaté que cette fonctionnalité peut faire gagner 15 minutes de productivité par jour
- Reorganisation des rubans
Trois nouveaux bontons font leur apparition, les actions massives, la galerie de courbe statistique , et la coloration
- Nouvelles statistiques
Affichage des commandes fournisseurs, par fournisseur.
Affichage du panier moyen annuel d'achat et de vente.
Repartition des produits par categorie.
- Generation des relevés de facture
Possibilité de selectionner la date et possiblité d'annuler une opération en cours
- Gestion des listes
Replacement massif d'une valeur par une autre
Correction des bugs suivants :
fermeture du programme après enregistrement du réglement de 2 factures
Crash sur la liste des factures qd une catégorie de client est crée sur un autre poste
l'affichage d'une catégorie, comportant des sous-catégories, ne fonctionne pas.
