OVH Cloud OVH Cloud

Microsoft et Java

295 réponses
Avatar
Wykaaa
Microsoft semble reconnaître que Java permet de développer plus
rapidement que C# et qu'il y a moins de failles de sécurité dans Java
que dans .net :
http://dsi.silicon.fr/nouveautes/microsoft-java-forever%E2%80%A6-1366

10 réponses

Avatar
Patrick Lamaizi
Aéris :

http://mvnrepository.com/ ?
162.000 librairies qui n'attendent que toi…
Toutes disponibles en 4 lignes de XML dans le POM.



Oui mais quelle est la pérénité de ces dépots et quel est le niveau de
sécurité ?
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 19/06/2011 12:43, Patrick Lamaizière a écrit :
C'est quoi l'IoC ?



Inversion de contrôle.
En gros t'as une couche au-dessus qui te gère tout l'assemblage des
différents constituants de ton application.

Ça fait parti du langage où c'est un hack à base de manipulation de
byte code / aop et ces sortes de choses ?



C'est géré par une libraire, spring-context.
Et ce n'est pas basé sur du bytecode ou de l'aop, uniquement sur des
fonctionnalités du langage (getter/setter, constructeur).

Comment on fait quand ça marche pas ?



On débug ?

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/eDyAAoJEK8zQvxDY4P9dfQH/iSHoHCLeJ0Sla43lSiXvUjk
T+6UPywlNML3pfWBoOVytUOIk12AA4yE+XeujzKhvW5Y3g0XsbyFNQceM2xGiEre
MDOZfdTlqPWR6mrIpxko18peOJXT+wHOshKc7qY2AgxfPnYJErAjDghOuiHfGBOR
62F35SehctlKylkPqGEjO/L6/WALexM9ZU5NtVaaKS4Mdk+TadZ2M5iL6IqOKqMq
apG1edNI4iU5DAb/bFaonmJwaWZ7ahRq6IuOh7CJ4p6refmn2oab3WDBjp9phUMW
AtPtc1ZyZiJOcKKVejmH749ZLToIYHRbAYabTYZJB+LZEICPxx3OQgI+JgZXrrY =YIJi
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 19/06/2011 13:12, Patrick Lamaizière a écrit :
Oui mais quelle est la pérénité de ces dépots et quel est le niveau de
sécurité ?



Pérénité de plus de 8 ans, vu que tout ce qui est là-dedans depuis 2002
y est toujours. Aucun artifact n'est enlevé une fois qu'il a été publié.
Et même si cela venait à tomber un jour, on trouve de multiples mirroirs
partout sur le net, justement grâce au fonctionnement récursif des
dépôts Maven.

Niveau sécu, c'est comme le SSL ou n'importe quelle librairie, t'as
forcément besoin de faire aveuglément confiance à quelqu'un quelque part
dans la chaîne.
Après, vu le nombre de personnes qui s'en servent et l'importance de
certaines sociétés ou fondations derrière tout ça (Oracle, JBoss,
Sonatype, Glassfish, Eclipse, Google, Apache, CodeHaus, Atlasian…), je
pense qu'on peut décemment faire confiance à ce genre de dépôts.

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/eLhAAoJEK8zQvxDY4P9sWUH/0WmdfaxLGaP5C70gwBk1rdI
0RQFNISKmZCskldPuPQlUgxW+ztOGEnHbZY1KAY+zJkK30SKYskrtwvLtv1tph9j
ia7952bdU9r4A6JHaswPleTNdIa9QBeXUnBndQf/aA9MdNQQPlK2EXTRNnCdqBkr
GdncDEyBl/F4VnU0URfOf+hzBSHEAo9mSKK0ubGzy1C7HrV0xtPO/y7BBG5jNYUd
N8kx1KtyYL/psohKjD/fi+t369zcbSgnNPwZTIqgDcIFJmyQ2I2DN5x+KH0BuupZ
4JYY0y0ExB4BgrOVlBoda+ZqzrSBG/Bt9RTX3fAyhpdb+h4ZGENEKph3U8Cqdrw =do1m
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 19/06/2011 12:55, Patrick Lamaizière a écrit :
La première fois que tu executes une cible ça download un tas de trucs
dont tu ignores à quoi ça peut bien servir.



C'est à la fois un avantage et un inconvénient.

Certes, c'est parfois frustrant de voir plein de choses sans savoir à
quoi cela sert réellement, mais à la limite toi ce que tu voulais, c'est
Spring et/ou Hibernate.
Ça tu sais à quoi ça sert, mais si eux-même dépendent de pleins de
trucs, ce ni à toi de gérer cela à la main, ni à toi de comprendre
pourquoi les devs d'Hibernate dépendent de Javassist…

