Récupérer le nom des jobs relatifs aux abonnements Reporting Services.

by Olivier Moreau 5. octobre 2011 23:17

Le code SQL ci-dessous permet de retrouver les noms des jobs des abonnements Reporting Services.
Code bien utile quand on doit retrouver un abonnement parmi des centaines pour le rejouer à la demande.

Script pour le rejouer :

EXEC msdb..sp_start_job 'GUID DU JOB'

 

Script pour retrouver le job :

SELECT 
	ReportSchedule.ScheduleID AS JOB
	,CATALOG.Name AS Nom_Rapport
	, Subscriptions.Description AS Description
	, Subscriptions.LastStatus as Statut_Abonnement
	, Subscriptions.LastRunTime as Derniere_Execution
FROM 
	CATALOG
		JOIN Subscriptions  ON CATALOG.ItemID = Subscriptions.Report_OID
		JOIN ReportSchedule ON CATALOG.ItemID = ReportSchedule.ReportID
							AND ReportSchedule.SubscriptionID = Subscriptions.SubscriptionID
ORDER BY 	
	CATALOG.Name,
	ReportSchedule.ScheduleID

Tags:

Business Intelligence

Script SQL : arrondi au quart d'heure

by Olivier Moreau 19. septembre 2011 19:04

Voici un script SQL qui permet d'arrondir une date au quart d'heure le plus proche

DECLARE @MADATE AS DATETIME
SET @MADATE = '01/01/2011 10:07:29'
SELECT cast(round((cast(@MADATE as float(53))*24*4),0)/(24*4) as smalldatetime)

Résultat : 2011-01-01 10:00:00

SET @MADATE = '01/01/2011 10:07:30'
SELECT cast(round((cast(@MADATE as float(53))*24*4),0)/(24*4) as smalldatetime)

Résultat : 2011-01-01 10:15:00

 

Pour arrondir systématiquement au quart d'heure inférieur on utilisera la fonction FLOOR à la place de ROUND

DECLARE @MADATE AS DATETIME SET @MADATE = '01/01/2011 10:07:29'
SELECT cast(floor(cast(@MADATE as float(53))*24*4)/(24*4) as smalldatetime)

Résultat : 2011-01-01 10:00:00

SET @MADATE = '01/01/2011 10:14:30'
SELECT cast(floor(cast(@MADATE as float(53))*24*4)/(24*4) as smalldatetime)

Résultat : 2011-01-01 10:00:00

Tags:

Business Intelligence

Lancer un processus asynchrone en Asp.Net

by Gilles DEHAIS 11. juillet 2011 20:46

Bonjour,

Nous allons voir comment lancer un processus de façon asynchrone en ASP.Net. En effet, vous vous êtes surement retrouver devant le cas d'une page qui doit lancer un processus relativement long (plusieurs minutes) et qui bloque alors la page Web en attendant que ce processus finisse et que le serveur réponde que l'opération s'est déroulée avec succès ou non.

Or, lorsque l'on clique sur le bouton qui lance ce processus sur le serveur, la page est comme "frisée" et les animations permettant d'indiquer à l'utilisateur d'attendre sont elles aussi figées. Heureusement, il existe un moyen de contourner ce problème : l'asynchrone.

Créer un site Asp.Net vide sous Visual Studio et ajoutez-y un autre page Web que l'on nommera "Default2.aspx". Nous allons maintenant éditer la page "Default.aspx" pour y ajouter du code javascript et nos éléments Web.

 

<title> Untitled Page </title> 
<script type="text/javascript"> 
 
    function ClientCallbackFunction(arg, ctx) {
        if (arg != "") {
            window.location = "Default2.aspx";
        }
    } 
</script>  
</head>


<body> 
 
<form id="form1" runat="server"> 
<div>
Async Callback
<br />
<asp:TextBox ID="tbxLongProcessArgs" runat="server" />
<br />
<input type="button" value="Start" id="bttAsync"
       onclick="javascript:document.all.Message.innerText='Process started';return DoTheCallback(document.all.tbxLongProcessArgs.value,1);" />
<br />
<span id="Message"></span>
</div>
</form>
</body>

 

Comme vous pouvez le constater, le bouton affiche le message 'Process started' et lance notre processus en mode asynchrone en lui donnant un argument lorsque l'utilisateur cliquera dessus. La fonction JavaScript 'ClientCallbackFunction' sera appelée lorsque notre processus sera terminé et permettra de passer sur notre 2ème page Web.  Maintenant nous allons éditer notre page Default2.aspx

 

<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtDesc" runat="server" Width="250px" TextMode="MultiLine"></asp:TextBox>
    </div>
    </form>
</body>

 

