Category Archives: computers

Scripter comme un dinosaure

[original : http://guykastenbaum.blogspot.ch/2012/01/scripter-comme-un-dinosaure.html 27 janvier 2012]
comme j’aime bien cet article, je l’ai retrouvé sur blogger et réinjecté dans mon blog actuel.
Comment scripter (sh ou ksh) sur des environnements compatibles linux AIX Solaris ?
Je sais qu’il suffirait de changer de versions de sh ksh bash etc mais
Quelques recettes de cuisine :pour le if
if [ “x${var}” = “xyes” ]; then echo “yes”; fiRESPECTER les espaces, non il ne faut rien coller, ni [“, ni “=”, ah c’est dur…

ajouter le “x” pour éviter les if “-u” …=>; erreur sur l’opération -u

ajouter les guillemets car dans if [ $var =  $var pourrait être vide
(ça fait doublon avec “x” mais on est jamais assez prudent)

de temps en temps ajouter les accolades pour $var , soit ${var}, par pure paranoia

ajout récent : dans les tests d’égalité, il faut utiliser ‘=’ et non ‘ = = ‘(==), c’est pas compatible avec le vieux ‘sh’;

utiliser -eq plutôt que == , quoique on peut quand même oser. (en général, j’ose, c’est plus lisible)

je n’utilise pas le raccourci $a == “y” || $b=”n” , j’ai trop peur que ça soit trop moderne.

avec prudence les OR et AND sous forme de -o et -a ;

les jours de grande parano, utiliser des doubles crochets comme dans la doc
if [[ “x$a” != “xy” -a “x$a” != “xn” ]];then echo “maybe”; fi

pour faire un $x=~/toto/ [perl] ben d’à peu près lisible j’ai

if [ ” `echo $x|sed -e 's/toto//'`" != "$x" ];then ...

pour le sed 
en général il est sympa, sauf chez solaris

sur solaris sed -e ‘s/\t/ /g’ remplace les ‘t’ par des blancs.(oui,oui)
il faut remplacer sed -e “s/\t/ /g” par tr ‘\t’ ‘ ‘
c’est ce qui m’a décidé à écrire ce billet
d’ailleurs, tr marche assez bien : tr [:upper:] [:lower:] est bien compris
cadeau pour générer un mot de passe de 6 caractères :

$(head -n 100 /dev/urandom| tr -dc “[A-Z][a-z][0-9]”|cut -c1-6)

de même, si tu as des fichiers qui ne se termine pas par “\n” , le sed te zappe la dernière ligne. (oui,oui)
faire une boucle de réparation avant :

for instfile in $(find . -type f);do
if [ “$(tail -1 $instfile|od -t x1|tail -2|head -n 1|grep -c ‘ 0a’)” == “0” ];then
echo “” >> $instfile
fi
done

ah oui, oubliez le pratique -i, il faut revenir à sed -e ‘….’ a>b;mv b a
ou mieux car il conserve les attributs cp -p a b;sed -e ‘..’ b>a;rm -f b

[ajout de mai 2012]
Encore Solaris qui nous rappelle que sed -e “s/a/b/ s/c/d/” est un raccourci trop récent pour être supporté. Pour être 19k-compatible il faut écrire : sed -e “s/a/b/” -e “s/c/d/”

[ajout avril 2013]
Ah AIX se fait remarquer, on ne peut pas faire sed fichier -e ‘…’
car ça n’est pas dans le bon ordre. Soit sed -e ‘…’ fichier soit (c’est plus sûr)
cat fichier|sed -e ‘…’
ed
quelquefois on s’en sort en allant chez cet épicier discount, exemple
ed -s src/xmlrpc_introspection.h << EOD
/XMLRPC_ServerSetValidationLevel
i
XMLRPC_VALUE find_named_value(XMLRPC_VALUE list, const char* needle);
void describe_method(XMLRPC_SERVER server, XMLRPC_VALUE vector, const char* method);
.
w
q
EOD
 
 
shell (sh echo $* .)

ne pas utiliser le trop moderne ‘-n’ option d’echo, car
echo “echo -n toto” > /tmp/a ; sh /tmp/a ; ksh /tmp/a ; rm a
affiche bien “-n toto”

éviter les echo avec des passages à la ligne , même avec \

sh ne connait pas $(commande), il ne connait que `commande` , c’est pas pratique.

sh n’accepte pas export PIF=”paf” , il exige PIF=”paf” ; export PIF
de toutes façon j’utilise ksh (c’est les ordres de là haut)

$0 $1 $* $@
variables fragiles, elles peuvent s’effacer le long du script (suffit qu’elles soient utilisées en sous entendu dans un sous appel), donc les sauver dès le début du script

$0 des fois contient “-bash” au lieu de “bash” je sais pas d’où ça sort.

“source file” : utiliser “. ./file” ; c’est moins lisible mais plus archaique

cadeau, un complément de getopts

while getopts “n:t:m:a:u:s:h” opt; do
if [ “$OPTARG” = “” ]; then OPTARG=1; fi
if [ “$opt” != ‘?’ ] && [ “$opt” != ‘:’ ]; then
export OPTARG_${opt}=$OPTARG
fi
done

les fonctions s’écrivent

compilesys()
{
pas de ‘function’
des parenthèses vides (on chopera $1 $2 …)
accolade à la ligne
et ça s’appelle sans les parenthèses, compilesys unzip

pour id, uname
pour les fonctions borderline, qu’on croit qu’elles sont standards, eh ben moitié moitié.
faut vérifier les options de base. sur solaris j’utilise

if [ -f “/usr/xpg4/bin/id” ];then export GSCRIPT_BIN_ID=/usr/xpg4/bin/id;
else export GSCRIPT_BIN_ID=id; fi

sinon je ne m’en sors pas (besoin du id -gn -u -g ..)

uname -s est plus fiable que hostname (JYP)

grep

ne connait pas toujours -E (solaris) , par contre son équivalent egrep existe …

tar
oubliez le -z pour de copain gzip, retrouvez tar cf -|gzip -c|gzip -dc|tar xf –
pour les gros tar, ou avec des longs paths, utiliser gtar ou une version fraiche :

pour tar gzip zip bzip make … : RECOMPILEZ ! cadeau :

compilesys()
{
confplus=$2
gzip -dc ../zip/$i-*.gz 2> /dev/null | tar xf – #ou variante…
cd $i-*/ ;   ./configure –cache-file=config.cache –prefix=SOMEWHERE $confplus
make ;  make install ;  cd ..
}
compilesys tar “FORCE_UNSAFE_CONFIGURE=1”
for soft in xz bison flex m4 autoconf automake libtool make bash binutils;do compilesys $soft;done

J’en ai sûrement oublié, dites moi

Pocket

pandoc markdown powerpoint

Quelle plaie la doc, hein ….

Le seul moyen de la faire passer c’est de la faire en MarkDown ;

avec les astuces de :

un espace en fin de ligne pour forcer le passage à la ligne,

utiliser les “` avec suffisamment de lignes vides autour pour bien comprendre que c’est du code ; (indenter tout un bloc par une tabulation, des fois, ça ne marche pas sur certains paragraphes)

bien ranger les h1 h2 h3 h4 (# ## ### ####), pour générer un powerpoint

pandoc -f markdown -t docx -o doc.docx doc.md
pandoc -f markdown -t latex -o doc.pdf doc.md

pour les “powerpoints”  on peut le faire avec s5, dzslides, slidy, ou slideous ( ref  )

j’ai choisi slidy, et ajouté des CSS

 

pandoc -s -f markdown -t slidy --slide-level 4 -H doc.hdr -o doc.htm doc.md
 
avec doc.hdr = 
<style>
h4 {padding:5px 10px;background-color:#edf;}
h1,h2,h3,h4{text-align: center;}
h1,h2,h3{margin-top: 20%;font-size: 200%;}
div.toolbar::before{content:url(footer_bar.png);}
</style>
<div style="border-bottom:1px solid grey;text-align:right;">Titre de ma présentation</div>
 
#rien à voir mais si on veut inclure une image en mode data: , c'est très simple
mimetype=$(file -bN --mime-type "$1")
content=$(base64 -w0 < "$1")
echo "url('data:$mimetype;base64,$content')"

 

Pocket

AIX jruby

Logstash ça fait juste un tail | sed | perl | wget -post, vu de loin.

C’est écrit en ruby. sympa. ça s’exécute par jruby (cross compil de ruby en java). Chouette. Comme ça ça marche sur Solaris et AIX. presque.

Personne de moderne n’utilise AIX. pas de libcrypto SHA1 (je peux me tromper). Et concernant logstash, des erreurs surprenantes : tout n’a pas été écrit (!!). Mais ok je les comprends..

NotImplementedError: block device detection unsupported or native support failed to load
blockdev? at org/jruby/RubyFileTest.java:67
device? at …logstash/vendor/bundle/jruby/1.9/gems/filewatch-0.8.1/lib/filewatch/helper.rb:67

NotImplementedError: stat.st_gid unsupported or native support failed to load
gid at org/jruby/RubyFileStat.java:247
atomic_write at …logstash/vendor/bundle/jruby/1.9/gems/filewatch-0.8.1/lib/filewatch/helper.rb

idem

…logstash/vendor/bundle/jruby/1.9/gems/filewatch-0.8.1/lib/filewatch/watch.rb

Après avoir exploré les solutions propres : versions de java, versions de jruby (tiens ? ils passent de la version 1.7 à la version 9.1 ?!) je comprends que personne ne s’investi dans le portage de ruby pour AIX (pourtant chef.io marche ..) . ou alors c’est lié à ma version (aix6.1); les gestions de fichiers et devices sont en option.

Reste à faire les corrections dans les gems utilisées par logstash :

 

#gems/filewatch-0.8.1/lib/filewatch/helper.rb:67
def self.device?(file_name)
# AIX chardev?(file_name) || blockdev?(file_name)
chardev?(file_name)
end
end
 
#gems/filewatch-0.8.1/lib/filewatch/watch.rb
def self.win_inode(path, stat)
fileId = Winhelper.GetWindowsUniqueFileIdentifier(path)
[fileId, 0, 0] # dev_* doesn't make sense on Windows
end
def self.nix_inode(path, stat)
[stat.ino.to_s, 0, 0]
#AIX [stat.ino.to_s, stat.dev_major, stat.dev_minor] # dev doesnt work on AIX
end
 
#gems/filewatch-0.8.1/lib/filewatch/helper.rb , line 45
# Set correct uid/gid on new file
#AIX GK GDF GSIT TOO BAD ... chown(old_stat.uid, old_stat.gid, file_name) if old_stat
return_val

 

 

Yes, Sam, “quick-and-dirty guizmo” striked again

Pocket

java jmx port and the rmi port

java, c’est désespérant. le port jmx est sympa mais il redirige vers un port rmi random, quand on n’est pas au courant ça énerve. Quand on est au courant on se demande pourquoi, et aussi on échafaude des tunnels ssh avec proxy -D. Finalement la solution simple est d’ajouter un fix du port rmi, sur le même port que jmx

-Dcom.sun.management.jmxremote.port=$PORTJMX \
-Dcom.sun.management.jmxremote.rmi.port=$PORTJMX \

(le même port ???!!!)

en comparaison, j’ai passé quelques semaines avec elasticsearch, nodejs, bower, yo, angularjs, etc, et je ne trouve pas de post à faire, autre que ‘whaou’.

 

Pocket

ELK : Elastic by design

Le titre ne veut rien dire. Juste ça jette.
Comme beaucoup, j’ai mis en place eliastic+logstash+kibana, comme indiqué dans la démo. On a choisi des logs, et assez vite visualisé les graphes dans kibana. C’est joli.

Ensuite on explore les contours de l’outil :
– logstash est un peu capricieux,
bien sûr ils veulent tous le dernier java(8) et leurs dernières versions E2L2k2, mais ils tournent sur jruby c’est bien plus la classe, du coup pas de souci sur Solaris. La syntaxe de conf de logstash est naze, pourquoi ils n’utilisent pas ruby(ou alors c’est du ruby??), json, ou yml, c’est batard. Et dans logstash l’astuce qui n’est pas dans la doc est qu’il faut un seul logstash qui tourne, qui charge les fichiers de log et qui les tague dans input{type=>’toto’ } , ensuite dans filter{} on ajoute un if [type]==’toto'{}.

elastic fait son job, il découpe tout en petit morceaux de mots, pour la recherche fulltext (moteur lucene). et il discute en REST et JSON.

Kibana fait un peu son minimum, et ça m’étonne qu’il n’y ait pas de remplaçant, avec de meilleures visualisations.
Apparemment c’est simple de faire une requete elastic, récupérer les data, et reformatter pour une visu D3JS. ça me tente d’essayer.

Petite déception quand on a deux logs genre apache+weblogic avec un java_session_id qui devrait regrouper plusieurs logs de chaque fichier. Eh ben c’est pas bien fait pour. il y a bien un lien parent-child qui existe mais pas possible pour le moment de l’utiliser dans kibana. On peut ruser quand on a des équivalences 1-1 ou 1-0 : forcer l’id et utiliser des actions update+upsert pour fabriquer un document avec les items des deux logs. bref.

Il faut voir ça comme un petit outil – big data little tool.

Pocket

wordpress to templates

Je commence à bien aimer wordpress,

même s’il range toutes les données dans post & post-meta,

même s’il galère sur l’import export,

et sur la gestion des langues.

Par contre ce qui me chiffonne c’est l’affichage du html.

J’avais pris les bonnes habitudes du templating (prestashop/smarty et mon template perso) et je constate que par défaut le code développeur et le code html sont toujours mélangés.

ça n’est pas qu’une question d’habitude, c’est une séparation du travail : l’un récupère du contenu (get_post ou select ou wget ou node etc) et le met en forme en vue de l’afficher, et l’autre (l’artiste) place les élément harmonieusement sur une page web.

Pour contourner toutes les fonctions de base de wordpress qui affichent un résultat au lieu de le rendre (the_title() = echo get_the_title() ) ce bout de code moche :

 

function m3d_the_get($fnc,$argf=array()){
ob_start();
//anything smarter ?
switch(count($argf)){
case 0: $fnc();break;
case 1: $fnc($argf[0]);break;
case 2: $fnc($argf[0],$argf[1]);break;
case 3: $fnc($argf[0],$argf[1],$argf[2]);break;
case 4: $fnc($argf[0],$argf[1],$argf[2],$argf[3]);break;
case 5: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4]);break;
case 6: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4],$argf[5]);break;
case 7: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4],$argf[5],$argf[6]);break;
default: echo "ERR $fnc(args)";break;
}
return(ob_get_clean());
}
 
 
/*
example : 
$tt["header"]=m3d_the_get('get_header');
$tt["breadcrumb"]=m3d_the_get('get_template_part',array('includes/breadcrumb'));
while ( have_posts() ) { the_post();
 $tt["post"][]=m3d_something_to_tt($post->id);
}
print filtpl_compile("somepage.htm",$tt);
*/

je n’en suis qu’au début (bientôt les templates parts) et faudra ranger pour éviter les récursions, mais je sens que ça va me plaire..

inspiré de https://kovshenin.com/

 

Pocket

Solaris réactionnaire: sftp localhost -oPort=1988

Solaris est un vieux con.

On le savait, il met en avant son vieux grep qui ne fait pas de -r ni ne -E. Oh il veut bien des nouveauté, pour amuser les jeunes quand ils passent le week end. Cherchez où je l’ai rangé votre truc, chez xavier-pierre-gilles IV /xpg4/, ou sir frank william /sfw/ .

C’est bien les commandes unix, quand tu les tape sans argument ça de donne la doc :

 

bash-3.2$ sftp
Usage: sftp [-vC1] [-b batchfile] [-o option] [-s subsystem|path]
[-F config] [-P direct server path] [-S program] [-B buffer_size]
[-R num_requests] [user@]host[:file [file]]
 
bash-3.2$ sftp localhost -oPort=1988
Connecting to localhost...
Password:

Hey mais je n’ai rien qui tourne sur ce port ?

Eh oui, c’est auto-documenté, il faut mettre le port AVANT.
Non ça n’est pas une erreur, pas besoin de message.

note: sur la prochaine version de Solaris , la touche backspace va effacer le caractère avant le curseur. (no it’s a joke)

 

Pocket

microsoft phone virus : +78649873

C’est un archaïque et surprenant hacking social qui appelle le téléphone et se présente comme Microsoft (ben voyons..) pour m’avertir qu’il y a un virus sur mon PC personnel… (+78649873 est le numéro qui s’affiche)

La personne est une femme avec un accent trop américain. Comme je suis Européen elle fait l’effort d’être plus intelligible. Une fois devant le PC, je dois faire Windows-R eventvr , mais ça c’est déjà la version courte. “do you see the key with the label ‘ctrl’ ? what is the key on the right ? press it, keep it pressed, and hit the key ‘L’ like ‘Lobot’ ” c’est là que j’ai décelé un accent chinois… “‘R’ like ‘Robot'” . c’est assez ironique de choisir le mot ‘Robot’ …

Dans l’event viewer il te fait croire que les messages rouge de windows/application viennent de l’internet et signalent des virus.

Malheureusement je n’ai pas eu la patience de continuer pour voir quand on allait me demander ma CB ou un mot de passe ou d’installer un troyen (please install vnc, send spams, execute format c: ) la suite de l’histoire est sur le net : ils installent un troyen en passant par une page à visiter ou même teamviewer (!) .

https://www.google.fr/search?hl=fr&q=t%C3%A9l%C3%A9phone+se+fait+passer+pour+microsoft

microsoft fc-2010 rtl rtl.be dhnet luxembourg
(note : “chipoter” en belge se traduit par “bricoler” en français)

ça existe depuis 2010, ça revient à la mode en ce moment (aout 2015) : soyez vigilant et prévenez les personnes âgées ou “vulnérables” de votre entourage.

 

Pocket

nouveautés de la rentrée

Après 15 j de vacances, je reviens avec un oeil nouveau sur le monde virtuel, et encore des nouveautés dans les erreurs :

 

– /dev/null est devenu un fichier

-rw-rw-rw-. 1 root root  Jun 17 11:26 /dev/null

du coup sshd ne démarre plus = argh

sshd -d ou -e

sshd daemon() failed: No such device

merci google (tu te souviens avant google ? on connaissait tous les endroit où il y avait des docs : man, share/docs, sunsolve, et il existait aussi des CDs de knowledge base pour les boites de support)

http://www.linuxquestions.org/questions/linux-networking-3/sshd-fatal-daemon-failed-no-such-device-279664/

rm /dev/null && mknod /dev/null c 1 3

crw-rw-rw-. 1 root root 1, 3 Jun 17 11:26 /dev/null

autre minitruc

sur AIX

find /somewhere/libs -follow -name dddd
find: bad status– libxmlrpc.so

en fait c’est juste du à un lien mort

ls -l : … libxmlrpc.so -> libxmlrpc-epi.so.0.0.3

et libxmlrpc-epi.so.0.0.3 qui n’existe pas

—-

pas intéressant mais voilà  notre quotidien : toujours nouveau

Pocket

powershell , microsoft custom properties for sharepoint

Nouveau challenge, ranger pleins de documents automatiquement dans sharepoint. Revu à la baisse, sur les documents doc et xls il suffira de positionner des “custom properties”. l’onglet en plus qu’on a sur clic-droit-propriété.

La semaine dernière j’étais donc favorablement surpris par powershell. Par sa syntaxe souple et familière, cool sur les majuscules, les antislashes, la complétion, le mode debug, les paramètres, les déclarations, et un peu la doc.

 

#
#`http://blogs.technet.com/b/heyscriptingguy/archive/2010/04/06/hey-scripting-guy-how-can-i-add-custom-properties-to-a-microsoft-word-document.aspx
# get-executionpolicy /# set-executionpolicy remotesigned
# set-psdebug -off /# set-psdebug -trace 2
#
# Product name Ant
# ContentType Document
# Product type Web
# Doc Type TCD (Tech Config Doc)
#
Param (
[string]$file = "",
[string]$Producttype = "",
[string]$ContentType = "Document",
[string]$DocType = "",
[string]$Productname = ""
)
if ($file -eq "") { Write-Host "usage -file \\xxx\PTI-apache-9.9.99.doc [(optional params deducted from filename:) -Producttype Web -ContentType DOC -DocType PTI -Productname apache ]" ; Exit;}
if ( -Not (Test-Path $file)) { Write-Host "ERR -file $file : this file does not exists" ; Exit;}
if ( Test-Path $file -pathtype container ) { Write-Host "ERR -file $file : this is a folder" ; Exit;}
Write-Host "$file"
$filesl = $file.replace('\','/')
$pathsl = $filesl -replace '/[^/]*$',''
$fname = $filesl.replace("$pathsl/",'')
$pathsl = $pathsl.replace('/','\')
$fext = $fname -replace '^.*\.([^\.]*)$','$1'
$ftype = $fname.substring(0,3)
if ($ftype.tolower() -eq 'ebr') { $ftype = $fname.substring(0,6) }
if ($ftype.tolower() -eq 'spe') { $ftype = $fname.substring(0,4) }
$ftxd=$ftype
if ($ftype.tolower() -eq 'pti') { $ftxd='TID' }
if ($ftype.tolower() -eq 'pte') { $ftxd='TOD' }
if ($ftype.tolower() -eq 'spec') { $ftxd='TDD' }
$fappver=$fname.replace($ftype,'').replace(".$fext","") -replace '^[-\.]',''
$fapp=$fappver -replace '[-\.].*$',''
$fver=$fappver -replace "^$fapp[-\.]",''
#$papp = $pathsl -replace '^.*('/','\')
 
if ($DocType -eq '') {$DocType = $ftxd } # unless forced in param
if ($Productname -eq '') {$Productname = $fapp } # unless forced in param
if ($Producttype -eq '') {$Producttype = "Web";
if ($Productname -eq "mysql") {$Producttype="Database"}
if ($Productname -eq "vtom") {$Producttype="Tooling"}
}# unless forced in param
 
#try to stick to official : 
$off_txd=( "TDD (Tech Design Doc)", "TID (Tech Install Doc)", "unknown");
$off_app=("Apache", "ProFTPd","unknown");
ForEach($offi in $off_txd){if ($offi -match "^$DocType") {$DocType=$offi;break;}}
ForEach($offi in $off_app){if ($offi -match "^$Productname") {$Productname=$offi;break;}}
 
if ($fext.toLower() -match 'doc')
{
$application = New-Object -ComObject word.application
$application.Visible = $false
$document = $application.Documents.open($file)
}
if ($fext.toLower() -match 'xls')
{
$application = New-Object -ComObject Excel.Application
$application.Visible = $false
$document = $application.Workbooks.open($file)
}
if ( -Not ($document)) { Write-Host "ERR -file $file : $fext extension = ignored" ; Exit;}
 
$binding = "System.Reflection.BindingFlags" -as [type]
 
$customProperties = $document.CustomDocumentProperties
$typeCustomProperties = $customProperties.GetType()
 
[array]$arrayCPk = "Product name","ContentType","Product type","Doc Type"
[array]$arrayCPv = $Productname,$ContentType,$Producttype,$DocType
for($CPi=0; $CPi -lt 4; $CPi++){
$CustomProperty = $arrayCPk[$CPi]
$Value = $arrayCPv[$CPi]
 
#set custom prop
[array]$arrayArgs = $CustomProperty,$false, 4, $Value
Try
{
$typeCustomProperties.InvokeMember(`
"add", $binding::InvokeMethod,$null,$customProperties,$arrayArgs) |
out-null
}
Catch [system.exception]
{
$propertyObject = $typeCustomProperties.InvokeMember(`
"Item", $binding::GetProperty,$null,$customProperties,$CustomProperty)
$typeCustomProperties.InvokeMember(`
"Delete", $binding::InvokeMethod,$null,$propertyObject,$null)
$typeCustomProperties.InvokeMember(`
"add", $binding::InvokeMethod,$null,$customProperties,$arrayArgs) |
Out-Null
}
}
 
#set title
$propertyName='Title'
$value=$fname
$binding = "System.Reflection.BindingFlags" -as [type]
$builtinProperties = $document.BuiltInDocumentProperties
[Array]$getArgs = $propertyName
$builtinPropertiesType = $builtinProperties.GetType()
$builtinProperty = $builtinPropertiesType.InvokeMember( "Item", $binding::GetProperty, $null, $builtinProperties, $getArgs)
$builtinPropertyType = $builtinProperty.GetType()
[Array]$setArgs = $value
$builtinPropertyType.InvokeMember( "Value", $binding::SetProperty, $null, $builtinProperty, $setArgs)
 
$document.Saved = $false
$document.save()
$application.quit()
$application = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

Comme pour les films, on est peu à peu moins enthousiaste quand le temps a passé.

Ici on voit :
– que les syntaxes et objets de mises à jour de custom properties sont lourdes, différentes entre doc et xls, différente pour le titre.
– que d’autres lignes de code (de validation par exemple) sont aussi cryptiques et sont bien sûr copiées d’exemples venant de MSDN.

Donc en gros c’est l’API microsoft qui est désespérante, tandis que le code autour est pas mal. ça date de 2007. voilà, on n’est pas fâché mais c’est pas suffisant pour l’adopter, même à la place des .BAT .

Pocket