C'est comme quand tu installes Firefox via apt, tu ne comprends pas
forcément à quoi servent libgtk2, libnspr4 ou xulrunner, qui sont ses
dépendances de 1er niveau, ou libbz2, libxt6, libnss3 et libcanberra0,
qui sont ses dépendances de 2ème niveau.

Je suis vraiment pas convaincu par Maven mais j'ai peut-être pas tout
compris.



Si tu as des questions ou des trucs qui ne te semblent pas clairs,
n'hésite pas =)

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/eVzAAoJEK8zQvxDY4P9YGcH/2HqPWHnBqyWxv9tQbkqtJv+
UINxRYsJXtf7bsGhyI8WPNGx5QIrB5b6rgtMtfyffpKXNA6uQ2bmKhm6SCpPQWoP
Ype4x5FQ3+VmV81tzRwsXH1osfw7nXGM3nFlAfGNLazWHOzr8cMyT/olzlibGDKV
ojyEUzNdqszwjotz1H39vLHp1c2CowE69okYYv4EcZbaszixrKL/AtJaz3VsO0uv
nKJNI2QIuSwEgNUGsIqOhVzVRIpr0Rm+EcepG0v3F2KaJr5ykyhA8goyu+wrU1ZP
Z2NLLIDeeWxtmyWgbmWea4eURYdK37BBrU7gb3Wz31mzog9zlyBms+83Z7l7v8Y =4ZEq
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 19/06/2011 13:12, Patrick Lamaizière a écrit :
quel est le niveau de sécurité ?



Je viens de vérifier aussi un truc.
Les jar des dépôts Maven sont ceux de l'upstream, les MD5 et les GPG
correspondent donc.
Il est donc facile de vérifier l'authenticité des librairies récupérées
en cas de doute.

Et un projet Maven est en cours pour intégrer des signatures GPG :
http://docs.codehaus.org/display/MAVEN/Repository+Security


- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/ejcAAoJEK8zQvxDY4P9M7kH/jurHS2VzLznU1n0ELmncwkp
eXpBKfUsHhK6LGMGsL6VL9gNUwnrjrRSj4nuEzU9lsmnyVXD06ayLWEXrciipzHv
EoFW5BRfmy8ssm3t1kUmiMFNOr8Q+BoYxzYbPCMcwHp+lErY4BF/8p/nIlvVneQo
ERqJgs6aDDWRGk7cW3vuvCkh5VpluxqB1325OlT4mEimr5cb7JDGjXIWEAYARrmw
v5ohvZ/kN61zQk6G8/FWmOAzBe+55OeQjXaC31fGkFUCy45moevJPOmddPQ0v7iX
MjAAU9FxmvzdhQiBw34AAarAZBkj8Ka+57oa8rJZWYmXgUDfUYFuBnmrSRyd/1k 5h
-----END PGP SIGNATURE-----
Avatar
Yliur
Le Sat, 18 Jun 2011 18:16:30 +0000 (UTC)
JKB a écrit :

Le Sat, 18 Jun 2011 19:59:47 +0200,
Aéris écrivait :
>
> Le 18/06/2011 19:50, JKB a écrit :
>> Pas exactement. Mais si tu ne vois pas la différence, tant
>> pis.
>
> J'ai très bien compris.
> Rien ne t'empèche de traiter localement ta libération de mémoire
> puis de remonter l'erreur pour faire la reprise.
>
> void doBordel() {
> int[INT_MAX] grosDawa = …
> try {
> trucQuiPlante();
> } finally {
> free(grosDawa);
> }
> }
>
> propre, net, précis et sans bavure.

Non. Va jusqu'au bout de ton raisonnement. Cela implique de
récupérer le code d'erreur localement, puis de traiter ce
qu'il faut localement,



En général on ne sait pas quoi faire localement.

puis de remonter l'erreur (soit avec un code
d'erreur, soit avec une exception et un magnifique throw)



S'il n'y a pas de catch mais seulement un finally, il n'y a même pas
besoin de propager l'exception : le code de nettoyage dans le bloc
finally est exécuté puis l'exception est automatiquement propagée.