Cette page va nous permettre d'afficher le résultat de notre processus. Il ne nous reste plus qu'à ajouter le code behind qui lancera notre processus coûteux en temps en mode asynchrone

 

    protected void Page_Load(object sender, EventArgs e)
    {
        string js = Page.ClientScript.GetCallbackEventReference(this, "arg",
        "ClientCallbackFunction", "ctx", true);

        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.Append("function DoTheCallback(arg, ctx) {");
        sb.Append(js);
        sb.Append("}");
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
        "callbackkey", sb.ToString(), true);
    }

Comme nous pouvons le voir, nous ajoutons à la page 'Default.aspx.cs' un évènement de type CallBack qui appelera notre fonction javascript 'ClientCallbackFunction' de notre page Default.aspx et ceci de manière totalement asynchrone. Cette évènement sera créé lorsque l'utilisateur cliquera sur le bouton 'Start' de notre page.

Maintenant, pour que la magie de l'asynchrone opère, il va falloir utiliser l'interface 'ICallbackEventHandler' que nous implémentons aussi dans notre code behind de la page Default.aspx.

 

    #region ICallbackEventHandler Members

    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        this._eventArgument = DoLongProcess(eventArgument);
    }

    string ICallbackEventHandler.GetCallbackResult()
    {
        if (!string.IsNullOrEmpty(this._eventArgument))
            Session["errorMessageImport_P"] = this._eventArgument;
        return this._eventArgument;
    }

    #endregion

 

Lorsque l'utilisateur clique sur le bouton 'Start', notre évènement asynchrone est créé et la méthode RaiseCallbackEvent est lancée. Nous avons aussi la possibilité de lui envoyer des paramètres. C'est cette méthode qui va lancer notre processus côuteux en temps. Une fois le processus fini, la méthode GetCallbackResult est lancée et appelle la méthode javascript 'ClientCallbackFunction' de notre page. Vous pouvez utiliser des variables de Session si vous désirez sauvegarder en mémoire sur le serveur le résultat du processus.

Ainsi, une fois notre processus terminé, la page 'Default2.aspx' est appelée par le client et la réponse retournée par notre processus est affichée à l'utilisateur. Vous pouvez remarquer que lorsque vous cliquez sur le bouton 'Start', la page n'est pas figé. Elle peut donc afficher un gif animé d'attente utilisateur par exemple. 

WebSite_Async.zip (5,03 kb)

Tags:

Développement

Workshop sur HTML5 chez Microsoft

by ehumez 28. juin 2011 20:03

Le 16 mars 2011 a eu lien au centre de conférences Microsoft un workshop sur HTML5 / CSS3 / SVG 1.1
Cette conférence a eu pour but de faire un état des lieux actuel du HTML5, de son implémentation dans les dernières versions des principaux navigateurs, des bonnes pratiques offertes par des frameworks pour faire du progressive enhancement et du fallback, sur la plateforme ASP.NET.
Le but de cet article est de vous faire un résumé rapide, et de ce que j'ai retenu de plus intéressant. Il faut souligner que cet évènement a eu lieu tout de suite après la sortie en version finale d'Internet Explorer 9. Il est aussi un prolongement d'une session des TechDays 2011 sur le même sujet.

Une norme en cours de construction

D'abord, la spécification actuelle du HTML5 par le consortium W3C est au statut "working draft" jusqu'en mai 2011. Ce n'est qu'à cette date que l'en-cours des spécifications sera en version finale, et donnera le coup d'envoi de l'adoption officielle du standard. Au départ dans la roadmap du W3C, il était prévu de livrer la version finale du HTML5 en 2022 ! C'est pourquoi en parallèle s'est constitué un groupe de travail (le WHATWG) qui rassemble des pointures de l'internet (Apple, Google, Mozilla, ... mais pas Microsoft).

Le but est de faire évoluer la norme HTML et de faire pression sur le W3C pour accélérer la roadmap et de lui faire adopter certaines fonctionnalités en standard. Le WHATWG va plus loin en prônant un HTML non versionné et évolutif. De son côté,  le W3C a donc annoncé une version finale du HTML5 en 2014.

La guéguerre des navigateurs

