Archives de catégorie : Recherche

Installation de Retroshare sur Debian Sid

Quand des paquets sont disponibles pour d’anciennes versions ou pour d’autre distribution, il est souvent plus souvent de corriger la liste de dépendance d’un paquet plutôt que de le reconstruire de but en blanc.
Cette technique possède toutefois une contrainte importante, il est possible que les évolutions des dépendances aient des conséquences importantes sur les fonctionnalités de l’application. Néanmoins, pour des utilisations classiques, ou sous réserve de tests complémentaires, le gain de temps est très appréciable.

la démarche est la suivante :

En un, décompresser le paquet debian ainsi que sa liste de contrôle:


dpkg-deb -x retroshare_0.5.5-0.7068~wheezy_amd64.deb dir_tmp
dpkg-deb --control retroshare_0.5.5-0.7068~wheezy_amd64.deb dir_tmp/DEBIAN

Il faut ensuite mettre à jour les dépendances pouvant poser problèmes (nouvelle version disponible, renommage … )

Edition du fichier de contrôle :


vi dir_tmp/DEBIAN/control

Dans le cas de rétroshare,le problème se situe sur la dépendance suivante : libprotobuf7 qui n’est maintenant plus disponible en version testing.


Depends: libbz2-1.0, libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.12.0), libgnome-keyring0 (>= 2.22.2), libprotobuf9, libqt4-network (>= 4:4.5.3), libqt4-script (>= 4:4.5.3), libqt4-xml (>= 4:4.5.3), libqtcore4 (>= 4:4.8.0), libqtgui4 (>= 4:4.8.0), libssl1.0.0 (>= 1.0.0), libstdc++6 (>= 4.6), libupnp6 (>= 1:1.6.13), libx11-6, libxss1, zlib1g (>= 1:1.1.4), gnome-keyring

=> Remplacer le libprotobuf7 par libprotobuf9

Il suffit ensuite de reconstruire le paquet via la commande suivante pour avoir un paquet directement installable via les commandes classiques.

Reconstruction du paquet :


dpkg -b dir_tmp retroshare_0.5.5-0.7068~wheezy_amd64.deb

et il est maintenant possible de l’installer.

Ps : Ce post est une adaptation de Install Pencil on Debian qui traite du même problème pour une application différente.

Oracle : Update or Insert = MERGE

J’ai du répondre à une question simple de prime abord, comment mettre un jour un référentiel, non prévu pour être versionné, et ayant pu évoluer de manière différente sur chacun des différents sites de manière indépendante.

Après quelques recherches, le principal mot clé qui pouvait revenir était : MERGE

Un merge pour un développeur, c’est quelque chose de connu et ce n’est pas souvent envisager comme quelque chose de simple et de généralisable.
En théorie si, mais en pratique, c’est souvent durant cette étape que la livraison de son code prend un retard inattendu.

Alors avant d’envisager une telle pratique quand on utilise traditionnellement le SQL pour faire de simple CRUD … on cherche du simple … on envisage de se mettre au PL …. voir de faire une mini application faisant ce que l’on veut.

Et pourtant, le merge cela peut aussi être simple dans certain cas et cela peut rapidement être mis en place.

Comme dit en introduction, mon contexte était le suivant :
– Mise à jour de référentiel
– Pas d’assurance sur l’état du référentiel avant travaux
– Pas nécessairement le temps de s’assurer de la cohérence des données pour chacun des sites.

A priori, il existe plusieurs techniques, plus ou moins simple pouvant arriver à ce résultat.
Dans mon cas, il fallait que le génération du script se fasse dans un temps relativement court … et en ne demandant pas de devenir DBA au passage.

Le processus choisit pour l’actualisation de la table fut le suivant :

– Mise en place d’une date de fin pour l’ensemble des champs du référentiel utilisé en production (assurance de conserver les champs pour les données déjà saisies).
– Injection de la nouvelle table de référentiel
– merge proprement dit entre l’ancienne table et la nouvelle afin d’actualiser les champs utiles, quelques soit l’état de la table initialement.

En SQL, cela donne cela :


-- Généralisation de la date de fin à l'ensemble des occurrences de la table
update SOC_TYPE_DOMICILE set datefin= '01/11/14';

