Publié le 27 Juillet 2012

Virtual Box propose d'utiliser des dossiers partagés où les fichiers sont accessibles à la fois depuis le système hote et le système invité.

C'est très pratique mais leur mise en place n'est pas aussi facile que prévu.

 

1/ Installer les extensions de VirtualBox

Tout d'abord il faut installer les extensions de VirtualBox. Ceci peut se faire de 2 façons:

Soit le menu "Devices" contient "Install Guest Additions" (une fois la machine virtuelle démarrée). Dans ce cas il suffit de suivre les instructions qui s'affiche.

Dans l'autre cas il faut télécharger l'Extension Pack directement depuis le site de VirtualBox : https://www.virtualbox.org/wiki/Downloads 

Une fois installé le cdrom d'installation est disponible dans la machine virtuelle sous forme de cdrom (en fait il s'agit d'une image iso).

2/ Installer les extensions dans la machine virtuelle

 Il faut installer ces extensions dans la machine virtuelle, ce qui donne sur une machine linux, par exemple:

cd /media/cdrom0
sh VBoxLinuxAdditions-x86.run ou sh VBoxLinuxAdditions-amd64.run (selon que votre machine soit une 32 ou 64 bits)

3/ Arrêter la machine virtuelle

Ensuite il faut redémarrer la machine virtuelle (ou plutôt l'arrêter pour passer au 4/ avant de redémarrer)

4/ Configurer le dossier partagé

 Une fois la machine arrêter on peut en profiter pour ajouter le dossier partagé dans les settings de la machine virtuelle.

Penser à bien cocher l'option 'Auto-mount"

5/ Redémarrer la machine virtuelle

Une fois la machine virtuelle redémarrer le dossier partagé devrait apparaître dans /media/sf_<nom du dossier>

6/ Configurer les droits d'accès au dossier dans la machine virtuelle

Mais ce n'est pas encore fini. Il faut configurer les droits d'accès pour pouvoir accéder au dossier partagé.

Il faut ajouter le group vboxsf à votre utilisateur.

Sous ubuntu cela peut se faire depuis le menu "System Settings / User Accounts"

 

Cette fois c'est bon! Un peu compliqué à mettre en place mais ça rien bien service après. 

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Repost 0

Publié le 16 Juillet 2012

Après une migration vers Java7 je me tape un UnsupportedClassVersionError:

java.lang.UnsupportedClassVersionError: project/Main : Unsupported major.minor version 51.0

Clairement il y a incompatibilité de version mais le message n'est pas clair: Soit j'ai compilé en java 7 et j'essaie toujours d'exécuter en Java 6 soit le contraire.

Heureusement le numéro de version majeur permet de connaître la version de Java utilisée:

Java version Major Version
1.2 46
1.3 47
1.4 48
5 49
6 50
7 51

Dans mon cas 51 correspond bien à Java 7 donc j'essaye de faire tourner une classe java7 dans un JRE d'une version inférieure. Effectivement c'est bien le cas ... j'ai oublié de migrer la machine de tests :-b.

Tout ça pour dire que le numéro de version indiquée dans l'exception n'est pas très parlant.

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost 0

Publié le 13 Juillet 2012

Ubuntu fournit par défaut une version d'openJDK. Pour passer à java 7 il suffit d'utiliser le Software Center et de télécharger openJDK7.

Oui mais attention il s'agit du JRE openJDK7 soit uniquement le Runtime qui permet d'exécuter du code java mais pas de le compiler.

Pour installer le development kit JDK il faut utiliser apt-get:

$ sudo apt-get install openjdk-7-jdk

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Repost 0

Publié le 10 Juillet 2012

Un petit bug étrange ce matin avec maven:

J'ai un projet avec des tests unitaires et ils passent nickel sous Eclipse (yes!).

J'utilise maven pour le build et là je tombe sur l'erreur suivante:

java.lang.Exception: Test class should have exactly one public constructor
at org.junit.runners.BlockJUnit4ClassRunner.validateOnlyOneConstructor(BlockJUnit4ClassRunner.java:136)
at org.junit.runners.BlockJUnit4ClassRunner.validateConstructor(BlockJUnit4ClassRunner.java:125)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:114)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:269)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:66)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:59)
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.apache.maven.surefire.junit4.JUnit4TestSet.<init>(JUnit4TestSet.java:45)
at org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96)
at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209)
at org.apache.maven.surefire.Surefire.run(Surefire.java:156)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)

D'abord je ne comprends pas : ma classe de test ressemble à tout ce qu'il y a de plus normal et passe nickel sous Eclispe. Bizarre!

En fait cela vient de la configuration du plugin surefire de maven qui par défaut considère toutes les classes de test qui commencent par Test ou se termine par Test. OK mais cela comprend les inner class. Et c'est là que le bas blesse.

Il y a effectivement une inner class anonyme dans mon test et lors de la compilation le nom de cette class est TestCaseNormal$1.class et pour le plugin surefire il s'agit d'une classe de test comme une autre.

Et la solution: il suffit de demander à maven d'exclure les inner class des tests de la manière suivante:

<project>
 [...]
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
     <excludes>
      <exclude>**/*$*</exclude>
     </excludes>
    </configuration>
   </plugin>
  </plugins>
 </build>
 [...]
</project>

Voir les commentaires

Rédigé par Bliz

Publié dans #Maven

Repost 0

Publié le 6 Juillet 2012

Je suis récemment tombé sur ce qui ressemble fortement à un bug MySQL. Voici le contexte:

J'ai une table MySQL avec un SET comme ceci par exemple:

CREATE TABLE `subscribers` (
   `id` BIGINT(20) UNSIGNED NOT NULL,
   `name` VARCHAR(100) DEFAULT NULL,
   `options` SET('x','y','z') DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
) ;

Je met quelque données dedans:

INSERT INTO subscribers VALUES
(1, 'alice', 'x,y'),
(2, 'bob', 'y'),
(3, 'charles', 'y,z'),
(4, 'dany', NULL) ;

Et voilà ce qui pose problème:

SELECT
   id, name, options, 
   COALESCE(options, 0) AS 'COAL', 
   COALESCE(options, 0)|0 AS 'COAL()|0',
   COALESCE(options|0, 0) AS 'COAL(|0)'
FROM subscribers;
 

 

+----+---------+---------+------+----------+----------+
| id | name    | options | COAL | COAL()|0 | COAL(|0) |
+----+---------+---------+------+----------+----------+
|  1 | alice   | 1,2     | 1,2  |        1 |        3 |
|  2 | bob     | 2       | 2    |        2 |        2 |
|  3 | charles | 2,3     | 2,3  |        2 |        6 |
|  4 | dany    | NULL    | 0    |        0 |        0 |
+----+---------+---------+------+----------+----------+

Pour les lignes qui ont plusieurs valeurs dans leur set on obtient pas la même valeur selon que le OU est placé à l'intérieur ou à l'extérieur du COALESCE.

En fait les SET mysql sont converti en bigint et on utilise les bits pour savoir si l'item à la position correspondante est présente:

001 = 1 = x
010 = 2 = y
011 = 3 = 'x,y'
...

Quand on place le OU on force MySQL a utilisé la valeur décimal au lieu des différents items. Ce qui est bizarre c'est que les 2 dernières colonnes sont différentes et l'avant-dernière pose problème car elle ne prend on compte que la première valeur du set.

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost 0