Les spécifications en cours du HTML5 sont l'occasion d'une compétition entre les navigateurs (Safari, Chrome, Internet Explorer, Firefox), pour imposer des éléments non encore dans la norme HTML5. A ce titre, le navigateur qui respecte le plus la norme actuelle du W3C est Internet Explorer 9 (eh oui !), s'agissant des tests effectués. En fait, Chrome et Safari (basés sur le moteur Webkit) implémentent des fonctionnalités qui ne sont pas standardisés. Le but étant de faire adopter celles-ci par le consortium, bref d'imposer des éléments actuellement propriétaires (certains se souviennent de l'époque IE6 / Netscape 4.7).
Actuellement, le risque est grand pour les développeurs de devoir re-développer des fonctionnalités basés sur des techniques dont l'évolution est instable.

Un exemple sont les WebSockets permettant la notification entre le serveur et le client ; actuellement le protocole comporte une faille de sécurité, et il n'est pas sûr que les WebSockets soient conservées sous sa forme actuelle.

Quelques nouveautés du HTML5

Plus de balises sémantiques

Le HTML5 a pour but d'offrir des nouvelles balises sémantiques, adaptées à la structure des pages web : <header>, <footer>, <nav>, <article>, <section>, <aside>, <video>, <audio>plutôt que d'avoir des <div id="header">, <div id="nav">, etc.

La page doit comporter le doctype : <!DOCTYPE html> (Une page HTML doit toujours avoir un doctype, sinon le navigateur passe en mode Quirks !)

Les balises <audio> et <video> permettent de s'affranchir des plugins de lecture. Par contre, le codec n'est pas standardisé. De plus, la balise <video> ne supporte pas les DRM et le smooth streaming.

 
Pour <audio>, les codecs sont MP3, Vorbis (.ogg), AAC.
 
 
MP3
Vorbis
AAC
IE9
X
 
si extension .m4a ou .aac
Firefox 3.6
 
X
 
Chrome
X
X
si extension .m4a
 
Pour <video>, les codecs sont H264 (.mp4), WebM, Theora (.ogg).
 
 
H264
WebM
Theora
IE9
X
X*
 
Firefox 4
 
X
X
Chrome
 
X
X
Safari 5
X
   
Opera 11
 
X
X
* : téléchargement requis du codec
 

Les codecs ne sont pas pris en charge par tous les navigateurs. Par exemple, Firefox ne supporte pas H264 car il n'est pas ouvert (royalty free). Et Chrome prévoit de ne plus le supporter au profit de WebM. Bref, une guerre des codecs en perspective !

Pour le développeur, cela oblige à proposer à l'internaute un triple encodage de la vidéo et à faire du fallback.
Par exemple au sein de la balise <video>, on peut avoir une balise <object> pour charger un .xap (Silverlight), si le codec n'est pas pris en charge.

 
Exemple :
<video id="myVideo" controls autoplay>
  <source src="video.mp4" type="video/mp4; codecs='avc1.4201E,mp4a.40.2'" />
  <source src="video.ogg" type="video/ogg; codecs='theora,vorbis'" />
  <!-- insertion <object> silverlight -->
  <!-- insertion <object> flash -->
</video>

Un exemple plus poussé est donné sur le blog de Niall Kennedy, avec une détection JavaScript.

La balise <canvas> est une zone de dessin, manipulable avec des librairies JavaScript et les primitives, en initiant des contexts (méthode getContext()). Cette balise soulève un problème d'accessibilité car c'est une boite noire, et peut être très couteuse en terme de CPU. Il faut tirer parti de l'accélération matérielle que peut permettre le hardware de la machine (puce de la carte graphique). IE9 offre cette possibilité (voir le site Test Drive).

Les HTML5Forms (ou WebForms)

Attention, c'est toujours en working draft, et à ne pas confondre avec les webforms d'ASP.NET.
Les HTML5Forms ont été proposés par Opera, cela concerne des nouveaux types et attributs de la balise <input> afin de les rendre accessibles. Tous ces éléments ne sont pas tous pris en charge par les navigateurs. En fait, ces nouveautés existent déjà depuis quelques années (avec le web 2.0) en fallbacks avec des librairies AJAX, ou la librairie AjaxControlToolkit d'ASP.NET (gauge bar, calendar, etc.).

  • Attribut placeholder
    Il permet d'avoir un texte alternatif dans l'input lorsque celui-ci est vide et qu'il n'a pas le focus. Si le navigateur ne le prends en compte nativement, des fallbacks existent en jQuery, et plus anciennement avec le contrôle TextBoxWatermark de la librairie AjaxControlToolkit.
  • Attribut autofocus
    Permet d'avoir automatiquement le focus sur un input.
  • Et 13 nouveaux types (date, email, number, ..., etc.)

Quelques nouveautés du CSS3

On peut citer notamment, border-radius pour faire des coins arrondis, et box-shadow pour faire des ombres portées. background peut contenir un fichier *.svg. (un tag HTML ayant un box-shadow par dessus un background en SVG est supporté par IE9).
Des fallbacks existent si le navigateur ne les supporte pas, via des libraires JavaScript, ou en préfixant les instructions CSS en fonction des navigateurs (instructions propriétaires) :

 
<style type="text/css">
.rounded
{
    -moz-border-radius-topleft:3px; /* firefox */
    -moz-border-radius-topright:3px;
    -webkit-border-top-left-radius:3px; /* safari */
    -webkit-border-top-right-radius:3px;
    -khtml-border-top-left-radius:3px; /* konqueror*/
    -khtml-border-top-right-radius:3px;
    border-top-left-radius:3px; /* standard*/
    border-top-right-radius:3px;
}
</style>

Les Media Queries

Une fonctionnalité intéressante sont les Media Queries. Ils permettent d'adapter la résolution du client en fonction du poste client ou du device (smartphone, notebook, tablette), en chargeant des images plus petites. Ce qui évite l'implémentation d'un code JavaScript discriminant. La discrimination (ou device filtering) peut également se faire au chargement des fichiers CSS.

Exemple :
<link href="mobile.css" rel="Stylesheet" type="text/css" media="screen and (max-width:480px)" />
<link href="netbook.css" rel="Stylesheet" type="text/css" media="screen and (min-width:481px) and (max-width:1024px)" />
<link href="laptop.css" rel="Stylesheet" type="text/css" media="screen and (min-width:1025px)" />
On peut citer également les CSS3 animations, les CSS3 transitions mais sont pour l'instant en working draft et donc instables.

WOFF

Web Open Font Format est un wrapper des fonts au format True Type et Open Type. Il permet de télécharger des polices depuis le serveur (via CSS), de manière compressée (téléchargement plus rapide). Le WOFF est en cours de standardisation par le W3C et est soutenu par Microsoft, Mozilla, Opera. Il semble qu'il soit supporté par les dernières versions des navigateurs (sauf Safari actuellement).

SVG 1.1

Scalable Vector Graphics est un langage XML affichant des graphiques vectoriels (donc redimensionnables). Il est stylable par CSS, et est manipulable par JavaScript. SVG a l'avantage de l'accessibilité grâce aux propriétés aria ; mais a aussi l'inconvénient d'être très verbeux (c'est du XML) et peut être très lourd à charger si la page contient beaucoup de graphiques.
Typiquement, SVG est utilisé pour faire du charting. Un bon exemple est la librairie Highcharts JS. C'est une librairie JavaScript qui manipule des graphiques SVG et les rends interactifs.

WebGL

Est basé sur OpenGL, a pour but d'afficher de la 3D dans les pages web. Cette technologie est expérimentale et n'est pas pour l'instant un standard W3C.

Tests de conformité HTML5

Pour vérifier la conformité des pages web sur HTML5, il y a le validateur online du W3C. Le validateur vient d'intégrer dans son moteur le support du HTML5. Après avoir saisi l'URL d'un site, un rapport de test est généré affichant des erreurs et warnings :


 

En parallèle du test des pages web, il y a le test du navigateur pour vérifier si celui-ci intègre les fonctionnalités actuellement en standard, celles expérimentales (et celles propriétaires). Citons ACID3 (émanation du Web Standard Project) qui fait suite aux tests ACID2 et ACID1 ; et HTML5test. Mais ces tests font débat parmi les éditeurs et la communauté des développeurs, dans le contexte de compétition entre les navigateurs.

HTML5 sous Visual Studio

Des add-ons HTML5

La venue d'HTML5 a poussé la communauté ASP.NET à proposer des add-ons pour Visual Studio 2008/2010, mais pour l'instant c'est du ASP.NET MVC. D'ailleurs, MVC est "HTML compliant" et se prête bien à ça. Il n'est pas encore prévu d'avoir des WebControls ou HtmlControls encapsulant les nouvelles balises sur l'ASP.NET classique.
Ces add-ons sont visibles sur codeplex :

Il est possible également de créer un template pour Visual Studio, dans lequel les pages aspx générées auraient un squelette de code HTML5, mais cela mériterait un article sur ce sujet ;-)

Validation HTML5

Le SP1 de Visual Studio 2010 permet maintenant d'avoir un schéma de validation HTML5/XHTML5. Les nouvelles balises sont affichées avec l'intellisense. En revanche, la validation CSS3 n'est pas encore proposée.
Pour Visual Studio 2008, John Dyer a publié en 2009 un schéma de validation permettant d'avoir également l'intellisense.

Device filtering en ASP.NET classique

Une fonctionnalité bien pratique (et à mon avis peu conne) est de mettre en place des fichiers *.browser, dans le but de discriminer du code ou du contenu. Ce qui est affiché au end user est alors filtré en fonction de son navigateur client et/ou de son device (PC, smartphone, pocket PC). Au lieu de faire du test conditionnel en code behind via la propriété Request.Browser.Id, il est possible de le faire en déclaratif dans la page *.aspx.

Exemple de filtrage natif d'Internet Explorer et Firefox

Le device filtering peut s'effectuer sur des propriétés de contrôles HtmlControl ou WebControl, ou contrôles templatisés, ici en préfixant avec "ie" et "mozilla" :

 
<!-- Propriétés préfixées par ie ou mozilla -->
<asp:Label runat="server" ID="labelText"
    ie:Text="This is IE text"
    mozilla:Text="This is Firefox text"
    Text="This is general text"
/>
<br />
<asp:Button runat="server" ID="buttonText"
    ie:Text="IE Button"
    ie:OnClientClick="javascript:alert('Hello IE!');"
    mozilla:Text="FF Button"
    mozilla:OnClientClick="javascript:alert('Hello Firefox!');"
    Text="General Button"
    OnClientClick="javascript:alert('Hello everyone else!');"
/>
<br />
<asp:Menu runat="server" id="myMenu">
 
    <ie:Items>
       <asp:MenuItem Text="IE Item" />
    </ie:Items>
 
    <mozilla:Items>
       <asp:MenuItem Text="Firefox Item" />
    </mozilla:Items>
 
    <Items>
        <asp:MenuItem Text="Other Item" />
    </Items>
</asp:Menu>
 
Il peut s'effectuer également au niveau de certains attributs de la directive @page pour les pages *.aspx, ou la directive @control pour les usercontrols (voir une vue d'ensemble du device filtering en ASP.NET).
 
