mardi 12 décembre 2023

Modifier le formulaire de forums dans SPIP 4.2

Une page permettant de poster un commentaire affiche le formulaire grâce à la balise #FORMULAIRE_FORUM.

Où se trouve le fichier html associé à ce formulaire qui permet de contrôler le contenu des forums et du formulaire pour poser une question sur une page web d'un site SPIP?

C'est le fichier forum.html du dossier /plugin-dist/forum/formulaires/ qui contrôle les formulaires. Parfois il est associé à d'autres fichiers comme inc-login_forum.html, appelés depuis le fichier forum.html. Il peut donc aussi être nécessaire de modifier ces autres fichiers.

Pour modifier le fichier forum.html il faut le surcharger (ce qui permet de ne pas modifier le fichier d'origine). Il faut donc le copier dans le dossier /squelettes/formulaires/ , les fichiers de /squelettes ont priorité sur les fichiers d'origine et donc SPIP va en priorité suivre ce qui est écrit dans ces fichiers.

Une fois copié, le fichier forum.html peut être modifié pour altérer la structure ou le contenu des forums et des formulaires de forums. Les styles peuvent aussi être changés, toutes les balises html utilisées dans le css y sont présentes et des Div ou Span nécessaires pour enjoliver le formulaire peuvent y être ajoutées.

Une fois le chemin css trouvé, il suffit de modifier ou d’ajouter le style dans la feuille style appropriée (ex. : spip.css, form.css, style.css,...).

mercredi 6 décembre 2023

SPIP: renvoyer deux références dans le texte vers la même référence ou note de bas de page.

En SPIP (y compris Spip 3 et Spip4), comment puis-je forcer deux références de notes de bas de page dans le texte à pointer vers la même note de bas de page à la fin de la page ?

Par exemple, comment puis-je faire en sorte que le code texte suivant dans le texte : "Some text[[Référence 1]] and some more text[[Référence 1]]." affiche ceci :

"Some text[1] and some more text[1]."

au lieu de cela :

"Some text[1] and some more text[2]."

?

Dans SPIP, deux références de notes de bas de page dans le texte peuvent être liées à la même note de bas de page à la fin de la page en déterminant automatiquement le numéro attribué à la première note de bas de page et en plaçant ce numéro entre <> pour toute référence de note de bas de page supplémentaire dans le texte.

Par exemple : "Some text[[Référence 1]] and some more text[[<1>]]." vous donnera ceci :

"Some text[1] and some more text[1]."

lundi 19 décembre 2016

R Supprimer la dernière ligne/occurrence pour chaque facteur

Voici un script pour le logiciel R qui permet de supprimer la ou les dernières lignes ou occurrences d'un tableau (dataframe) en fonction d'un facteur (level). Vous pouvez facilement l'adapter pour supprimer la i-ème ou n-ième occurence d'un tableau.

Cet exemple est reproductible, copier le code est lancez-le dans votre console R, puis adaptez le en remplaçant le nom de vos colonnes et tableaux (code en gras)

facteur<-c("a","a","a","b","b")
datacolumn<-c(4,5,3,6,2)
data=as.data.frame(cbind(facteur,datacolumn))
head(data)
  facteur datacolumn
1       a          4
2       a          5
3       a          3
4       b          6
5       b          2

lev<-levels(data$facteur)
lev<-droplevels(as.factor(lev))

atot=NULL
a=NULL
for (i in lev){
  a<-data[data$facteur==i,]
  a<-head(a,-1)
  atot=rbind(atot,a)}
head(atot)
  facteur datacolumn
1       a          4
2       a          5
4       b          6

mercredi 2 septembre 2015

R: le vecteur contient-il l'élément/la séquence de caractères? (plusieurs solutions)

## Le vecteur contient-il l'élément v?

##### exemple 1
v <- c('a','b','c','e') #vecteur V contenant la liste a,b,c,e 'b' %in% v ## "y-a-t-il 'b' dans le vecteur 'v' -> TRUE
match('b',v)
## renvoie la première occurence de 'b', soit l'élément [2]


##### exemple 2
#is.element() est utilisé pour rendre le code plus lisible mais est identique à %in%
v <- c('a','b','c','e')
is.element('b', v)
'b' %in% v
## renvoient TRUE si il y a un 'b' dans v
is.element('f', v)
'f' %in% v
## renvoient FALSE (pas de f dans v)
subv <- c('a', 'f')
subv %in% v
is.element(subv, v)
## renvoie un vecteur TRUE/FALSE


##### exemple 3
w <- c(1,2,3)
any(w==1)
#renvoie TRUE sir un des éléments de w vaut 1
v <- c('a','b','c')
any(v=='b')
any(v=='f')
#idem avec des lettres


##### exemple 4
chars <- "test"
value <- "es"
grepl(value, chars) #cherche la suite 'es' dans le vecteur 'chars' qui contient le mot 'test', renvoie TRUE

chars <- "test"
value <- "et"
grepl(value, chars) #idem, renvoie FALSE

Eliminer des doublons d'un jeu de données sour R

#élimination des doublons dans un vecteur sous R
doublons <- which(duplicated(data$V2)) #quelles sont les séquences en double dans la colonne V2 de mon jeu de données?
data2<-data[-doublons,] #on enregistre un nouveau tableau "data2 ne contenant pas les lignes des doublons


#Pour comprendre la suppression des doublons avec un exemple simple
test<-c("a","a","ab","bb","b")
doublonstest<-which(duplicated(test))
test2<-test[-doublonstest]
test
test2

Test apparié par permutation pour R

Voici un petit script pour effectuer des tests de permutations pour données appariées sous R (il n'y a pas de plugins à ma connaissance permettant de réaliser ce type de test).


Commencer par jeter un oeil à l'article sur les tests de permutation non appariés en premier !


test=rnorm(10,5,5)
cont=rnorm(10,4,3)

d=test-cont

qqnorm(d) #voir les données
shapiro.test(d) #voir les données

B = 99999 #nombre de permutations

m0 = mean(d) #moyenne

rndmdist = replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d)) #randomisation

