Profilage de grub:
http://aroundtheweb.info/2010/09/how-to-speed-up-ubuntu-10-10-maverick-meerkat-boot-time-with-profiling/
Désactivation des services non utilisés :
http://www.extremetech.com/article2/0,2845,2114124,00.asp
Aller au contenu | Aller au menu | Aller à la recherche
jeudi 3 février 2011
Par Sébastien Bordes le jeudi 3 février 2011, 14:16 - Système
Profilage de grub:
http://aroundtheweb.info/2010/09/how-to-speed-up-ubuntu-10-10-maverick-meerkat-boot-time-with-profiling/
Désactivation des services non utilisés :
http://www.extremetech.com/article2/0,2845,2114124,00.asp
vendredi 14 janvier 2011
Par Sébastien Bordes le vendredi 14 janvier 2011, 09:33 - Intégration Continue
Voici la liste de plugins que j'utilise avec Hudson
mardi 11 janvier 2011
Par Sébastien Bordes le mardi 11 janvier 2011, 09:06 - Flex|Flash|AS3
L'information n'est pas clairement disponible dans documentation de Flex-Mojos donc voici en 2 captures une brève explication car il est très fastidieux de recréer la bonne arborescence à la main.
Dans Eclipse > Window > Preferences > Maven > Archetype Cliquer sur Add Remote Catalog, saisissez le repository : http://repository.sonatype.org/content/groups/flexgroup/ Puis un nom quelconque
Cliquer sur verify puis si tout va bien sur Ok.
Puis dans l'explorateur de projet : Clic-Doit New project > Maven Module
Renseignez toutes les valeurs du pom (groupId, artifcatId, parent...)
ne cochez pas la case "Create a simple project"
Puis choisissez l'archétype de votre choix :
Il peut arriver que votre fichier pom du projet parent soit écrasé, utilisez votre historique local pour remettre l'ancien
Et c'est dans la poche
mardi 4 janvier 2011
Par Sébastien Bordes le mardi 4 janvier 2011, 08:02 - Java
Un petit billet sous forme de memento:
Voici les paramètres essentiels pour la machine virtuelle Java d'un Tomcat de dévelopement ou d'intégration : (avec une JVM SUN)
///
Arguments to pass to the Java virtual machine (JVM).
JAVA_OPTS="-Xms64m -Xmx512m -XX:PermSize=32m -XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled -Djava.awt.headless=true -Xdebug -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=n -Dcom.sun.management.jmxremote"
///
jeudi 23 décembre 2010
Par Sébastien Bordes le jeudi 23 décembre 2010, 17:55 - Système
Pour fixer la vitesse par défaut de votre processeur voici la manipulation à faire (testé avec Ubuntu 10.10) :
sudo apt-get install sysfsutils sudo nano /etc/sysfs.conf
Ajouter ceci
devices/system/cpu/cpu0/cpufreq/scaling_governor = userspace devices/system/cpu/cpu0/cpufreq/scaling_setspeed = 2000000 devices/system/cpu/cpu1/cpufreq/scaling_governor = userspace devices/system/cpu/cpu1/cpufreq/scaling_setspeed = 2000000
Pour ma part j'ai mis 2000000 pour avoir mes 2 cœurs qui tournent à 2.0Ghz au lieu de 2.9 Ghz, pour garantir le maximum de réactivité à mon pc cinédom sous xbmc/ubuntu tout en economisant quelques Watt et donc quelques degrés. Le tout est refroidi par un ventilateur slim de 12cm de Scythe surmontant un dissipateur NT07 Pro de Silverstone, et avec un SSD OCZ fonctionnement silencieux garanti.
Puis n'oubliez pas de désactiver le gouverneur par défaut qui dans mon cas me bascule les 2 cœurs à 1 Ghz
sudo update-rc.d ondemand disable
Puis un petit sudo reboot et c'est dans la poche
Vous pouvez mettre un autre gouverneur et d'autres valeurs selon vos besoins
voici les différents paramètres :
cpuinfo_cur_freq: la fréquence actuelle de votre proc cpuinfo_max_freq:la fréquence maximum cpuinfo_min_freq: la fréquence minimum scaling_available_frequencies: les fréquences disponibles scaling_available_governors: les gouverneurs disponibles scaling_cur_freq scaling_driver: le pilote du processeur utilisé scaling_governor: le gouverneur en action scaling_max_freq scaling_min_freq
mercredi 15 décembre 2010
Par Sébastien Bordes le mercredi 15 décembre 2010, 12:04 - Intégration Continue
Mais pourquoi utiliser Sonar ??
Tout simplement parce que la qualité ne dépend pas des développeurs mais des priorités du moment.
Voici un exemple pour une petite application développé par un seul développeur (en l'occurrence c'est moi qui m'y suis collé)
Avant le premier commit, revue de code et Hop un bon 99%
Puis dans l'urgence modification du code pour ajouter des fonctionnalités non prévues et bam ... le nombre de lignes a bien augmenté mais la qualité a baissée (pas tant que ça au vue des 50% de code en plus).
D'où la nécessité de refaire une revue de code et là miracle on arrive aux 100% !!
Pour ce projet un seul développeur était à l'œuvre imaginez avec plusieurs dont des débutants modifiant le code d'expérimentés ...
La qualité c'est bien mais la suivre en temps réel c'est mieux
Une belle page comme celle-là ca se mérite :D
et encore il reste des corrections, 2 lignes de codes commentées et 2copier-coller qui auraient pu être factorisé... il reste toujours du travail quand on est perfectionniste :p
mercredi 1 décembre 2010
Par Sébastien Bordes le mercredi 1 décembre 2010, 09:44 - PHP
PHP 6 est enfin disponible chez 1and1
Par contre il font l'impasse sur la 5.3 alors que chez OVH c'est les versions 5.2 et 5.3 qui sont disponibles
A noter que de nombreuses applications PHP ne fonctionnent plus avec le 5.3 et donc la 6
voici le phpinfo de la version 6 : http://installer.emukina.fr/phpinfo.php
J'ai récemment était confronté au problème quand un de nos serveur Ubuntu a fait la mise à jour de la version de php, et paf 3 applications HS.
Bref je m'égare si PHP6 fonctionne ca veut dire que Flampy va reprendre du service !!
Pour me remettre dans le bain je vais probablement ajouter une gestion MVC avec un meilleur support de la librairie Javascript maison, et ensuite je reprendrai la gestion de AMF pour Flex.
La prochaine étape actuellement bloquée sera la mise en place des projets sous phpmaven.
Affaire à suivre !!!
mardi 30 novembre 2010
Par Sébastien Bordes le mardi 30 novembre 2010, 13:19 - Java
Un petit billet au sujet de la gestion des logs avec Java :
Si on se réfère au règles diverses (Checkstyle, PMD ...), voici la bonne façon de déclarer un logger en Java
// Pour Log4J avec commons-logging private static final Log logger = LogFactory.getLog(MyClass.class); // Pour logback avec slf4j private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
...Hein.. c'est quoi logback ???
Logback est le digne hériter de log4j, il a été conçu en même que les api slf4j par le créateur lui même de log4j: Ceki Gülcü
Il y a de nombreuses raisons d'utiliser logback, et elles sont toutes expliquées sur le site http://logback.qos.ch/reasonsToSwitch.html
Le seul défaut est que vous perdrez le niveau fatal, mais bon toutes les erreurs ne devraient-elles pas êtres évitées, et un niveau fatal devraient entrainer l'arrêt de l'application ??
Donc switchons tous ensemble :D
Revenons à nos moutons si on veut logger des évènements qui ont lieu dans une classe abstraite commune la bonne solution est de déclarer le logger protégé et de l'initialiser de manière statique.
protected transient final Logger logger = LoggerFactory.getLogger(this.getClass());
Toutefois cette déclaration n'est pas compatible avec une règle (qui à dit 'à la con') de PMD à savoir LoggerIsNotStaticFinal
Certains puristes veulent que la classe Abstraite et la classe fille ai chacune leur propre logger pour permettre de les filtrés différemment avec le fichier de configuration du gestionnaire de log. (cf ce billet )
Personnellement j'ai jamais voulu séparer les logs des méthodes abstraites hérités de celles déclarées dans la classe fille, surtout quand la pile d'appel est imbriqué et que plusieurs classes filles peuvent être appelés.
On pourrait ajouter l'information getClass() dans chaque log de la classe abstraite, mais c'est quand même relativement pénible
Donc comment faire ??
Une des solutions peut-être d'utiliser AOP => en bon français la Programmation par aspect (soit en bon anglais Aspect Oriented Programmation à opposer à la OOP)
Avec Spring AOP par exemple on peut ajouter des logs sur des points de coupe définissant des endroits où logger.
Voici la déclaration via le conteneur léger de spring (spring-beans):
<bean id="loggingAdvice" class="fr.webeo.rapidoo.aop.LoggingAdvice" /> <bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="loggingAdvice" /> <property name="pattern" value="fr.webeo.rapidoo.services" /> <property name="order" value="50" /> </bean>
A vous de spécialiser votre point de coupe si vous voulez plus de précision, ici toutes les méthodes de toutes les classes du package fr.webeo.rapidoo.services seront traitées à la même enseigne !
Et l'advice qui va logger tout seul les classes filles
public class LoggingAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice { /** * Default Constructor. */ public LoggingAdvice() { // Nothing to do } /** * {@inheritDoc} */ @Override final Logger logger = LoggerFactory.getLogger(target.getClass()); if (logger.isInfoEnabled()) { logger.info("Calling : " + method.getName() + " " + target.getClass().getName()); } if (logger.isDebugEnabled()) { final StringBuilder sb = new StringBuilder(); sb.append("Parameters : "); if (method.getParameterTypes().length == args.length) { for (int i = 0; i < args.length; i++) { sb.append("\r\nParam : ").append(method.getParameterTypes()[i]).append(" - ").append(args[i] == null ? "null" : args[i].toString()); } } if (sb.length() > 1000) { logger.debug(sb.substring(0, 1000)); } else { logger.debug(sb.toString()); } } } /** * {@inheritDoc} */ @Override final Logger logger = LoggerFactory.getLogger(target.getClass()); if (logger.isInfoEnabled()) { logger.info("Returning : " + method.getName()); } if (logger.isDebugEnabled() && returnValue != null) { logger.debug("Return value is list of " + ((List<?>) returnValue).size() + " elements."); } else { logger.debug("Return Value = " + returnValue.toString()); } } } /** * Call after an exception thrown. * * @param method the method called * @param args the method arguments * @param target the object who call the method * @param exception the exception thrown */ final Logger logger = LoggerFactory.getLogger(target.getClass()); if (logger.isErrorEnabled()) { logger.error("Throwing : " + method.getName() + " \r\n=> " + exception.getMessage(), exception); } } }
Pour conclure il existe 3 possibilités pour logger des classes filles héritant d'une même classe abstraite :
Avantages : Chaque ligne de la log renvoi vers la bonne classe physique
Défauts : les log contiendront des log par enfant et pour la classe mère, donc si quelque chose se passe mal dans la classe abstraite il faut espérer trouver à proximité une log indiquant quel est la classe fille concernée (ou bien la rajouter explicitement dans la ligne loggée)
Avantages : Toutes les logs seront générés au nom de la classe fille
Défauts : les numéros de lignes des méthodes héritées concerneront la classe abstraite
Avantages : Déclaration très rapide, bonne personnalisation
Defauts : Seulement utile pour les log génériques, induit donc une bonne conception objet avec des méthodes courtes et atomiques
Et vous comment faîtes-vous ??
lundi 29 novembre 2010
Par Sébastien Bordes le lundi 29 novembre 2010, 08:54 - Java
Récemment j'ai pour la première fois trouvé une utilité à la case à cocher Regular Expressions de la boîte de dialogue Find/Replace d'Eclipse (ctrl+F)
en effet le plus souvent une bonne orgie au clavier prendra moins de temps que de réfléchir à écrire la bonne regexp pour faire un petit refactor.
Mon problème était le suivant, j'avais plusieurs énumération (enum) dont les champs étaient écrit ainsi :
... field1, // Field1 comment ...
Or CheckStyle nous tape sur les doigts car il faut un élément de javadoc par champs
Donc ctrl+F

en version texte pour faire un copier-coller
([a-zA-Z_]*)([,|;] // )([a-zA-Z_-éè' .\[\]#]*)
/** $3. */\r\n\t$1,
Ce qui nous donnera :
... /** Field1 comment. */ field1, ...
Vous pouvez rajouter vos caractères spéciaux par exemple les parenthèses si vous en avez dans vos commentaires ce qui donnerait :
([a-zA-Z_]*)([,|;] // )([a-zA-Z_-éè' .\[\]#\(\)]*)
De quoi devenir le Leader de la Board :D
mercredi 22 septembre 2010
Par Sébastien Bordes le mercredi 22 septembre 2010, 11:38 - Java
Tout récemment j'ai été confronté à un problème comment lancer des tests se services java effectuant des requêtes en base de données avec une datasource JNDI !!!
Une des solution aurait été de se connecter directement à la base de données avec une URL standard, mais je ne souhaitait pas modifier le code existant.
Donc voici l'astuce :
reference.add(new StringRefAddr("driverClassName", "oracle.jdbc.OracleDriver")); //Le driver de la base utilisée context.rebind("jdbc/myappl", reference);
Nous n'avez plus qu'à renseigner le user/mot de passe et l'url de la base, bien sur si vous n'utilisez pas une base oracle changez le driver et n'oubliez pas le driver jdbc
Pour pouvoir utiliser ce code vous aurez besoin de rajouter les jars suivant dans votre classpath :
Les deux premiers jars sont récupérable chez Sun/Oracle
POur vous faire gagner du temps les voici réunit dans une archive : Jars pour utiliser une datasource via JNDI
lundi 20 septembre 2010
Par Sébastien Bordes le lundi 20 septembre 2010, 06:05 - Liens
J'inaugure la nouvelle catégorie "Liens" me permettant de publier des liens vers des sites intéressants.
Aujourd'hui je m'attaque à de la documentation Hibernate :
Tout d'abord des 3 liens vers un wiki présentant très rapidement les sessions Hibernate et leurs problématiques :
http://wiki.objetdirect.com/wiki/index.php?title=Hibernate_Survival_Guide_Partie_1
http://wiki.objetdirect.com/wiki/index.php?title=Hibernate_Survival_Guide_Partie_2
http://wiki.objetdirect.com/wiki/index.php?title=Hibernate_Survival_Guide_Partie_3
Ces pages m'ont permis de mieux appréhender le chargement des relations one-(to-many)*2 en deux requêtes pour éviter le chargement d'un produit cartésien
Puis une autre page dans laquelle j'ai trouvée une information très importante qui m'avait échappée :
http://www.javalobby.org/articles/hibernatequery102
En effet lors d'un requête via l'API criteria les méthodes Criteria.createCriteria et Criteria.createAlias ne chargeront pas les objets enfants mais sera juste utilisés en tant que critère de recherche.
Un petit point sur les stratégies de chargement des objets enfants pour éclaircir les Fetch, lazy, join :
http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies
Un point rapide sur les transactions :
http://www.amicabile.com/hybernate/hybernate-chapter5.html
J'espère que ces liens vous seront aussi utiles qu'ils l'ont été pour moi.
jeudi 3 juin 2010
Par Sébastien Bordes le jeudi 3 juin 2010, 09:44 - Intégration Continue
Voici une liste intéressante de plugin maven utiles pour le reporting et la génération du site.
<reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <configuration> <targetJdk>1.5</targetJdk> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jxr-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>taglist-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>changelog-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>2.1.2</version> <reportSets> <reportSet> <reports> <report>summary</report> <report>project-team</report> <report>mailing-list</report> <report>cim</report> <report>issue-tracking</report> <report>license</report> <report>scm</report> </reports> </reportSet> </reportSets> </plugin> </plugins> </reporting>
mercredi 24 février 2010
Par Sébastien Bordes le mercredi 24 février 2010, 10:38 - Intégration Continue
Si vous déployer vos sites Maven via SCP comme dans cette exemple :
<site> <id>Webeo_Sites</id> <name>Webeo Sites</name> <url>scp://development.webeo.fr/var/www/projects/rapidoo-${version}</url> </site>
Et si vous utilisez Hudson alors il peut arriver la mésaventure qu'un déploiement via SCP ne fonctionne pas à cause du manque d'interactivité imposé par Hudson à la session Maven. En effet le build peut se retrouver bloquer en attente d'une interaction avec l'utilisateur lui demandant d'accepter la signature d'un serveur, mais depuis Hudson il est impossible d'interagir avec le shell amven donc le build reste bloqué ad vitam eternam.
Voici donc une astuce pour palier à ce problème
Pour ce faire modifier le user hudson (ou celui que vous utilisez pour lancer ce service) pour lui rajouter un home directory, et surtout un fichier .ssh/know_hosts avec la bonné clé SSH
Lancer la commande
/var/lib/hudson/tools/Maven_2.2.1/bin/mvn site-deploy -s /var/lib/hudson/.m2/settings.xml [INFO] [site:deploy {execution: default-deploy}] The authenticity of host 'development.webeo.fr' can't be established. RSA key fingerprint is 6a:1d:86:8b:a0:7a:1c:23:20:df:7e:ff:bb:17:3f:5f. Are you sure you want to continue connecting? (yes/no):
Dites Yes et la clé sera ajouté dans le fichier, ainsi vos build ne resteront plus bloqués à cause de votre deploiement SCP !!
Autre source d'information : http://debalex.wordpress.com/2008/10/07/maven-site-deployment-inside-hudson
mercredi 10 février 2010
Par Sébastien Bordes le mercredi 10 février 2010, 09:49 - Java
Voici le contenu du code source d'un fichier exemple ou une Map est déclaré :
Voici une petite capture de l'éditeur ecore d'Eclipse pour plus de clarté :
Et le code du fichier ecore pour plus d'exhaustivité...
<?xml version="1.0" encoding="UTF-8"?> <ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="fr"> <eSubpackages name="webeo"> <eSubpackages name="blog"> <eClassifiers xsi:type="ecore:EClass" name="CarOwner"> <eStructuralFeatures xsi:type="ecore:EReference" name="carMap" upperBound="-1" eType="#//webeo/blog/CarMapEntry" containment="true"/> </eClassifiers> <eClassifiers xsi:type="ecore:EClass" name="Car"/> <eClassifiers xsi:type="ecore:EClass" name="CarMapEntry" instanceClassName="java.util.Map$Entry"> <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//webeo/blog/Car" containment="true"/> </eClassifiers> </eSubpackages> </eSubpackages> </ecore:EPackage>
Et pour terminer le fichier ecore :D
vendredi 8 janvier 2010
Par Sébastien Bordes le vendredi 8 janvier 2010, 14:54 - Système
Memento pour les dns par défaut d'ubuntu (config réseau)
Nice find.
nsswitch.conf specifies which name service to use for a particular machine: NIS, NIS+, DNS, or local files etc
The list you see specifies in which order it should use the various resources.
Code:
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
files: Network Database Local Files hosts /etc/inet/hosts netmasks /etc/inet/netmasks ethers /etc/ethers bootparams /etc/bootparams protocols /etc/inet/protocols services /etc/inet/services networks /etc/inet/networks
mdns4: multicast DNS service discovery. It allows programs to publish and discover services and hosts running on a local network with no specific configuration. For example you can plug into a network and instantly find printers to print to, files to look at and people to talk to. mdns4_minimal is obviously a minimal subset of mdns4
dns: your normal DNS service
NOTFOUND=return: means that the search for an entry should stop if the search in the previous entry turned up nothing. Note that if the search failed due to some other reason (like no NIS server responding) then the search continues with the next entry.
From the bit of reading I've done it is suggested that mdns only be called after dns if dns fails. I dont see how mdns is going to benefit you if you only have one pc on the LAN. Then again i'm not clued up on mdns at all so i might be sprouting nonsense.
Ive changed mine to reflect as: hosts: files dns mdns4_minimal NOTFOUND=return mdns4
I'll see if this improves anything.
« billets précédents - page 2 de 5 - billets suivants »