Cela peut être très utile lorsque on veut référencer une masterpage :
 
<%@ Page Language="C#"
    ie:MasterPageFile="~/MasterPageIE.master"
    mozilla:MasterPageFile="~/MasterPageFirefox.master"
    MasterPageFile="~/MasterPageGeneric.master"
%>

Comment cela fonctionne ?

Le filtrage en natif est basé sur des fichiers *.browser situés dans le répertoire C:\Windows\Microsoft.NET\Framework\<n° de version du fk>\Config\Browsers

 
 
Ce filtrage de base peut être surchargé par l'ajout d'un nouveau fichier *.browser dans une application ASP.NET.

Configurer le filtrage pour IE9, IE8, Firefox dans une application ASP.NET

A l'heure actuelle, le fichier ie.browser (situé dans C:\Windows\Microsoft.NET\Framework\<n° de version du fk>\Config\Browsers) ne contient pas (encore) de définition pour Internet Explorer 9. Il faut donc l'ajouter. Pour cela, il suffit d'ajouter à la racine de votre projet web un répertoire App_Browser (un répertoire réservé d'ASP.NET), lequel contiendra un nouveau fichier que vous nommerez ie9.browser.

 
 
Structure du fichier i9.browser :
 
<!--
You can find existing browser definitions at
<windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers
-->
<browsers>
 