-- Injection de la table référentiel nouvelle version
CREATE TABLE "SOC_TYPE_DOMICILE_REF"
( "CODE" VARCHAR2(10 BYTE),
"CODEREGROUPEMENT" VARCHAR2(10 BYTE),
"DATEDEBUT" DATE,
"DATEFIN" DATE,
"LIBELLE" VARCHAR2(100 BYTE),
"RANGAFFICHAGE" NUMBER(3,0),
"ANCIENCODECSD" VARCHAR2(10 BYTE),
"CODEREGROUPEMENTTYPE" VARCHAR2(10 BYTE),
"ID_LIBELLE" NUMBER(7,0)
);

Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('SIFO','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Sans information','1','0',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('HEBST','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Hébergement stable','2','2',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('HEBPR','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Hébergement précaire ou de durée incertaine','3','A',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('HOP','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Hôpital sans perspective de logement à la sortie','4','B',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('SAB','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Sans abri, absence totale d hébergement','5','1',null,null);

-- Merge
-- deux cas : la ligne existe : dans ce cas on modifie le libellé pour qu'il corresponde exactement avec le résultat attendu (les valeurs, même modifiées, ne changent pas de sens)
-- La ligne n'existe pas, on l'insère
MERGE INTO SOC_TYPE_DOMICILE S
USING SOC_TYPE_DOMICILE_REF R
ON ( S.CODE = R.CODE )
WHEN matched
THEN UPDATE SET S.DATEFIN = null, S.LIBELLE = R.LIBELLE, S.RANGAFFICHAGE = R.RANGAFFICHAGE, S.ANCIENCODECSD = R.ANCIENCODECSD
WHEN not MATCHED
THEN INSERT (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE)
VALUES (R.CODE,R.CODEREGROUPEMENT,R.DATEDEBUT,R.DATEFIN,R.LIBELLE,R.RANGAFFICHAGE,R.ANCIENCODECSD,R.CODEREGROUPEMENTTYPE,R.ID_LIBELLE);

-- et c'est fini ...

Duplication de clé USB

des fois on se fait plaisir avec peu de ligne de commande ..

Duplication de la clé
dd if=/dev/sdc of=/dev/sdd bs=4096 conv=notrunc,noerror

Hors avec des clés de tailles différentes, on obtient :

fsck /dev/sde1
fsck from util-linux 2.20.1
e2fsck 1.42.8 (20-Jun-2013)
La taille du système de fichiers (selon le superbloc) est de 7793408 blocs
La taille physique du périphérique est de 7674624 blocs
Le superbloc ou la table des partitions est peut-être corrompue !

Un simple : resize2fs -f /dev/sde1 7674624

et tout est de nouveau opérationnel :

fsck /dev/sde1
fsck from util-linux 2.20.1
e2fsck 1.42.8 (20-Jun-2013)
/dev/sde1 : propre, 25468/1925120 fichiers, 303289/7674624 blocs

Je vais de nouveau mettre ma sd card classique dans le Eeepc et la microSD dans une nouvelle go-pro ^^

Cariatides est DMP Compatible

Cariatides est maintenant DMP Compatible pour sa version 6.8 pour les 3 profils du DMP (Dossier Médical Patient) :  Profil création, Profil alimentation et Profil consultation.

Au bout de 3 mois, on voit une sortie positive pour ce projet 😀
Maintenant, il ne reste plus qu’à faire qu’il soit utilisable par des utilisateurs lambdas … Ce n’est pas rien mais le plus important est fait.

Pour info : Cariatides est logiciel de suivit de patient pour les hôpitaux psychiatriques, concu et développé par le GIP Symaris (Rouffach) basé sur le WebObjects associé à une base Oracle.

[ad#Google Adsense]

Communauté : the Innovation Explorers

Depuis le milieu de ce printemps, je fais partie d’une communauté de chercheurs : the Innovation Explorers.

[ad#Google Adsense]

Cette communauté, créé de toute pièce par la maison d’édition Elsevier a pour but de permettre une promotion de la recherche et de ses outils au sein d’un panel de chercheurs selectionnés qui auront la charge par la suite de faire une promotion des outils proposés par Elsevier. Pour attirer des membres, Elsevier a choisi la voie pécunière, un bon d’achat lors de l’inscription, et d’autres en fonction de notre implication.

Au bout de quelques mois de participation, le premier bilan a faire est que la voie pécunière n’était pas le choix le plus judicieux. Comme tous site naissant, le contenu de qualité est encore léger, ce qui est logique. Mais au lieu d’avoir un site communautaire partiellement rempli, nous nous trouvons sur une plateforme pleine de bruit, avec des messages vides qui ont pour simple objectif de faire un « +1 » sur le compte de son auteur (dans l’objectif d’obtenir sa prime mensuelle) …

A voir comment cette communauté arrive à vivre par la suite … mais pour le moment, sa naissance se fait dans la douleur …

the Innovation Explorers :
Mon Id : marcSauget

Présentation lors de la conférence EANN 2011

Les dernières avancées de mes travaux seront présentés dans le cadre des 12th EANN / 7th AIAI Joint Conferences :: 15 – 18 September 2011, Corfu, Greece, Engineering Applications of Neural Networks / Artificial Intelligence Applications and Innovations

Cette présentation sera basée sur l’article « Large datasets: a mixed method to adapt and improve their learning by neural networks used in regression contexts » co-rédigé avec Pr Contassot-Vivier Sylvain, Dr Salomon Michel et Dr Henriet Julien.

Voici l’abstract de l’article :

The purpose of this work is to further study the relevance of accelerating the Monte-Carlo calculations for the gamma rays external radiotherapy through feed-forward neural networks. We have previously presented a parallel incremental algorithm that builds neural networks of reduced size, while providing high quality approximations of the dose deposit.
Our parallel algorithm consists in an optimized decomposition of the initial learning dataset (also called learning domain) in as much subsets as available processors. However, although that decomposition provides subsets of similar signal complexities, their sizes may be quite different, still implying potential differences in their learning times. This paper presents an efficient data extraction allowing a good and balanced training without any loss of signal information. As will be shown, the resulting irregular decomposition permits an important improvement in the learning time of the global network.

Et le plus important le lien sur la conférence : EANN 2011

[ad#Google Adsense]

Java versus C++ (2nd round)

j’avais mis en ligne un premier résultat de test montrant que Java pouvait concurrence C++ dans le registre de la performance.

Afin de compléter ce premier résultat, j’ai poursuivi ma comparaison en accroissant le volume de calcul à réaliser ( volume des données et précision de calcul). Ce 2nd résultat confirme le premier test et encore une fois, la version Java de mon programme est autant performante (ou aussi peu pour les mauvaises langues) que ma version C++.

Voici les résultats :

C++/MPI

nb Dec Tps moyen Tps tot Prec moy Prec U
1 693,49 693,49 -5,39E-004 8,51E-004
2 689,225 1378,45 1,50E-005 7,65E-004
4 496,445 1985,78 -5,48E-005 5,12E-005
8 212,62 1700,96 2,54E-005 1,43E-005
16 89,039375 1424,63 3,14E-005 8,89E-006

Java/Jace

nb Dec Tps moyen Tps tot Prec moy Prec U
1 608,1793823242 608,1793823242 4,87E-007 1,53E-003
2 596,3627929688 1192,7255859375 -1,43E-004 7,35E-004
4 492,4767684937 1969,9070739746 -4,16E-010 4,22E-004
8 197,4866099358 1579,8928794861 -1,61E-005 8,70E-005
16 88,004909873 1408,0785579681 6,35E-006 1,15E-005

Voici les conditions de test :

Java utilisée :
java version « 1.6.0_16 »
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

C++ : (Configuration du mésocentre)
Option d’optimisation -O2 (à vérifier la compatibilité de cette option
avec ICC)
Compilateur : ICC
MPI : openMPI (Intel)

L’ensemble des tests ont été réalisé sur mésoshared un jour de calme ^^

[ad#Google Adsense]

Java Vs C++

Quand un logiciel est en cours de phase initial ou lors d’un changement majeur, la question du choix du langage peut être posé.

Mon projet étant essentiellement basé sur de l’apprentissage de réseau de neurones, la performance se doit être maximum … Et pour beaucoup, C++ s’imposerait donc sans équivoque.

[ad#Google Adsense]

Oui mais, cette évidence est peut être à remettre en cause. Dans mon cas, et pour des raisons de recherche, j’ai réalisé une version Java et une version C++, ce qui donnera en parallèle, une version utilisant MPI et l’autre utilisante JaceMPI, un environnement en cours de développement.

Le premier résultat est sans équivoque, pour un apprentissage rapide :

C++ => 11.8 s
Java => 10.7 s

La différence n’est pas flagrante … mais le langage en tête n’est pas celui attendu.

[ad#Google Adsense]

Le premier n° de Mathematica Æterna est sorti

Ce premier numéro est relativement léger et propose le contenu suivant :

Paul Bracken
Surfaces of Arbitrary Constant Negative Gaussian Curvature and Related Sine-Gordon Equations
Math.Aeterna,Vol.1, 2011, no. 01, 1-11

Samy Skander Bahoura
sup X inf inequality on manifold of dimension 3
Math. Aeterna, Vol.1, 2011, no. 01, 12 – 25

Daiheng Ni
Multiscale Modeling of Traffic Flow
Math. Aeterna, Vol.1, 2011, no. 01, 26 – 53

Arun Kumar, Ram Dayal Pankaj and Chandra Prakash Gupta
Description of a wave-wave interaction model by Variational and Decomposition methods
Math. Aeterna, Vol. 1, 2011, no. 01, 54 – 62

Comme c’est une revue en open acces, il est librement lisible à cette adresse : http://www.e-hilaris.com/volume1.html

Bonne lecture

[ad#Google Adsense]