VB.NET – Changement des caractéristiques d’une police de caractères (« font »)

Problématique

Vous voulez changer la police d’un label ou d’un button. Pour la couleur, c’est facile, je ne vous ferai donc pas l’affront de vous l’expliquer. Mais pour passer en gras ou en italique, vous avez sûrement essayé

myButton.Font.Bold = True (ça ne marche pas, c’est un exemple)

Echec sur toute la ligne car, VB.NET vous répond que le propriété est Read Only

Solution

La vraie solution est la suivante :

myButton.Font = New Font([famille de font], [taille de la font], [style de la font]

[famille de font] peut prendre les valeurs :

  • FontFamily.GenericMonospace
  • FontFamily.GenericSansSerif
  • FontFamily.GenericSerif

[taille de la font] est exprimé en points, sachant que la valeur par défaut est 8.25

[style de la font] peut prendre les valeurs :

  • FontStyle.Bold
  • FontStyle.italic
  • etc …

Les paramètres sont assez explicites et c’est plutôt sympathique. Mais reconnaissez que la procédure n’est pas intuitive.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

VB.NET – Une ruse pour la mise en forme d’un formulaire

Problématique

Vous voulez positionner au quart de poil un control TextBox, Label ou autre ComboBox. Et avec la souris, ça saute plusieurs pixels à la fois. Et donc, ça ne retombe jamais pile à l’endroit que vous visiez.

Solution

Vous sélectionnez le contrôle et vous le déplacez avec les flèches de direction. Une pression sur une des touches de direction = 1 pixel de déplacement.

Si après ce conseil destiné à économiser vos nerfs vous n’y arrivez pas, deux solutions : vous avez Parkinson ou, plus vraisemblablement, il faut sérieusement penser à passer au lait-grenadine ou au Perrier-rondelle.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

VB.NET – Les curseurs

Problématique

Vous voulez modifier le curseur pour afficher le curseur d’attente pendant un traitement et revenir au curseur par défaut ensuite. Et vous ne trouvez pas parce que n’est pas intuitif.

Solution

C’est simple mais comme on ne fait pas ça toutes les 5 mn, on oublie à chaque fois et c’est très énervant. Donc voici la solution pour moi comme pour vous.

Pour le curseur d’attente :

Cursor = System.Windows.Forms.Cursors.WaitCursor

pour revenir au curseur par défaut :

Cursor = System.Windows.Forms.Cursors.Default

pour d’autres curseurs, quand vous aurez tapé le point après Cursors, VB se fera un plaisir de vous en proposer d’autres.

Evidemment, si vous avez mis en en-tête de votre form

Imports System.Windows.Forms,

vous pouvez vous passer des trois premiers termes. Mais c’est bien lourd pour un petit curseur.

Bon en fait ce n’est pas intuitif du tout et pas simple non plus.

LE TOUR EST JOUÉ ! ALORS ON  DIT MERCI QUI ?

VB.NET – Ajouter des noeuds dans un TreeView … et les retrouver

Problématique

Même si on visualise bien en quoi ça consiste, il n’est pas toujours facile de manipuler les TreeView. La logique est tellement évidente qu’on se prend facilement les pieds dans le tapis. Mais quand on y est, quel bonheur !

Solution

Ajouter un noeud dans un TreeView

Tout d’abord, quand vous construisez un TreeView (on l’appellera par la suite mùyTreeView), il commence à vide. Il dispose d’une collection Nodes vide. Il faut donc créer le noeud « racine ».

Avec ce noeud-racine, nous apprendrons comment créer un noeud quelconque. Il y a plusieurs syntaxes incluant en particulier celles qui permettent d’assigner une icône au noeud. Mais je n’ai pas encore utilisé cette fonctionnalité, je ne vous en parlerai pas puisque que je ne parle que de ce que j’ai pu faire. Les deux possibilités principales sont :

  • myTreeView.Nodes.Add(text)
  • myTreeView.Nodes.add(key, text)

key et text sont deux paramètres, au format « string » bien entendu, plutôt fondamentaux :

  • key est comme son nom l’indique, le nom du noeud et surtout le moyen d’y accéder
  • text est le texte qui s’affichera sur le noeud. Il est donc tout aussi important. Il n’en est pas moins facultatif puisque vous pouvez parfaitement souhaiter ne pas afficher de texte à un noeud d’un arbre.

Mais étrangement, VB.NET vous propose d’abord de créer un noeud par son texte. Bon …

Par exemple, key pourra être le n° client et text son nom. Classique …

Ces deux données peuvent être lues et mises à jour par les instructions :

  • key :  node.Name = « key »
  • text : node.Text = »text »

ATTENTION DANGER !

key est une string, mais votre clef peut être numérique donc :

à la création du noeud, vous pouvez tout à fait passer la veleur de la clef en numérique, VB convertira automatiquement en string

Mais à la lecture (voir plus loin), il faudra chercher cette clef au format string en la convertissant en string par CStr(key) sinon il cherchera un index.

Imaginez que vous cherchez un n° de Sécu, en mode texte il trouvera sans problème si vous oubliez la conversion (le cast), il cherchera un index de rang 10000 milliards. je ne doute pas que vous gériez des projets titanesques mais à ce point ! Vous risquez plutôt de recevoir de VB un message d’insultes et ce sera bien fait car je vous aurais prévenus.

Mais vous me direz, et vous aurez raison : « c’est quoi node ? ». C’est la variable TreeNode qui contient le noeud. « Ah bon ? et comment la retrouve-je ? » direz-vous car vous êtes pleins de bon sens ? C’est l’objet du paragraphe suivant.

Comment retrouver un noeud dans l’arbre ?

Les deux manières principales sont habituelles en Visual Basic :

  • par l’index du noeud
  • par la key du noeud

Par l’index

L’index est le n° d’ordre du noeud « fils » dans la collection des sous-noeuds du noeud « père ». Ce numéro est généré automatiquement. On peut l’utiliser pour lister les noeuds « fils » mais pour retrouver le noeud, ce n’est pas l’idéal. Par exemple, on peut procéder de la manière suivante :

dim node as TreeNode

for i=1 to Nodes.Count

if Nodes(i). Text = [votre condition] (ou Nodes(i).Name = [votre condition si votre test est sur la clef du noeud]) then

node=Nodes(i)

exit for

endif

next

mais « c’est quoi Nodes me direz-vous ? » car décidément vous ne posez que des questions intelligentes. Et je vous répondrai ensuite car il faut y aller par étapes.

Par la clef

Là c’est beaucoup plus simple pour retrouver le noeud visé, il suffit d’écrire :

node=Nodes(key)

vous comprendrez pourquoi je préfère cette méthode.

La collection Nodes

Nous avons cherché dans la collection Nodes. Mais qu’est-elle ? (à prononcer doucement car « mékétel » ne veut rien dire).

Ne tombez pas dans le panneau dans lequel je suis tombé. La collection Nodes est celle des sous-noeuds d’un noeud donné et non celle des noeuds du TreeView.  Dans un  TreeView, vous pourrez donc avoir des noeuds qui ont la même clef à condition qu’il ne soient pas au même niveau dans la même branche : à monn avis, ce n’est pas sain.

Pour être plus clair, même si vous avez une key unique dans le TreeView, vous ne la trouverez par

myTreeView.Nodes(key)

que si elle est au premier niveau de l’arborescence.

Ce qui signifie que pour retrouver une clef dans un arbre complet, il vous faut écrire une recherche récursive. Vous savez sans doute le faire, sinon un peu de patience, j’en parlerai bien un jour.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

CSS – Balise

Problématique

Si vous utilisez une balise <ol> (ordered list) en mode « numéros », vous souhaitez peut-être commencer ailleurs qu’à 1.

Pour cela, il suffit de déclarer :

<ol start= »12″> (par exemple)

</ol>

Mais on raconte dans les milieux bien informés que cette balise ne serait plus maintenue, qu’elle serait deprecated ? Qu’en est-il ?

Solution

HTML : la commande start a, semble-t-il, connu des heures difficiles lors du passage à HTML 4.

Mais avec HTML 5, elle a retrouvé toute sa place, la preuve sur le site officiel du W3.org.

Et en CSS ? CSS ne connaît pour <ol> pour la description du mode d’énumération de la liste (il en a d’autres …) que les 4 propriétés suivantes :

list-style regroupement des propriétés suivantes dans une déclaration unique
list-style-image spécifie l’image qui fera office de marqueur de liste
list-style-position précise si le marqueur apparaîtra à l’extérieur ou à l’intérieur du contenu
list-style-type spécifie le type de marqueur

qui peuvent prendre les valeurs suivantes

list-style-image URl de l’image
list-style-position inside, outisde, inherit
list-style-type disc, square, circle, etc …

Donc :

  • en HTML, on peut proposer une position de départ différente de 1
  • en CSS, on ne le peut pas

LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

A lire

HTML, XHTML et CSS pour les Nuls (Jeff Noble, Ed Titlle)

 

WordPress – Sur mon blog, je reçois des flots d’inscription de users manifestement indésirables

Logo WordPressProblématique

Au démarrage de mon blog, deux ou trois fois par jour, je recevais des demandes d’inscription d’users manifestement spammés. Je ne connais en effet aucun pays du monde dont les habitants portent les noms charmants de qsdflj12er et seraient suffisamment dérangés pour avoir comme adresse mail hhk654ddqs@gmail.com.

C’est énervant, ça pollue et on se demande ce qu’ils viennent faire là aussi visibles qu’un cheval de bois au milieu de la place de Troie. Des chevaux de Troie ? Pas sûr. Mais

Timeo Danaos et dona ferentes

Je crains les Grecs même ceux qui font des cadeaux

donc autant les éliminer sans pitié. Mais ils reviennent et s’accrochent, ce qui prouve bien qu’il s’agit de robots.

Solution

Premier principe : dans Réglages > Utilisateurs, mettre comme rôle par défaut Abonné. Vous n’avez pas, je l’espère, donné comme rôle par défaut Administrateur (il est d’ailleurs surprenant que WordPress autorise ce choix).

Et deux méthodes

  • répérer l’IP et la bloquer par le .htaccess en insérant les lignes

order allow,deny
deny from 99.99.99.999 (c’est un exemple …)
allow from all

ou

order allow,deny
deny from 99.99.99
allow from all
s’il s’agit d’une famille d’IP 99.99.99 qui vous harcèle

  • mais attention s’il s’agit d’une IP de type 10.0.0, celle qu’utilisent les plus malins, il s’agit d’une adresse de routeur. Or les routeurs ne sont que nuisibles, vous risquez donc de filtrer de braves gens intéressés par votre blog. Or il est connu qu’accueillir le client à coup de chevrotines n’est pas le meilleur moyen de réussir dans le commerce. Donc la méthode par .htaccess n’est pas adéquate. Dans ce cas, ajouter dans le robots.txt les lignes

User-agent : *
Disallow : /wp-login.php

Ceci dit, les bons spammeurs, non il n’y a pas de bons spammeurs, disons les spammeurs compétents passent outre le robots.txt. Donc ce n’est pas gagné d’avance.

Comme je vous le disais dans un précédent post, il est impossible d’éviter les grands malfaisants mais juste de se protéger contre les petits malfrats de passage.Là en toute modestie, je ne vous dirai pas l’habituel « le tour est joué ! Alors on dit merci qui ? » mais

BONNE CHANCE !

Pour en savoir plus, quelques livres sur WordPress

WordPress – Je viens d’écrire mon premier article et je ne réussis pas à le relire

Problématique

Vous venez de créer votre blog WordPress. Vous avez écrit votre premier article. Vous affichez la page d’accueil : tout va bien. Vous cliquez sur le titre pour voir la page de l’article. Et pan ! La page 404 arrive.

Je vous rassure. J’oublie cette étape à chaque fois moi aussi.

Que se passe-t-il ?

Solution

Pour les permaliens, vous avez sans doute opté pour une forme autre que la forme courte du style monsite.com?p=12. Et vous avez eu raison:  pour le SEO, on fait plus explicite. Vous avez sans doute opté comme moi pour le titre long (regardez en haut dans la barre d’adresse).

Et vous avez oublié quelque chose. Quoi ? le .htaccess bien sûr. Pourtant WordPress vous affiche ce qu’il faut insérer mais à ce moment-là le petit dernier vient de rentrer de classe ou Madame du travail et vous avez zappé.

Car WordPress, et c’est sa force, a sa manière à lui de gérer les liens et les URL. Mais sans les règles de redirection de .htaccess, il y aura des problèmes. Dont celui que vous rencontrez là.

Alors ouvrez votre .htaccess préféré et ajoutez les fameuses lignes

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

De préférence, insérez-le et gardez les en fin du .htaccess. Elles sont là définitivement. D’autres lignes viendront ultérieurement, vous les mettrez en tête du .htaccess pour les surveiller comme le lait sur le feu.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur WordPress sont sur

DerniersParus.com » WordPress

WordPress – L’admininistration

WordPress - L'admininistrationProblématique

Le user admin est le premier créé automatiquement par WordPress. Et inutile de préciser l’importance de l’administrateur. Qui n’a pas un jour perdu son mot de passe et pleuré toutes les larmes de son corps ou brisé un vase pour se calmer les nerfs en se traitant de noms que la décence m’interdit de répéter ici.

Or cet administrateur est un point de faiblesse dans la sécurité. Celui qui se rend maître de l’administrateur prend le pouvoir sur votre blog aussi sûrement qu’un général en chef en Amérique du Sud.

Si vous tombez sur un hacker acharné et particulièrement vicieux, de toute façon votre sort est réglé. Mais ils sont trop occupés à des activités plus lucratives que de casser les pieds de petites gens comme nous. En gros, si vous avez un Van Gogh chez vous, Georges Clooney vous le volera quoiqu’il arrive dans Ocean 37.

Solution

Mais, avec un peu de prudence, vous pouvez éviter qu’un malfaisant de passage ne fasse trop de dégâts.

Pour ça, brouillez les pistes, trouvez un nom pour votre administrateur qui n’a rien à voir avec admin, votre nom ou votre site. Et supprimez l’admin par défaut avec le nouvel administrateur créé.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pour en savoir plus, quelques livres sur WordPress 

WordPress – Vous n’avez pas les droits suffisants pour accéder à cette page

Problématique

Pour sécuriser WordPress, il vaut mieux ne pas conserver le prefixe de tables par défaut « wp_ ». Tous les hackers, pirates et malfaisants de la planète informatique vont taper là-dedans en priorité. Il est donc prudent d’en prendre une autre.

Par exemple, vous lancez un site de vente de bandes molletières parce que vous pensez que les Allemands vont encore nous prendre par surprise à Sedan, qu’il faudra équiper notre vaillante armée et que, comme la dernière guerre que nous ayons gagné c’est 14-18, prenez comme préfixe bm_ (bm comme « bande molletière », faut suivre un peu).

Si vous aviez voulu créer le site de la Fédération Européenne des collectionneurs de sous-bocks, le préfixe « sb_ » vous serait venu à l’idée immédiatement.

Vous me direz, et vous aurez raison, qu’avec un robot pas trop primitif, le pirate sus-mentionné aura tôt fait de faire une petite boucle pour dénicher tous vos préfixes.

Sachez que rien ne vous empêche de prendre une préfixe de plus de trois caractères, vous pouvez tout à fait opter pour « essaiededenicherleprefixegrosmalin_ », si le pirate est russe ou chinois, peu de chances qu’il ne trouve. Vous pouvez prendre aussi « knokkelezout_ », s’il n’est pas belge (flamand), il n’imaginera même pas qu’un mot pareil puisse exister. Or il y a beaucoup moins de pirates belges néeerlandophones que russes ou chinois, ce n’est pas une question de niveau. Pourtant c’est à Knokke que j’ai mangé la meilleure moules-frites de ma vie.

Le problème est que vous avez peut-être déjà créé votre base avec le préfixe standard wp_. Il n’y a pas de honte à ça : j’ai fait l’erreur. Comment procéder ?

Marche à suivre

Nous allons procéder lentement mais sûrement car au moindre écart, votre blog se mettra en grève et qu’il ne faut SURTOUT pas perdre les données. Supposons que votre nouveau préfixe soit new_

  1.  utiliser phpAdmin pour copier les 11 tables wp_ de la manière suivante pour chaque table :
    • sélectionner la table
    • cliquer sur Opérations
    • aller dans le 2e pavé de droite Copier la table vers (base.table)
    • remplacer dans le nom de table affiché le préfixe ancien wp_ par new_
    • cliquer l’option Structure et données
    • puis sur le bouton Exécuter
    • et cela pour les 11 tables …
    • vous détruirez les anciennes plus tard
  2. éditez le fichier wp_config.php situé dans le répertoire racine de votre installation WordPress (racine du site si vous avez installé WordPress en racine, dans le répertoire choisi sinon)
    • assurez-vous qu’il soit bien éditable sinon changer les propriétés de votre fichier
    • dans la ligne $table_prefix  = ‘wp_’; remplacez wp_ par new_

Voilà c’est fait. Facile non ? Erreur …

Ce n’est pas fait et ce n’est pas facile car vous lancez votre blog, vous voulez vous connecter en administrateur légitime que vous êtes. Et que vous répond WordPress ?

Vous n’avez pas les droits suffisants pour accéder à cette page

Vous vous dites

Mais si je les ai !

Et vous les avez mais WordPress malgré ses qualités présente encore quelques défaillances dont celle-ci.

Solution

Il faut maintenant aller corriger à la main certaines informations apparemment résiduelles mais, de fait, bloquantes du user administrateur

La marche à suivre :

  1. allez d’abord dans la table new_user et identifiez l’ID de l’administrateur
  2. sélectionnez la table new_usermeta
  3. cliquez l’onglet Recherche
  4. saisissez dans la case user_id, l’ID retrouvé ci-dessus
  5. saisissez dans la case meta_key, LIKE et wp_% (j’ai bien dit wp_, l’ancien préfixe)
  6. vous trouverez entre autres les meta_key : wp_capabilities, wp_user-settings, wp_user-settings-time
  7. remplacez –les par  : new_capabilities, new_user-settings, new_user-settings-time
  8. sélectionnez la table  new_options et remplacez dans la colonne option_name la valeur wp_user_roles par new_user_roles (remarque très pertinente de Smax le 14 mars 2014)

Il semble cependant que la phase 8 soit la plus délicate,. En effet, selon l’historique de votre site WordPress (version initiale, historique des mises à jour, etc …), les entrées anciennes en wp_ varient avec une perversité qui ne surprendra aucun programmeur lucide et expérimenté. Je me permets donc de citer un extrait du commentaire très pertinent de Fand du 22 mars 2014, auquel j’ajouterai mes précisions :

Bien penser à renommer toute les entrées wp_% (et donc utiliser l’outil de recherche : voir point suivant)
Ne pas faire uniquement confiance à l’outil de recherche qui n’a pas trouvé wp_user_roles, même maintenant où je peux le voir, la recherche ne le trouve pas (ne pas oublier pas la syntaxe de recherche « %wp_% » – tout ce qui contient « wp_ » –  théoriquement ça fonctionne bien)
Et surtout, afficher plus que les 25 lignes par défauts dans phpmyadmin ! (exact, c’est très énervant cet aspect de phpadmin, on se fait toujours piéger)

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ? (vous pouvez rajouter Smax et Fand cette fois-ci)

Pour en savoir plus, quelques livres sur WordPress

Pourquoi ce « blog-note » informatique ?

Vous trouvez facilement dans les docs en ligne ou sur Google vous ? Moi pas ?

Comme tous ceux qui programment, j’ai parfois des difficultés.

Alors je cherche dans les manuels online.

  • PHP ? Splendide : on cherche, on trouve et ça marche
  • MySQL ? Pas mal : on cherche, on trouve et ça marche si on comprend ce qu’ils racontent
  • MSDN ? Dur : on cherche, on ne trouve pas toujours et quand on trouve, rien ne dit que ça marche.
  • Les forums ? Quand on a passé la couche des fautes d’orthographes, on trouve des réponses manifestement pas essayées que le geek moyen a entendu après sa 5e bière voire son 3e pétard donc auxquelles il a pas pigé un broc. Enervant.

Alors voilà pourquoi ce « blog-note » informatique

Donc ce blog, un forum de plus ?

Non, ce que j’ai essayé ça marche … Ou alors j’aurais mal expliqué et dans ce cas prévenez-moi.

Alors comme je suis d’un naturel jovial et généreux, je vous fais partager mes solutions. A charge de revanche … Et puis comme je suis prudent, c’est un moyen de ne pas oublier 6 mois après comment j’avais réussi à me dépanner.

Petit détail, je programme en VB.NET (même si je connais le C, ce roi des langages, mais VB.NET a une meilleure interopérabilité avec Microsoft Office), en PHP, je me mets à Java (donc n’attendez pas trop de tuyaux là-dessus pour le moment). Je fais du HTML et du WordPress pour mes sites. Et à une époque d’égarement, j’ai utilisé SQL Server en local mais j’ai cru que mon PC était retourné dans les années 80. Et je suis passé à MySQL (en attendant PostgreSQL dont un ami me vante les charmes torrides à chaque rencontre).

En outre, j’ai une assez longue expérience. J’ai connu MSDOS 1.25 les p’tits gars ! Il n’y avait pas de répertoires, juste 16 disques virtuels de A à P, ce qui ne nous rajeunit pas.

Enfin malgré les apparences, je n’ai jamais été salarié comme informaticien mais je me suis toujours fabriqué des outils informatiques pour mon utilisation personnelle ou professionnelle. Donc, attendez-vous à du pratico-pratique.