<browser id="IE9" parentID="IE6to9">
  <identification>
    <capability name="majorversion" match="9" />
  </identification>
  <capabilities>
    <capability name="jscriptversion" value="9.0" />
  </capabilities>
</browser>
 
</browsers>
 

La valeur de l'attribut parentID est une valeur existante dans le fichier ie.browser. La version du JScript pour IE9 a été reprise à partir des commentaires conditionnels (code côté client servant à discriminer la version d'Internet Explorer).

Pour illustrer le filtrage, nous allons mettre le code suivant dans la page Default.aspx :

 
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="DeviceFiltering._Default" %>
 
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
  <style type="text/css">
    label{ margin:0 1em 0 0; }
  </style>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
  <h2>Browser filtering in ASP.NET</h2>
 
  <!-- filtrage réalisé en code behind -->
  <div id="divIE9" runat="server">
    <asp:Label id="lblIE9" runat="server" AssociatedControlID="txtNameIE9">Votre nom (sous IE9)</asp:Label>
    <input id="txtNameIE9" runat="server" type="text" />
  </div>
  <div id="divIE8" runat="server">
    <asp:Label id="lblIE8" runat="server" AssociatedControlID="txtNameIE8">Votre nom (sous IE8)</asp:Label>
    <input id="txtNameIE8" runat="server" type="text" />
  </div>
  <div id="divFF" runat="server">
    <asp:Label id="lblFF" runat="server" AssociatedControlID="txtNameFF">Votre nom (sous Firefox)</asp:Label>
    <input id="txtNameFF" runat="server" type="text" autofocus="true" placeholder="Entrez votre nom" />
  </div>
  <div id="divBrowser" runat="server">
    <asp:Label id="Label1" runat="server" AssociatedControlID="txtName">Votre nom</asp:Label>
    <input id="txtName" runat="server" type="text" />
  </div>
 
  <!-- filtrage réalisé en déclaratif -->
  <p>
    <asp:Button ID="btnTest" runat="server"
         ie9:OnClientClick="javascript:alert('IE9 button!')"
         ie8:OnClientClick="javascript:alert('IE8 button!')"
         firefox35:OnClientClick="javascript:alert('Firefox button!')"
         ie9:Text="I'm a button for IE9"
         ie8:Text="I'm a button for IE8"
         firefox35:Text="I'm a button for Firefox" />
  </p>
 
