WWDC 2018 : une semaine exceptionnelle à San José

Par défaut

Cette année j’ai eu la chance de pouvoir aller assister à la grande messe annuelle Apple en Californie. Cela fait trois années consécutives qu’Informatique Banque Populaire envoie un de ses développeurs à la WWDC, c’est une expérience incroyable et je vais essayer de vous faire vivre ça dans les lignes qui suivent. Attachez votre ceinture, on part dans le monde merveilleux des Apple Addicts.

la suite…

Comment obtenir son numéro DUNS gratuitement ?

Par défaut

Je viens d’avoir un cas particulier pour un de mes clients qui voulait déployer une application iOs sur l’App Store avec son nom.

J’ai donc commencé par créer le compte Apple Développer sur l’Apple Member Center. Rien de bien compliqué lors de la création du compte en lui-même. Le problème est apparu lorsque l’on a voulu s’affilier au programme Apple Développer « Organisation » : compte qui permet d’utiliser la raison sociale comme vendeur sur le store.

L’information manquante était le D-U-N-S® Number: l’équivalent du numero SIREN à l’international. Lorsque l’on cherche DUNS number gratuit sur internet, on tombe sur des sociétés françaises qui s’occupent de récupérer le numéro DUNS pour vous… moyennant une trentaine d’euros.

Qu’est-ce que 30€ lorsque l’on a une société ? Franchement pas grand chose, mais je préfère que mon client me paie un resto plutôt que de payer un tiers à ne rien faire:

Le numéro DUNS peut être récupéré gratuitement auprès de l’organisme américain qui s’occupe de ça. Il suffit d’aller sur le site de Dun & Bradstreet (D&B) :

http://fedgov.dnb.com/webform/displayHomePage.do

Et de remplir le formulaire pour trouver votre société. Si jamais elle m’apparait pas, c’est certainement qu’elle n’est pas encore indéxé ici. Pas la peine de chercher autre part, les sociétés qui s’occupent de récupérer les numéros DUNS passent aussi par ce formulaire. Le numéro DUNS vous sera envoyé gratuitement par mail en moins d’une heure ! Que demande le peuple ?

 

{CSS,iPhone]Comment empêcher l’iPhone de changer le rendu d’une page internet?

Par défaut

Le truc le plus chiant lorsque l’on fait un site internet, c’est de se rendre compte que les mesures qu’on s’est fait $£%%!? à calculer ne sont pas prises en compte par le navigateur web tiers. C’est le cas avec Safari pour iPhone.  Cet idiot réinterprete les données… Donc au lieu d’avoir l’affichage de la page internet identique au navigateur Chrome / IE / Firefox :

On a l’affichage suivant :

La solution pour remédier à ça: ajouter dans la balise body la ligne suivante:

-webkit-text-size-adjust: none;

Et voilà le travail! Ça marche merveilleusement bien maintenant!

{Silverlight] Comment définir après déploiement l’adresse d’un endpoint WCF?

Par défaut

Le Silverlight, c’est une technologie vraiment cool, on peut faire à peu près ce qu’on veut mais parfois on se casse la tête sur des petites choses… Par exemple, comment faire pour modifier l’adresse d’un endpoint WCF? Car oui, ces informations sont inclues à la compilation dans le fichier XAP qui regroupe toute l’application Silverlight.

On a beau chercher, il n’y a plus de fichier de configuration de disponible pour modifier les adresses ip du/des serveur(s) WCF. C’est largement ennuyeux lorsque l’on doit débugger ou switcher à la demande l’adresse du service.

Pour résoudre ce problème, il suffit de regarder du coté du projet web qui héberge l’application Silverlight et plus particulièrement dans la balise object de la page ASPX. Il existe de nombreux paramètres que l’on peut transférer à l’application Silverlight dont la InitParams:

<param name= »InitParams » value= »url=http://localhost:12345/ » />

Je n’ai plus qu’à récupérer ce InitParams dans mon application Silverlight. Ce que je fais dans l’Application Startup:

private void Application_Startup(object sender, StartupEventArgs e)
{
  foreach (var item in e.InitParams)
  {
    switch (item.Key)
    {
       case "url":
         Singleton.Instance.URLParam = item.Value;
         break;
       default:
         break;
    }
  }
  this.RootVisual = new MainPage();
}

Ci-dessus, je place dans un singleton la chaine de l’URL passée via les initParams.  Il ne reste plus qu’à initialiser à la création d’un context WCF un endpoint avec la nouvelle adresse!

  public static MonServiceClient getService()
  {
     Uri uriSIC = new Uri(Singleton.Instance.URLParam + "Service_Exemple.svc?wsdl");
     var adrSIC = new EndpointAddress(uriSIC);
     var _SIC = new MonServiceClient("BindingExemple", adrSIC);
     return _SIC;
  }

Et voilà, il ne me reste plus qu’à utiliser cette instance de MonServiceClient afin d’accéder au WCF avec la bonne adresse!

{Silverlight] Le chargement de cet assembly produirait un jeu accordé différent des autres instances.