sum(abs(rndmdist) > abs(m0))/length(rndmdist) #p-value

ImageJ: détection d'objets et mesure de leur surface par lot d'image

Voici un script sous imageJ permettant de détecter des objets blancs sur fond noir (plusieurs objets dans chaque photo) et de mesurer leur aire, le script est utilisable en lot et enregistre le nom du fichier image en face de la valeur de l'objet.
Pour le lancer sur un lot d'image, utiliser "Process"->"Batch"->"Macro", copiez cette macro, indiquez le dossier contenant vos images (input) et celui dans lequel vous voulez que le script sauvegarde les images des détections de bord (pour pouvoir contrôler que la détection s'est bien déroulée). Si votre input correspond à votre output, vos images d'origines seront écrasées, il faut donc les sauvegarder en effectuant une copie dans un autre dossier.
Si les images contrôles ne vous conviennent pas, modifiez les paramètres du script (vous pouvez vous aider du recorder de macro présent dans imageJ)
Lancez ensuite le script, allez dans le tableau des résultats et sauvegardez le tableau.

run("8-bit"); //convertit l'image en 8-bit pour les analyses
setMinAndMax(138, 164);
run("Apply LUT");

//suppression des très petits outliers, modifier la valeur en fonction de votre appareil photo
run("Remove Outliers...", "radius=30 threshold=50 which=Bright");
run("Remove Outliers...", "radius=20 threshold=50 which=Dark");

//détection des objets
setAutoThreshold("Intermodes dark");
setAutoThreshold("Default dark");
setAutoThreshold("Default dark stack");
setAutoThreshold("Default dark");
setOption("BlackBackground", false);
run("Convert to Mask");

//rentrez ici un intervalle de dimensions correspondant approximativement aux tailles de vos objets, ou mettez cette ligne en commentaire pour ne pas éliminer d'outliers
run("Analyze Particles...", "size=500-120000 show=Outlines display");

//enregistrement du nom du fichier comme label de la donnée
dir = getDirectory("image");
name = getTitle;
index = lastIndexOf(name, ".");
if (index!=-1) name = substring(name, 0, index);
name = name + ".xls";
saveAs("Measurements", dir+name);