</asp:Content>
 
Et le code suivant dans la page Default.aspx.cs :
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace DeviceFiltering
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                divIE8.Visible = false;
                divIE9.Visible = false;
                divFF.Visible = false;
                divBrowser.Visible = false;
 
                switch (Request.Browser.Id)
                {
                    case "ie8":
                        divIE8.Visible = true;
                        break;
                    case "ie9":
                        divIE9.Visible = true;
                        break;
                    case "firefox35":
                        divFF.Visible = true;
                        break;
                    default:
                        divBrowser.Visible = true;
                        break;
 
                }
 
            }
        }
    }
}
 
Résultat sous IE9 :
 
 
Résultat sous IE9 en mode IE8 :
 
 
Résultat sous Firefox :
 

On peut donc remarquer que l'affichage du bouton se fait de manière déclarative, en préfixant un ID de browser sur un attribut et c'est fini ! :)

Conclusion

Le HTML5 est d'ores et déjà un progrès concernant la sémantique et l'accessibilité des pages web. Ses spécifications auront l'avantage de rendre natives des fonctionnalités telles que les webforms (actuellement rendues avec des librairies AJAX/JavaScript).
Mais attention au buzz marketing effectué autour, et à la dépendance des navigateurs. Car ceux-ci ne l'implémentent pas de la même manière, les performances peuvent être assez différentes d'un device à l'autre. Le HTML5 n'est absolument pas pour l'instant synonyme de développement unique !