Par défaut

Et hop, une autre erreur à la con dans silverlight: globalement je ne sais pas comment j’en suis arrivé à ce problème. J’étais tranquillement en train de jouer avec le designer de visual studio quand c’est arrivé, en complet, ça affiche ça:

Description : Une exception non gérée s’est produite au moment de l’exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d’informations sur l’erreur et son origine dans le code. 

Détails de l’exception: System.IO.FileLoadException: Le chargement de cet assembly produirait un jeu accordé différent des autres instances. (Exception de HRESULT : 0x80131401)

Erreur source: Une exception non gérée s’est produite lors de l’exécution de la requête Web actuelle. Les informations relatives à l’origine et l’emplacement de l’exception peuvent être identifiées en utilisant la trace de la pile d’exception ci-dessous.

Trace de la pile:

[FileLoadException: Le chargement de cet assembly produirait un jeu accordé différent des autres instances. (Exception de HRESULT : 0x80131401)]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +1136
System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +111
System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture) +23
System.Web.HttpRuntime.CreateNonPublicInstance(Type type, Object[] args) +60
System.Web.Configuration.HttpModulesSection.CreateModules() +221
System.Web.HttpApplication.InitModules() +28
System.Web.HttpApplication.InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers) +828
System.Web.HttpApplicationFactory.GetNormalApplicationInstance(HttpContext context) +304
System.Web.HttpApplicationFactory.GetApplicationInstance(HttpContext context) +107
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +327

Et là ça fait peur comme erreur. Je cherche un peu sur le net, rien de bien intéressant. Certains topic parlent de changer une valeur dans la Base de registre. Je suis toujours frileux à effectuer ce genre de manipulation. On sait jamais…

Dans le doute, je me fait un petit reboot de la machine et 5 minutes plus tard, tout est OK. Comme quoi l’informatique, c’est parfois pas compliqué.

 

{Silverlight] NullReference exception avec le Designer Silverlight dans Visual Studio 2010

Par défaut

C’est fou mais parfois, notre PC fait vraiment des trucs moches. Dernier exemple, la mise à jour vers Silverlight 5 du plugin navigateur. Et là le drame: mon application compile toujours, s’exécute correctement mais ne s’affiche plus design dans l’éditeur, j’ai le droit à une jolie erreur du type:

Une exception non gérée s’est produite

Et en détail:

System.NullReferenceException
La référence d'objet n'est pas définie à une instance d'un objet.
à Microsoft.Windows.Design.Platform.SilverlightMetadataContext.SilverlightXamlExtensionImplementations.<GetXmlNamespaceCompatibilityMappings>d__8.MoveNext()
à MS.Internal.Design.Metadata.ReflectionProjectNode.BuildSubsumption()
à MS.Internal.Design.Metadata.ReflectionProjectNode.SubsumingNamespace(Identifier identifier)
à MS.Internal.Design.Markup.XmlElement.BuildScope(PrefixScope parentScope, IParseContext context)
à MS.Internal.Design.Markup.XmlElement.ConvertToXaml(XamlElement parent, PrefixScope parentScope, IParseContext context, IMarkupSourceProvider provider)
à MS.Internal.Design.DocumentModel.DocumentTrees.Markup.XamlSourceDocument.FullParse(Boolean convertToXamlWithErrors)
à MS.Internal.Design.DocumentModel.DocumentTrees.Markup.XamlSourceDocument.get_RootItem()
à Microsoft.Windows.Design.DocumentModel.Trees.ModifiableDocumentTree.get_ModifiableRootItem()
à Microsoft.Windows.Design.DocumentModel.MarkupDocumentManagerBase.get_LoadState()
à MS.Internal.Host.PersistenceSubsystem.Load()
à MS.Internal.Host.Designer.Load()
à MS.Internal.Designer.VSDesigner.Load()
à MS.Internal.Designer.VSIsolatedDesigner.VSIsolatedView.Load()
à MS.Internal.Designer.VSIsolatedDesigner.VSIsolatedDesignerFactory.Load(IsolatedView view)
à MS.Internal.Host.Isolation.IsolatedDesigner.BootstrapProxy.LoadDesigner(IsolatedDesignerFactory factory, IsolatedView view)
à MS.Internal.Host.Isolation.IsolatedDesigner.BootstrapProxy.LoadDesigner(IsolatedDesignerFactory factory, IsolatedView view)
à MS.Internal.Host.Isolation.IsolatedDesigner.Load()
à MS.Internal.Designer.DesignerPane.LoadDesignerView()

Ce qui donne un truc incompréhensible. J’ai passé de nombreuses heures à tenter de réparer ça. Dans l’ordre:

  1. Réinstallation de Silverlight: FAIL
  2. Réinstallation de Silverlight toolkit: FAIL
  3. Réparation de Visual Studio: FAIL
  4. Réinstallation de Silverlight et réinstallation suite à la demande de visual studio: FAIL
  5. Prier le Dieu du .NET: FAIL
  6. Désinstallation de Visual Studio 2010, de Silverlight et compagnie et réinstallation dans l’ordre: OK