à la
fonction appelante, et ainsi récursivement jusqu'à un point où tu
peux prendre ta décision sur le traitement à apporter. Je n'ai
_jamais_ vu un code Java (ou C++ d'ailleurs) fonctionner comme ça. Je
ne dis pas que ça n'existe pas, simplement que je n'en ai jamais vu.
La plupart du temps, tu as un try/catch avec un gros machin pas net
dedans qui récupère toutes les exceptions qui passent, se
contrefichant éperdument de tout ce qu'il faudrait récupérer
correctement.



En Java, la plupart du temps il n'y a rien à récupérer "correctement".
Seulement de la mémoire, mais tout ce qui a été alloué dans la fonction
et stocké dans des variables locales n'a pas besoin d'être récupéré
(comme dans le cas d'une fin normale de la fonction, c'est le
collecteur de mémoire qui s'en occupe).

Dans le cas où il a des choses à récupérer (fichiers, ...), en général
il y a une exception à gérer explicitement (IOException, ...). Donc
l'obligation de réfléchir à ce qu'il faut en faire (moins facile à
oublier qu'un code d'erreur).
Avatar
JKB
Le Sun, 19 Jun 2011 11:18:47 +0200,
Aéris écrivait :

Le 19/06/2011 09:42, JKB a écrit :
Foutaise. Elle est obligatoire lors de l'édition des liens et de
l'exécution. Si tu ne peux pas résoudre les symboles lors de
l'édition des liens, tu risques fort de ne pas obtenir
d'exécutable.



Ben je ne sais pas comment vous avez gaulé votre bordel en C/C⁺⁺ mais
Java s'en sort très bien dans ce cas là =)

Je peux avoir un .jar executable compilé avec une certaine librairie et
je n'ai absolument pas besoin du .jar de ma lib à l'exécution tant que
je n'ai pas besoin d'une seule de ses classes.



Je ne sais pas si tu saisis bien la contradiction dans les termes...

À la limite je peux même lancer mon jar sans la lib, mettre la lib
après-coup, et sans redémarrer l'exe, me mettre à utiliser ses classes.



Certes. Mais pour compiler ton jar, chez moi, il faut toutes les
bibliothèques. Sans ça, ça ne compile pas. Après, que lors de
l'exécution, la résolution soit du style lazy avant d'avoir
réellement besoin des fonctions de la bibliothèque, c'est un autre
problème (et au passage, je peux te faire exactement la même chose
en C/C++).

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Sun, 19 Jun 2011 15:57:29 +0200,
Yliur écrivait :
Le Sat, 18 Jun 2011 18:16:30 +0000 (UTC)
JKB a écrit :

Le Sat, 18 Jun 2011 19:59:47 +0200,
Aéris écrivait :
>
> Le 18/06/2011 19:50, JKB a écrit :
>> Pas exactement. Mais si tu ne vois pas la différence, tant
>> pis.
>
> J'ai très bien compris.
> Rien ne t'empèche de traiter localement ta libération de mémoire
> puis de remonter l'erreur pour faire la reprise.
>
> void doBordel() {
> int[INT_MAX] grosDawa = …
> try {
> trucQuiPlante();
> } finally {
> free(grosDawa);
> }
> }
>
> propre, net, précis et sans bavure.

Non. Va jusqu'au bout de ton raisonnement. Cela implique de
récupérer le code d'erreur localement, puis de traiter ce
qu'il faut localement,



En général on ne sait pas quoi faire localement.



Si, libérer les ressources utilisées dans la fonction dans laquelle
la fonction fautive a été appelée. Et il faut le faire récursivement
jusqu'à la fonction dans laquelle on peut traiter l'erreur. Si tu ne
fais pas ça, tu risques fort d'avoir des fuites de mémoire un peu
partout (voire pire).

puis de remonter l'erreur (soit avec un code
d'erreur, soit avec une exception et un magnifique throw)



S'il n'y a pas de catch mais seulement un finally, il n'y a même pas
besoin de propager l'exception : le code de nettoyage dans le bloc
finally est exécuté puis l'exception est automatiquement propagée.



Impossible à faire dans le cas général.

à la
fonction appelante, et ainsi récursivement jusqu'à un point où tu
peux prendre ta décision sur le traitement à apporter. Je n'ai
_jamais_ vu un code Java (ou C++ d'ailleurs) fonctionner comme ça. Je
ne dis pas que ça n'existe pas, simplement que je n'en ai jamais vu.
La plupart du temps, tu as un try/catch avec un gros machin pas net
dedans qui récupère toutes les exceptions qui passent, se
contrefichant éperdument de tout ce qu'il faudrait récupérer
correctement.



En Java, la plupart du temps il n'y a rien à récupérer "correctement".



Ah ? Enfin, tout est dans le 'la plupart du temps'...

Seulement de la mémoire, mais tout ce qui a été alloué dans la fonction
et stocké dans des variables locales n'a pas besoin d'être récupéré
(comme dans le cas d'une fin normale de la fonction, c'est le
collecteur de mémoire qui s'en occupe).

Dans le cas où il a des choses à récupérer (fichiers, ...), en général
il y a une exception à gérer explicitement (IOException, ...). Donc
l'obligation de réfléchir à ce qu'il faut en faire (moins facile à
oublier qu'un code d'erreur).



Sauf que c'est très con. Parce que ton exception peut être récupérée
tout à fait ailleurs et de façon totalement dégueulasse.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 19/06/2011 19:12, JKB a écrit :
Si, libérer les ressources utilisées dans la fonction dans laquelle
la fonction fautive a été appelée. Et il faut le faire récursivement
jusqu'à la fonction dans laquelle on peut traiter l'erreur. Si tu ne
fais pas ça, tu risques fort d'avoir des fuites de mémoire un peu
partout (voire pire).



Il n'y a pas de risque de fuite mémoire en Java, le garbage collector
est là pour ça.
Tout au plus faudra-t-il penser à fermer les flux dans un finally…

Ah ? Enfin, tout est dans le 'la plupart du temps'...



Et c'est là que les outils d'analyse de code te signaleront que
potentiellement ton code oublie un close sur une ressource…

void foo(File file) {
new FileInputStream(file).readLine();
}

Ceci n'est pas bon car readLine peut lancer une IOException et le
FileInputStream se retrouverait non fermé.

void foo(File file) {
FileInputStream fis = new FileInputStream(file);
try {
fis.readLine();
} finally {
fis.close();
}
}

Ça c'est parfaitement propre.
En cas d'erreur, je n'ai aucun moyen de me rattraper.
Je m'occupe uniquement de fermer mes flux, l'erreur se propagera
d'elle-même à la couche supérieure.

Je te met au défi de faire la même chose sans des plâtrés de «if
error»/«if not null» en C/C⁺⁺ dès que tu as plusieurs flux à gérer…

Et cela sera encore plus propre en Java 7 avec les scopes :

void foo(File file) {
using ( FileInputStream fis = new FileInputStream(file); ) {
fis.readLine();
}
}

Sauf que c'est très con. Parce que ton exception peut être récupérée
tout à fait ailleurs et de façon totalement dégueulasse.



Gné ?
Je ne vois pas où elle peut être récupérée ailleurs, et encore moins
comment cela pourrait être dégeulasse…

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/jDqAAoJEK8zQvxDY4P9lIkH/RmhsAURQJ8SiSx53CbZXkeE
9YUq/pB2lzYM9Fe4rmOjYoO4CryJcrrSzduLurqfBVjmf3EIL8Xqy9RXT/XxtP3x
IxIDmdQrzbFEFrhrCDZJOV2qSa9B9hLhexPR+vSi79ve/MFN/xFo4luPEO36hK89
Qcyb6QOld57xOQZSBHUzT4HT27n4N9/sgAaR1VvbkrB9tSZ9EOS3iRUxITWkZaEv
XCIbM8D4Jr1YYIFjamEyDff8QyWUSf4IY7DfPtmb+Iqg3XRUocFTCe+tOhrp7XFm
i48eq014q1KCwFBuEQGKQYoGuBvq6IOtta2Oy3aHCVGE6iq/UXzT5stBWV5ywpg =wR4l
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 19/06/2011 19:06, JKB a écrit :
Certes. Mais pour compiler ton jar, chez moi, il faut toutes les
bibliothèques.



En C/C⁺⁺ aussi, tu as besoin de toutes les bibliothèques sur ton poste
de dev.

Ou alors attend, tu en train de nous dire que tu devs sans les libs
optionnelles, donc que tu n'as aucun moyen de vérifier si tu n'introduis
pas de régression ? Et que tu n'as aucun moyen de lancer les tests U
pour vérifier ton travail ?

Et d'ailleurs, vous les gérer comment vos tests U avec vos bordels de
dépendances optionnelles ?
Vous lancez 2^N campagnes de tests différentes pour vérifier tous les
cas possibles ?

Et si on va encore plus loin, vous garantissez comment à vos clients que
votre lib fonctionne à 100% et a passé toutes vos batteries de tests
avec succès ?
Parce que s'il compile 1 des 2^N possibilités que toi tu n'as pas testé,
il a quoi comme garanti qu'il n'y a pas de bugs ?
Et que si tu ne t'engages que sur le bon fonctionnement de ta librairie
testée chez toi dans les conditions de ton dev, elles te servent à quoi
les 2^N-1 autres possibilités de compilation ?

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/jL2AAoJEK8zQvxDY4P9lp4IAIU6En1521NXq8IJ0grv9mAX
3vOTgHlOnCyV4f7mGzsFJZ2PDTkCPQI4eWIw8tsYVGlTLuIoVj3j4HdaBj03r8zT
S8ul4A2KGc9jadHcauGxr9ZhovUAZw+Lqy7oK8IBHUXWhlah0YuR1G8s3Cm/nr/W
tGWFiV2hIJLaoBXS7enaNedmIAFAzbagCURKQERZNhxQchxYsAmD6QBggZfHJHCO
+0Zl6/rDW+eFk61BQW9ZGQeoyImnlovxM7773ATvYfQEk8snZuSKFXD6syQiBnly
ZCCfYMFSE3hTDqhmUBr669CYlD+WDe3X64R2cddW3GMXQ6LXHh8IG6MUd9uNY0Q ßuD
-----END PGP SIGNATURE-----