Par ailleurs, d'autres briques du HTML5 n'ont pas été évoquées dans ce workshop. Citons le Web Storage (stockage de données dans le navigateur, cache d'application), le Web SQL Database (basé sur SQLite), les Web Workers (scripts JS tournant en tâche de fond), la géolocalisation (via une API JavaScript), les microdata (amélioration du référencement naturel par ajout de données dans les balises, lues uniquement par les robots).

A l'heure de l'expansion imminente du HTML5 sur les sites web et mobile, gageons que les futurs add-ons ou CTP d'ASP.NET apporteront leur lot de nouveauté !

Pour aller plus loin

 

Tags: , , ,

Développement | Evènement

Problème de droit sur les disques après l'installation de SQL Server 2008 R2

by Guillaume Prot 18. juin 2011 00:57

Lors de l’installation de SQL Server 2008 R2 sur un cluster Hyper-V V2, avec un SAN, il faut éviter de faire pointer les répertoires SQL Server directement à la racine des disques. En effet, l’installation efface certains droits utilisateurs des répertoires partagés.

Si l’on paramètre les chemins de données, logs, tempdb, directement à la racine d’un volume, les droits utilisateurs de COMPUTER\Users et COMPUTER\Everyone sont supprimés. Le compte installant SQL Server n’a alors plus accès aux volumes en question, et peut avoir le message suivant lorsqu’il se logue : « The Recycle Bin on F:\ is corrupted. Do you want to empty the Recycle Bin for this drive? ».

Si on souhaite paramétrer les répertoires à la racine, et que l’on a ce problème, le mode opératoire suivant fonctionne :

  • Sur le volume défectueux, aller dans les Propriétés / Sécurité
  • Ouvrir les autorisations spéciales et paramètres avancés
  • Ajouter une autorisation pour le groupe COMPUTER\Users, pour le périmètre « This Folder, subfolders and files » avec les autorisations suivantes :
    • « Traverse Folder / Execute File »,
    •  « List Folder / Read Data »,
    •  « Read Attributes »,
    •  « Read Extended Attributes »,
    •  « Read Permissions »
  •  Ajouter une autorisation pour le groupe COMPUTER\Users, pour le périmètre « This Folder and subfolders » avec les autorisations suivantes :
    • « Create Folder / Append Data»
  • Ajouter une autorisation pour le groupe COMPUTER\Users, pour le périmètre « Subfolders only » avec les autorisations suivantes :
    • « Create Files / Write Data »
  • Ajouter une autorisation pour le groupe COMPUTER\Everyone, pour le périmètre « This folder only » avec les autorisations suivantes :
    • « Traverse Folder / Execute File »,
    •  « List Folder / Read Data », 
    • « Read Attributes », 
    • « Read Extended Attributes », 
    • « Read Permissions »

Si le message « The Recycle Bin on F:\ is corrupted. Do you want to empty the Recycle Bin for this drive? » réapparait lorsque le compte ayant installé SQL Server se logue à nouveau, cliquer sur « Yes », et le problème est définitivement résolu.

 

Tags: ,

Business Intelligence

La première appliance Microsoft Windows Azure débarque en août 2011

by Philippe Limantour 12. juin 2011 19:27

Microsoft et Fujitsu annoncent la première appliance Windows Azure pour ce mois d'août, en test auprès d'une dizaine de sociétés depuis avril.

L'appliance permet à une société de s'équiper chez elle d'une plateforme Windows Azure afin de stocker ses données et ses programmes sur son site plutôt que dans l'un des vingt datacenters Microsoft de part le Monde. Cette appliance est particulièrement interessante pour les entreprises qui ont de très grandes quantités de données à traiter, évitant des transits réseaux. La plateforme Windows Azure accueille un nombre croissant de solutions : http://www.microsoft.com/windowsazure/evidence/

Tags: , ,

Cloud | Développement | Infrastructure | Innovation

Publier BizTalk 2010 sur internet avec Azure AppFabric Service Bus

by Franck Musson 31. mai 2011 23:59

La dernière version de l'EAI/BPM de Microsoft BizTalk 2010 offre une extension très interessante liée à la plateforme Cloud du même éditeur : "Windows Azure Platform".

Le Composant "BizTalk 2010 AppFabric Connect for Services" est inclus dans le version developer de BizTalk 2010.

Il est aussi possible de télécharger le "BizTalk Server Feature Pack (october 2010)"  avec sa documentation à l'adresse suivante : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f7735a19-cdb3-4f52-8e7b-c58f04c5c86a .

Les autres pré-requis sont bien évidement de disposer d'une souscription à "Windows Azure" et l'installation du "Windows Azure AppFabric SDK 1.0" : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=39856a03-1490-4283-908f-c8bf0bfad8a5 . Attention ! le SDK de Azure AppFabric V2.0 est en CTP et l'accès à Azure AppFabric 2 n'est disponible pour l'instant qu'aux béta-testeurs.

Windows Azure AppFabric

Fournit une messagerie sécurisée et de la connectivité à travers différentes topologies de réseau.

Permet aux applications hybrides de s'étendre au Cloud.

Support de différents protocoles de communication et des patterns pour les développeurs permettant de bâtir des systèmes de messaging fiables avec le nuage.

 Ci-dessous les différentes composantes de Azure AppFabric

Nous allons donc utiliser la partie "Service Bus", optionnellement le bloc "Access Control" peut lui aussi être utilisé si l'on souhaite une authentification fédérée.

Windows Azure Subscription

Vous devez avoir accès aux options "Service Bus, Access Control & Caching" afin de pouvoir créer votre propre namespace.

BizTalk 2010 AppFabric Connect for Services

AppFabric Connect for Services permets aux utilisateurs de Biztalk 2010 d'exposer leur orchestrations "On-Premise" en tant que services WCF accessibles dans le nuage. ces services pourront alors être utilisés par des clients ou partenaires sans pour autant ouvrir le firewall de l'entreprise et n'exposant aucun "Endpoint" sur internet.

Le Service Bus permets de publier des Web Services "internes" vers des clients externes dans le Cloud, l'utilisation d'un service de "Relay" servant de "Broker" de messages.

Pour une plus simple explication voir le schéma ci-dessous

Cette technique n'est bien sûr pas spécifique à BizTalk, mais à tout code .Net utilisant le SDK d'Azure AppFabric (reportez vous aux Labs présents dans le WAPTK May 2011 Refresh). à titre d'exemple je vous recommande le blog de Benjamin Guinebertière (twitter.com/benjguin), Architecte Evangéliste Microsoft, qui explique comment il a publié la plateforme d'intéropérabilité SAP (ECC 6) présente au MTC de paris (Microsoft Technology Center). ICI

Vous noterez, que le Service "On-Premise" ou l'orchestration Biztalk restent derrière le firewall, aucun port TCP entrant n'est ouvert, le service ou l'orchestration doivent juste avoir la possibilité de sortir sur internet en direct ou à travers un proxy. tout protocole basé sur TCP est supporté, UDP ne l'est pas.

AppFabric Connect for Services étend les fonctionnalités du Biztalk WCF Service Publishing Wizard pour permettre au développeur BizTalk de publier les ports de son application "On Premise" vers des clients externes à travers le Windows Azure AppFabric Service Bus (Relay Binding).

 Que fait le Wizard ?

  1. Publie un endpoint "local" WCF pour un port BizTalk
  2. Publie un endpoint "Service Bus" pour le service WCF "local"
  3. Publie un endpoint "Service Bus" pour le metadata exchange du service WCF local (les contrats publics sont disponibles sur Azure via une page RSS) - optionnel
  4. Crée les receive ports pour les orchestrations BizTalk.

Je déconseille habituellement, d'exposer un serveur BizTalk directement sur internet qui est un serveur d'intégration , recommandant de positionner un serveur web ou un serveur d'applications comme Windows AppFabric Server pour gérer au plus près les problématiques de sécurité et celles liées aux infrastructres réseau internes.

Je dois dire qu'avec ces nouvelles fonctionnalités il devient réellement possible d'exposer un BizTalk 2010 sur le Cloud.

Pour la mise en place d'une solution, je vous invite à suivre la documentation d'AppFabric Connect for Services ou il ya un Lab vraiment bien fait. il y a aussi le blog du BizTalk Server Team ICI

 

Tags: , , , ,

Biztalk | Cloud

Suivre l’avancement des workflows SharePoint à l’aide de visio

by brouelle 25. mai 2011 02:52

On peut facilement suivre un workflow SharePoint réalisé avec SharePoint Designer sur une visualisation Visio, mais qu’en es-t-il des workflows réalisés avec Visual studio ?

Partons d’un workflow déjà réalisé sous Visual studio 2010

image

On aimerait afficher une représentation visio de ce workflow sur la page de statut du workflow.

La première chose à faire est de déployer la visualisation du workflow sur le SharePoint, ça tombe bien le module est fait pour ça :

image

On a créé un vdw basé sur le modèle de processus SharePoint dans visio qu’on a ajouté à notre module.

Il faut maintenant spécifier où le déployer sur SharePoint, cela se fait simplement via le Elements.xml.

image

Une dernière petite configuration dans le Elements.xml du workflow :

image

On a ajouté deux balises, une, ShowPreview qui indique à SharePoint qu’on veut afficher la prévisualisation de notre workflow et une, PreviewHref, qui donne l’url de la prévisualisation. A noter que ces deux balises ne sont pas dans l’intellisense.

Si nous déployons dans l’état le workflow nous allons en obtenir la visualisation, mais elle ne sera pas mise à jour au fur et à mesure de l’avancement de l’exécution. Pour que cela soit possible il faut exporter le workflow à partir de visio.

image

Visio génère un .vwi, qui n’est rien d’autre qu’un zip, en le renommant on accède aux fichiers le constituant et on peut ouvrir le .xoml avec l’éditeur de son choix (ici notepad)

image

On retrouve des valeurs dans la description qu’il “suffit” de copier-coller dans la description des activités correspondantes du workflow visual studio, et on obtient une visualisation du workflow mise à jour pendant son exécution.

Tags:

SharePoint

White Paper : Best Practices pour virtualiser Exchange Server 2010 sous Hyper-V v2

by Brice Cousantien 23. mai 2011 20:25

La team Exchange vient de sortir une nouvelle bible de 38 pages sur l'art de concevoir son Infrastructure de messagerie Exchange 2010 SP1 en environnement virtuel.  La plateforme cible est bien sur Windows Server® 2008 R2 Hyper V.

Ce white paper balaye de nombreux sujets techniques, qui sauront intéresser nombre d'IT en charge d'étudier un design de leur solution de messagerie quelque soit bien évidemment la cible :)