Voilà, comme quoi on revient aux sources: ça ne marche plus, on désinstalle tout, on reboot et on réinstalle tout comme il faut. Si j’avais fait ça, j’en aurais eu pour 4h, là j’ai perdu 2 jours. Allé salut.

 

 

{C#] Echec du fournisseur sous-jacent sous open avec SQL Server Compact 3.5 et Entity Framework, comment faire?

Par défaut

Le bug de la semaine est dédié à cette erreur: l’Echec du fournisseur sous-jacent sous open, une erreur barbare pour de nombreuses sources de problèmes. En effet, l’Echec du fournisseur sous jacent sous open ou dans la langue de Shakespeare « The underlying provider failed on Open. » est une erreur générique qui globalement signifie « Je n’arrive pas à me connecter à la base de données ».

Mais ça m’arrange pas plus que ça… Mon programme fonctionne très bien sous Windows 7, mais pas sous XP. Alors là faut m’expliquer, normalement le Framework .NET est fait de telle façon à ce que sur les plateformes équipées du Framework, ça marche. Enfin du moins, c’est ce que je croyais.

En regardant un peu plus loin dans stacktrace, on remarque que l’erreur est bien liée l’ouverture de connexion: « OpenStoreConnectionIf« . Mais rien n’aide à comprendre sur la source de l’erreur.

Après quelques recherches, j’ai trouvé mon problème: le mot de passe sur le fichier SQL Server Compact était vide. Pour une raison encore obscure, il faut mettre un mot de passe à la base de données, sinon la connexion n’est pas possible avec Entity Framework. Et ça, uniquement sur Windows XP!

{Visual Studio] La version de clr.dll figurant dans la cible ne correspond pas à celle pour laquelle mscordacwks.dll a été généré.

Par défaut

La petite erreur sympa de la semaine lors de la compilation d’un de mes projets:

Alors pour faire simple, il s’agit d’un message qui apparaît d’un coup. Cinq minutes avant tout fonctionnait. Le redémarrage habituel du Visual Studio n’y change rien…

Car il s’agit d’un problème lié à une mise à jour en cours du système. Et oui c’est à cause de la mise à jour du Framework en fond via Windows UpdateLa solution est alors très simple, on laisse la mise à jour se terminer et on reboot l’ordinateur!

 

{C#] Comment sauvegarder un mail sur le disque au lieu de l’envoyer par SMTP?

Par défaut

Lors des développements, on est souvent confronté au problème du mail de validation client à envoyer… Seul problème, lorsque l’on se branche sur la base de production avec des vrais données, on ne veut surtout pas que les mails partent… La solution est d’intercepter le mail avant qu’il ne soit envoyé sur le serveur smtp… Il suffit pour ça de modifier le fichier de configuration de l’application:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp"/>
    </smtp>
  </mailSettings>
</system.net>

Et voilà, dorénavant, les mails ne seront plus expédiés, mais sauvegardés dans C:/Temp. Pas besoin de modifier le code (SmtpClient ou MailMessage )

Microsoft Search Server, Sharepoint et autres subtilités…

Par défaut

Dernièrement, il m’a été donné de travailler sur Search Server 2010, le service de recherche de Microsoft destiné à sa suite Sharepoint. Mais un problème apparaissait en debug à l’appel du service web de recherche:

Microsoft.Office.Server.Search.WebControls.SrhdcNoInternalUrlException

Ce qui est assez compliqué avec les erreurs Sharepoint, c’est qu’elles sont rarement compréhensibles…

Microsoft.Office.Server.Search.WebControls.SrhdcNoInternalUrlExceptionSoit en détail:

<ResponsePacket xmlns= »urn:Microsoft.Search.Response »><Response domain= »QDomain »><Status>ERROR_SERVER</Status><DebugErrorMessage>

Microsoft.Office.Server.Search.WebControls.SrhdcNoInternalUrlException

</DebugErrorMessage></Response></ResponsePacket>

Rapidement, on voit qu’on a un problème d’URL Interne, kesako? En attendant, je vais quand même essayer d’accéder à la page internet de recherche de Sharepoint:

L’application Web est introuvable à l’adresse http://search/. Vérifiez que l’URL a été correctement entrée. Si l’URL doit héberger un contenu existant, l’administrateur système devra peut-être ajouter à l’application concernée un nouveau mappage pour l’URL de demande.

Bon ça m’aide pas plus, je me rends compte qu’il n’arrive pas à accéder au service de recherche en passant par http://search/… Ce qui peut paraitre normal car mon serveur windows se nomme http://search-1/. Mais pour une raison obscure lié à l’architecture, je dois continuer à passer l’URL suivante: http://search/.

La solution se trouve être le mappage d’accès de substitution. Pour corriger le problème, il suffit d’aller dans Administration Centrale > Gestion des Applications > Configurer les mappages d’accès de substitution et on ajoute une url interne ce qui donne :


Et une fois modifié, ma recherche est accessible de n’importe où sur mon réseau! Et surtout via l’URL personnalisée!