Migration de forum SMF vers Kunena
Pré-requis
Si vous décidez de suivre cette procédure, cela n'engage que vous. A vous de vérifier la validité de cette procédure et de vous assurer des bonnes commandes.
Je vais traiter le lourd sujet de la migration d'un forum SMF 2.0RC4 vers kunena 1.6.3 . Pour cela nous allons avoir besoin de plusieurs choses.
- Un export de la base SMF
- Disposer des pièces jointes SMF
- Un kunena déjà installé
- Mysql 5.x
- Avoir des notions de SQL, linux
- Bon outil de connexion à la base (mysql workbench)
- Sauvegarde valide.
Pour cette migration, l'utilisation de mysql workbench est plus que recommandé. => http://www.mysql.fr/products/workbench/
1 - Importer l'export de la base SMF dans mysql.
Dans mon cas, et pour cette procédure, le nom de la base smf sera 'logy-smf' .
2 - S'assurer du nom de la base kunena
Dans mon cas, et pour cette procédure, le nom de la base kunena sera sandbox16. Concernant le nom des tables, le préfix sera celui donné par defaut, 'jos_' . Il sera donc nécessaire pour vous d'adapter la procédure à ces variables (à gros coup de remplacer par ;-) )
A noter, que si vous utilisez phpmyadmin, les tables temporaires qui seront utilisées lors de cette procédure n'auront de validité que le court instant de la commande qui aura été lancé avant. Utiliser un gestionnaire de base qui reste connecté à la base le temps de la procédure.
A savoir les mots de passe ne pourront pas être repris. ( Je n'ai pas trouvé de solution )
On commence
Vous noterez que si il existait déjà un forum kunena, avec des messages, ceux-ci seront effacés.
injection des categories
TRUNCATE TABLE `sandbox16`.`jos_kunena_categories`; #vide la tableINSERT INTO `sandbox16`.`jos_kunena_categories` (id,name,published,parent,description,headerdesc)
SELECT id_cat,name,1,0,"","" FROM `logy-smf`.`smf_categories`;
SET @maxid=(SELECT MAX(id_cat)FROM `logy-smf`.`smf_categories`);
INSERT INTO `sandbox16`.`jos_kunena_categories`
( id ,name,published, parent,description,headerdesc)
SELECT ( id_board + @maxid ),name,1,id_cat,name,description FROM `logy-smf`.`smf_boards` ORDER BY id_board;
Purge des utilisateurs
L'installation de kunena et joomla étant fraiche, et par sécurité , je purge des reliquats de comptes au dessus de l'id 99.#Purge des utilisateurs au dessus de 99
DELETE FROM `sandbox16`.`jos_users`
where id >=100 ;
DELETE FROM `sandbox16`.`jos_kunena_users`
where userid >=100 ;
Injection des utilisateurs smf dans joomla
Pour éviter tout problème en partant d'un id d'utilisateur de 0, je fait +100 sur l'id SMF vers joomla. Cela permet de conserver les comptes joomla.Voir le select ci-dessous pour voir ce qui est récupéré, les champs sont assez parlant.
#Injection des utilisateurs dans joomla, id + 100 pour éviter un confli avec l'existant.
INSERT INTO `sandbox16`.`jos_users` (id,name,username,registerDate,lastvisitDate,email,password)
SELECT ( id_member + 100),real_name, member_name,from_unixtime(date_registered),from_unixtime(last_login),email_address , passwd
FROM `logy-smf`.`smf_members` ORDER BY id_member;
Injection des utilisateur smf dans kunena
La reprise des champs utilisateurs et id. Voir le select ;-)# injection utilisateurs dans kunena
INSERT INTO `sandbox16`.`jos_kunena_users` (userid,gender,birthdate,websitename,websiteurl,hideEmail,showOnline,ICQ,AIM,YIM,MSN,signature,PersonalText)
SELECT ( id_member + 100),gender,birthdate,website_title,website_url,hide_email,show_online,icq,aim,yim,msn,signature,personal_text
FROM `logy-smf`.`smf_members` ORDER BY id_member;
Changer le status des utilisateurs joomla
On place le status enregistré pour joomla, pour tous les utilisateurs.#Place les users en status enregistré.
insert into `sandbox16`.`jos_user_usergroup_map` (user_id, group_id) SELECT id,2 FROM `sandbox16`.`jos_users` where id > 99;
Injecter les messages dans kunena
#############################################################################################"#Selection le parent, selon le dernier id a qui on répond
#############################################################################################
TRUNCATE TABLE `sandbox16`.`jos_kunena_messages`;
TRUNCATE TABLE `sandbox16`.`jos_kunena_messages_text`;
SET @maxid=(SELECT MAX(id_cat)FROM `logy-smf`.`smf_categories`);
INSERT INTO `sandbox16`.`jos_kunena_messages`
(id,parent,thread,catid,userid,subject,time,name,email,ip)
select a.id_msg,( select max(b.id_msg) from `logy-smf`.`smf_messages` as b where b.id_topic=a.id_topic and b.id_msg < a.id_msg),
a.id_topic,( a.id_board + @maxid ),( a.id_member + 100 ),a.subject,a.poster_time,a.poster_name,a.poster_email,a.poster_ip
from `logy-smf`.`smf_messages` as a order by a.id_topic,a.id_msg;
INSERT INTO `sandbox16`.`jos_kunena_messages_text`
(mesid,message)
SELECT id_msg,body
FROM `logy-smf`.`smf_messages` ORDER BY id_topic;
update `sandbox16`.`jos_kunena_messages` set parent=0 where parent IS NULL;
Reformater les topics
####################################################################################################### Reformat les topics, entre format smf et kunena
# le thread a pour valeur le message id du créateur.
######################################################################################################
USE `sandbox16`;
create temporary table mess_tmp as
select id, thread from `sandbox16`.`jos_kunena_messages`
where parent=0;
update `sandbox16`.`jos_kunena_messages` m1 set thread = ( select id from mess_tmp mt where mt.thread=m1.thread);
drop table mess_tmp;
Gestion des pièces jointes
Dans la close where , si id_member est différent de 0 alors c'est un avatar sinon c'est une pièce jointe.Attention, j'ai défini que mes pièces jointes seraient dans media/kunena/attachments/modoold, libre à vous de changer le chemin.
TRUNCATE TABLE `sandbox16`.`jos_kunena_attachments`;
INSERT INTO `sandbox16`.`jos_kunena_attachments`
(id,mesid,userid,hash,size,folder,filetype,filename)
SELECT id_attach,id_msg,( id_member + 100 ),file_hash,size,"media/kunena/attachments/modoold","filetype",filename
FROM `logy-smf`.`smf_attachments` where id_member=0 order by id_attach ;
Renommer les pièces jointes sur le disque
Ca se complique un peu. Les fichiers smf porte comme nom un numero de série, exemple : 86c40a6e4a2c245634a07c72ba5e981eHors, kunenra, lui , utilise le vrais nom du fichier, et pour éviter les doublons créé des répertoires. Comme je suis sur un serveur linux, je passe en ligne de commande sur mon système.
Créer un fichier sql avec votre éditeur favori et placer ca dedant.
SELECT id_attach,";",file_hash,";",filename FROM `logy-smf`.`smf_attachments`where id_member=0 order by id_attach;
Créer un fichier renome et placer ça dedant.
#!/bin/bashif [ -e "./pieces/$2" ]
then
echo "doublon: ./pieces/$2 $1"
else
cp -i ./attachments/$1 "./pieces/$2"
fi
Créer un répertoire pièces
mkdir piècesCopier pièces jointes SMF.
Copier les pièces jointes SMF dans le répertoire attachments.Recopie des fichiers au format kunena
Lancer la commande shell
mysql -r logy-smf < sql | sed 1,1d |sed 's/\t/ /g' |awk -F" ; " '{print $1"_"$2" \""$3"\""}' |xargs -L1 ./renome
Les fichiers seront copiés de ./attachments vers ./pièces, et renommés avec leurs vrais noms de fichiers. Les doublons seront affichés à l'écran par un message d'erreur, il suffira de recopier la liste pour les traiter un par un à la main, en espérant qu'il n'y en ai pas de trop.
Exemple de message d'erreurs.
Nous trouvons quelques doublons, Visuel014, suivi de l'[ID de la pièce jointe]_[nom smf].doublon: ./pieces/Visuel014.jpg 87_a8af28cbc9d950ab6a2a4a309762c3a246ffd0a0
doublon: ./pieces/Visuel014.jpg_thumb 88_44fab72bbedb4ad5a802ab4b6ae1841c0d8ec083
doublon: ./pieces/Visuel015.jpg 89_ccc37a41e1f3f246c1911467ff0f779697173415
doublon: ./pieces/Visuel015.jpg_thumb 90_d3f6265001f5be4851190cb104b1eb5a44c8cc20
Avatars
Attention, ici il faut installer image magick (convert), qui va convertir les avartars en png.Créer un fichier sql
SELECT (id_member+100),";",id_attach,";",file_hash,";",filename FROM `logy-smf`.`smf_attachments`where id_member<>0 order by id_member;
Créé un fichier renome
#!/bin/bashname="./avatars/$1_avatar.png"
cp -i ./attachments/$2 "./avatars/$3"
convert "./avatars/$3" $name
rm "./avatars/$3"
Créer un répertoire avatars
mkdir avatarsConvertir les avatars
mysql -r logy-smf < sql |sed 1,1d |sed 's/\t/ /g' |awk -F" ; " '{print $1 " " $2"_"$3" \""$4"\""}'|xargs -L1 ./renomeInjecter les noms des avatars en base
update `sandbox16`.`jos_kunena_users` m1 set avatar =(SELECT concat("users/", concat ((id_member+100),"_avatar.png")) FROM `logy-smf`.`smf_attachments` where id_member<>0 and (id_member+100)=m1.userid );
Mise en forme des champs text des messages
On retrouve des bouts de balise html un peu partout, ça fait désordre. On traite le problème. Ne pas faier attention si il y une erreur sur le drop table mess_tmp, dans ce cas, supprimer la ligne .USE `sandbox16`;
drop table mess_tmp ;
create temporary table mess_tmp
LIKE `sandbox16`.`jos_kunena_messages_text`;
truncate table mess_tmp;
insert into mess_tmp (mesid,message)
select mesid, REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(message," "," "),"'","'"),"<br />","\n"),">",">"),"<","<"),""",'"')
from `sandbox16`.`jos_kunena_messages_text`;
truncate `sandbox16`.`jos_kunena_messages_text`;
insert into `sandbox16`.`jos_kunena_messages_text` (mesid,message)
select * from mess_tmp order by mesid;
Mise en forme des titres des messages
USE `sandbox16`;drop table mess_tmp ;
create temporary table mess_tmp
LIKE `sandbox16`.`jos_kunena_messages`;
truncate table mess_tmp;
insert into mess_tmp (id,subject)
select id, REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(subject," "," "),"'","'"),"<br />","\n"),">",">"),"<","<"),""",'"')
from `sandbox16`.`jos_kunena_messages`;
update `sandbox16`.`jos_kunena_messages` m1 set subject = ( select subject from mess_tmp mt where mt.id=m1.id);
Mise en forme des text perso
USE `sandbox16`;drop table mess_tmp ;
create temporary table mess_tmp
LIKE `sandbox16`.`jos_kunena_users`;
truncate table mess_tmp;
insert into mess_tmp (userid,personalText)
select userid, REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(personalText," "," "),"'","'"),"<br />","\n"),">",">"),"<","<"),""",'"')
from `sandbox16`.`jos_kunena_users`;
update `sandbox16`.`jos_kunena_users` m1 set personalText = ( select personalText from mess_tmp mt where mt.userid=m1.userid);
Reporter le nombre de hit pour chaque thread
update `sandbox16`.`jos_kunena_messages` m1 set hits=( SELECT num_views FROM `logy-smf`.`smf_topics` where m1.id=id_first_msg);
File type des pièces jointes
En fonction des besoins, par exemple remplace tous les filetype des fichiers se terminant par .jpg en image/jpeg . A adapter selon votre besoin.update `sandbox16`.`jos_kunena_attachments` set filetype="image/jpeg" where filename like "%.jpg";
update `sandbox16`.`jos_kunena_attachments` set filetype="image/png" where filename like "%.png";
update `sandbox16`.`jos_kunena_attachments` set filetype="" where filename like "%.rar";
update `sandbox16`.`jos_kunena_attachments` set filetype="" where filename like "%.zip";
update `sandbox16`.`jos_kunena_attachments` set filetype="" where filename like "%.lxo";
Effacer les vignettes SMF
Il reste des pièces jointes, de type thumb, on les effaces dans la base. (allez les effacer à la main sur le disque aussi).delete FROM `sandbox16`.`jos_kunena_attachments` where filename like "%thumb";
Finalisation
Aller dans l'administration kunena et demander "synchroniser les utilisateurs" et "recompter les stats" .Vérifier les comptes joomla, que les utilisateurs est un group correct.
Les mots de passe ne fonctionneront plus, il faut donc demander aux utilisateurs de passer par la procédure d'oublie de mot de passe, pour réinitialiser celui-ci par le mail.
=> Philippe Petitjean 2011
Import Export Entre Modo Et Messiah
Modo ne dispose pas pour l'instant de "caracter animation". Un bon compromis existe, en passant par Messiah, qui lui est plutôt complet.
Messiah n'est pas parfait, le workflow n'est pas facile quand il y a plus d'un objet à animer. Comme par exemple, un personnage, où nous trouvons dans des objets séparé :
- corps
- yeux
- dents
Première chose à savoir, l'export via mdd fonctionne bien. Le mdd est un format de fichier, où sont référencés les modifications des vertex d'un objet image par image. C'est donc un fichier de morph, et la référence est le maillage de départ. Modo utilise très bien ce format.
Il faut savoir que messiah 4.5 lit le format lightvwave et modo directement (lwo et lxo). Cependant, il y a un problème, la structure des items est perdu (parent/enfant) et qu'il ne tient pas compte du centre(center et pivot modo). Le centre de chaque item est positionné en 0,0,0 lors du chargement sous messiah.
Comment faire pour conter celà ? La règle est simple, sous modo, positionner les centres en 0,0,0 avant l'export vers messiah. Et sous messiah, placer les centres sur les objets, en utilisant des "null" à la place, et parenter l'objet au null.
Modo
- Centre en 0,0,0
- Save
Messiah
- load .lxo
- Ajout du null.
- Déplace le null sur la position du centre tel qu'il devrait normalement se trouver.
- Parenter l'objet au null. L'objet retrouve son pivot tel qu'il était prévu sous modo.
A partir de ce moment, modo et messiah sont en conformités avec l'utilisation du format mdd. Créer l'animation sous messiah, ensuite faire l'export du mdd pour retrouver cette animation sous modo.
Positionner les centres sous modoSous messiah, ajouter les null.
Déplacer les null à la position des pivots.
Parenter objet/null comme indiqué.
Ne pas oublier de cocher keep position et keep alignement, pour conserver l'origine en 0,0,0 de l'objet. Sans cela, l'origine de l'objet devient le null, et l'objet va se déplacer. Hors, pour une utilisation correct du mdd, il ne faut pas de mouvement d'objet entre modo et messiah.
A partir d'ci, vous pouvez animer votre personnage.
Selectionner chaque objet et faire une sauvegarde de son mdd.
Revenir sous modo, et ajouter à chaque objet un deformer mdd. Charger le mdd sauvegardé avec messiah. L'animation est prête à être rendu sous modo
Résultat
Créer une macro sous modo et l'assigner à une touche
Nous allons voir comment créer une macro sous modo et l'assigner à une touche.
Créer une macro
- On enregistre une macro: "system/record macro"
- Effectuer la serie de commande
- On arrête l'enregistrement de la macro: "system/record macro"


Stocker la macro
- On ouvre le command history palette par F5
- Cliquer sur Scripts, puis sur Macros. Toutes les macros sont listées dans l'interface.
- Aller dans le menu "system/Store in Config" et donner un nom à la macro. Ici, ppj Wireframe off .

Assigner la macro à une touche
- Clique droit sur la macro, et "map script to key"
- Taper une touche, par exemple F11. Si la touche est prise, un message apparait en bas pour nous prévenir.
- Pour effacer une mauvaise sélection, cliquer sur "Press keys for assignment; click to clear"

A noter , que la case Command contient quelque chose qui ressemble à "@{chiffres:macro}", c'est la commande vu coté système. On peut se servir de cette valeur pour assigner une commande dans l'interface plutôt qu'une touche.
Générateur de particules pour modo 401
J'avais depuis quelques moments l'idée de faire un générateur de particule. Je me suis inspiré de quelques scripts pour parfaire ma compréhension des scripts sous modo. Ce script n'est qu'une ébauche, pour voir ce qu'il est possible de faire. Je l'ai écris en python.
Installation
L'installation est standard, télécharger le zip :particles001-modo401.zip
Installer les fichiers dans votre home, probablement sous "C:\Users\[votre username]\AppData\Roaming\Luxology\Scripts".
Lancer modo, et charger l'interface "particle.CFG" par le menu /file/Config Import.
Ouvrir le Form Editor, cliquer sur la flèche noir devant Forms, pour ouvrir le contenu.

Aller jusqu'au label particle.

clic droit de la souris ou équivalent pour les tablettes, pour ouvrir Assign to key

Assigner une touche au script, par exemple F12.
Comment utiliser le script.
Dans un premier temps, créer un nouvel item, de type mesh, et nommer le emitter. Assigner la forme de l'émetteur souhaité dessus. Les vertex seront le point de départ aléatoire de nos particules.
Ensuite, initialiser l'interface, par le menu, bouton initialize. L'interface va s'étendre avec de nouveaux arguments.
- Frame : Frame en cours.
- birthrate : Nombre de particule généré par frame.
- v0x,y,z: Vitesse initiale, selon x,y et z.
- vmax,vmin : Induit une variation de vitesse entre vmax et vmin.
- Accelx,y,z: Accélération, selon x,y,z.
- age : Duré de vie de la particule en frame
- Lastframe: Nb de frame total, utiliser pour le mode auto.
Next : Incrémente d'une frame, et avance les particules.
Auto: Parcourt automatiquement de frame à lastframe, et créé toutes les particules.
La case particule box cochée pour la création de particule de type box, taille 0.2. Si elle est décochée, alors des locators apparaitront.
Nota:
Attention à ne pas trop charger en particules, la quantité de mémoire utilisée est gigantesque !! Pour 1000 frames, 1000 particules, j'ai atteins les 10Go de ram. Je n'ai pas trouvé de solution à ce problème qui est du au fait de l'undo de modo qui retient tout ce qui se passe dans le script. Le fichier final, avec 1000 particules, 10Go de ram, ne pèsera pratiquement rien à la sauvegarde.
Reste à attendre une astuce pour passer outre cette limitation. Le script est lent, j'ai fais quelques mesure, si je prends en référence 1,4s par frame, en supprimant les fonctions d'appels vers modo, je tombe à 0.4s (gestion de liste, etc... uniquement python). Je ne sais pas si il y a moyen d'aller plus vite.
Le fichier exemple pèse 1.9Go de ram à la création, 5mo à la sauvegarde. ppj.zip
A Souligner : Avec Modo 501, il n'y a plus de problème de ram ou de vitesse du script, 100% fonctionnel !!!
jenn3d
Rendu modo. Le polytope est généré par jenn3d. Excellent petit soft.
Mass tree 100 000 arbres avec Unity version 3 B5
Test rapide d'une scène avec 100.000 arbres dans la beta5 de unity 3. La camera et la balle dispose de l'effet wind sphérique, qui interagit avec les arbres en provoquant du souffle. Il n'y a pas de collision avec les arbres.



