Au menu :

- Rappel des concepts,

- Meilleures pratiques pour virtualiser Exchange,

- Meilleures pratiques pour la répartition des rôles (Mailbox, HUB, CAS & Edge)

- Bonnes pratiques Hyper-v

- Stockage & Hyper-v

- Capacity Planing  Exchange / Hyoer-v

- Aide à la définition de son SLA

- Comment valider les performances HV / Exchange

- ...

En somme, une mine d'informations au sens large, à voir ou à revoir sans modération.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=8647c69d-6c2c-40ca-977e-18c2379b07ad

Tags: , ,

Collaboratif

Evolution de la supportabilité d'Exchange 2010 en Environnement Virtuel

by Brice Cousantien 23. mai 2011 19:34

  Microsoft, par l'intermédiaire de sa Team Exchange, vient d'étendre la supportabilité d'Exchange 2010 en environnement virtuel, pour deux nouveaux scénarii:

- Le rôle messagerie Unifiée est maintenant pleinement virtualisable

- La combinaison  Haute Disponibilité E2K10 (DAG) & mécanisme Haute Disponibilité de l'environnement virtuel (LiveMigration, Vmotion, ...) est maintenant couverte.

Preuve que les mécanismes de HA des plateformes de virtualisation sont maintenant bien matures & robustes.Voilà de quoi asseoir de belles évolutions de votre plateforme Collaborative J

 

Plus d'informations :

http://blogs.technet.com/b/exchange/archive/2011/05/16/announcing-enhanced-hardware-virtualization-support-for-exchange-2010.aspx

 

 

Tags: , , ,

Collaboratif

Neos-SDI  Neos-SDI