P3 A new story begins

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 3 février 2011

Liens utiles pour accéler le démarrage d'Ubuntu

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

Liste de plugins pur Hudson/Jenkins

Voici la liste de plugins que j'utilise avec Hudson

  1. Hudson Active Directory plugin
  2. Analysis Collector Plugin
  3. Static Code Analysis Plug-ins
  4. Backup Plugin
  5. Checkstyle Plugin
  6. ChuckNorris Plugin
  7. Hudson Continuous Integration game
  8. Dashboard View
  9. Hudson Dependency Analyzer Plugin
  10. Deploy Plugin
  11. Hudson disk-usage plugin
  12. DRY Plugin
  13. Hudson Email Extension Plugin
  14. Emotional Hudson plugin
  15. FindBugs Plugin
  16. FTP publisher plugin
  17. Green Balls
  18. Hudson JavaNCSS plugin
  19. Hudson Maven Release Plug-in Plug-in
  20. Hudson Mantis plugin
  21. Maven 2 Project Plugin
  22. Monitoring
  23. PMD Plugin
  24. Hudson Support Subscription Notification Plugin
  25. SCP plugin
  26. Hudson Sonar Plugin
  27. Hudson SSH Slaves plugin
  28. Subversion Plugin
  29. Task Scanner Plugin
  30. Translation Assistance Plugin
  31. Hudson Violations plugin
  32. Warnings Plugin

mardi 11 janvier 2011

Comment utiliser les archetypes de Flex Mojos dans Eclipse

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.

Add Flex Remote Catalog For Maven

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 :

New_Flex_Maven_Application_Module

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

Configuration Option Java pour Tomcat

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"

///

  1. -Xms64m
  2. -Xmx512m : application quelque peu gourmande en mémoire.
  3. -XX:PermSize=32m
  4. -XX:MaxPermSize=256m : Utilisation massive de spring-hibernate avec des proxies donc le perm gen est bien utilisé
  5. -XX:+CMSClassUnloadingEnabled : essaye de décharger les classes de l'espace permanent generation
  6. -Djava.awt.headless=true (gestion sans IHM pour permettre les impression des graphiques pe: pour lambdaprobe)
  7. -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
  8. -Dcom.sun.management.jmxremote : utilisation du débugger d'eclipse à distance

jeudi 23 décembre 2010

Fixer la vitesse du processeur par défaut sous Ubuntu (linux)

Pour fixer la vitesse par défaut de votre processeur voici la manipulation à faire (testé avec Ubuntu 10.10) :

  1. sudo apt-get install sysfsutils
  2. sudo nano /etc/sysfs.conf

Ajouter ceci

  1. devices/system/cpu/cpu0/cpufreq/scaling_governor = userspace
  2. devices/system/cpu/cpu0/cpufreq/scaling_setspeed = 2000000
  3. devices/system/cpu/cpu1/cpufreq/scaling_governor = userspace
  4. 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

  1. 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 :

  1. cpuinfo_cur_freq: la fréquence actuelle de votre proc
  2. cpuinfo_max_freq:la fréquence maximum
  3. cpuinfo_min_freq: la fréquence minimum
  4. scaling_available_frequencies: les fréquences disponibles
  5. scaling_available_governors: les gouverneurs disponibles
  6. scaling_cur_freq
  7. scaling_driver: le pilote du processeur utilisé
  8. scaling_governor: le gouverneur en action
  9. scaling_max_freq
  10. scaling_min_freq

mercredi 15 décembre 2010

De l'interêt de Sonar

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% !!

Sonar-evolution.png

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

Sonar_-_Overview.png

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

PHP 6 est dispo sur 1and1

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

About Logging !

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

  1. // Pour Log4J avec commons-logging
  2. private static final Log logger = LogFactory.getLog(MyClass.class);
  3.  
  4. // Pour logback avec slf4j
  5. 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.

  1. 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):

  1. <bean id="loggingAdvice" class="fr.webeo.rapidoo.aop.LoggingAdvice" />
  2.  
  3. <bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  4. <property name="advice" ref="loggingAdvice" />
  5. <property name="pattern" value="fr.webeo.rapidoo.services" />
  6. <property name="order" value="50" />
  7. </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

  1. public class LoggingAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {
  2.  
  3. /**
  4.   * Default Constructor.
  5.   */
  6. public LoggingAdvice() {
  7. // Nothing to do
  8. }
  9.  
  10. /**
  11.   * {@inheritDoc}
  12.   */
  13. @Override
  14. public void before(final Method method, final Object[] args, final Object target) throws Throwable {
  15. final Logger logger = LoggerFactory.getLogger(target.getClass());
  16. if (logger.isInfoEnabled()) {
  17. logger.info("Calling : " + method.getName() + " " + target.getClass().getName());
  18. }
  19. if (logger.isDebugEnabled()) {
  20. final StringBuilder sb = new StringBuilder();
  21. sb.append("Parameters : ");
  22. if (method.getParameterTypes().length == args.length) {
  23. for (int i = 0; i < args.length; i++) {
  24. sb.append("\r\nParam : ").append(method.getParameterTypes()[i]).append(" - ").append(args[i] == null ? "null" : args[i].toString());
  25. }
  26. }
  27. if (sb.length() > 1000) {
  28. logger.debug(sb.substring(0, 1000));
  29. } else {
  30. logger.debug(sb.toString());
  31. }
  32. }
  33. }
  34.  
  35. /**
  36.   * {@inheritDoc}
  37.   */
  38. @Override
  39. public void afterReturning(final Object returnValue, final Method method, final Object[] args, final Object target) throws Throwable {
  40. final Logger logger = LoggerFactory.getLogger(target.getClass());
  41.  
  42. if (logger.isInfoEnabled()) {
  43. logger.info("Returning : " + method.getName());
  44. }
  45. if (logger.isDebugEnabled() && returnValue != null) {
  46. if (returnValue instanceof List) {
  47. logger.debug("Return value is list of " + ((List<?>) returnValue).size() + " elements.");
  48. } else {
  49. logger.debug("Return Value = " + returnValue.toString());
  50. }
  51. }
  52. }
  53.  
  54. /**
  55.   * Call after an exception thrown.
  56.   *
  57.   * @param method the method called
  58.   * @param args the method arguments
  59.   * @param target the object who call the method
  60.   * @param exception the exception thrown
  61.   */
  62. public void afterThrowing(final Method method, final Object[] args, final Object target, final Throwable exception) {
  63. final Logger logger = LoggerFactory.getLogger(target.getClass());
  64. if (logger.isErrorEnabled()) {
  65. logger.error("Throwing : " + method.getName() + " \r\n=> " + exception.getMessage(), exception);
  66. }
  67. }
  68. }

Pour conclure il existe 3 possibilités pour logger des classes filles héritant d'une même classe abstraite :

  • Un logger par classe

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)

  • Déclaration du logger de la classe abstraite en protected non static

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

  • Déclaration des loggers via AOP :

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

De l'utilité des Expressions Régulières dans Eclipse

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 :

  1. ...
  2. field1, // Field1 comment
  3. ...

Or CheckStyle nous tape sur les doigts car il faut un élément de javadoc par champs

Donc ctrl+F

Find_Replace_With_Regex.png

en version texte pour faire un copier-coller

([a-zA-Z_]*)([,|;] // )([a-zA-Z_-éè' .\[\]#]*)
/** $3. */\r\n\t$1,

Ce qui nous donnera :

  1. ...
  2. /** Field1 comment. */
  3. field1,
  4. ...

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

Bouchon JNDI

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 :

  1. System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
  2.  
  3. Reference reference = new Reference("javax.sql.DataSource", "org.apache.commons.dbcp.BasicDataSourceFactory", null);
  4. reference.add(new StringRefAddr("driverClassName", "oracle.jdbc.OracleDriver")); //Le driver de la base utilisée
  5. reference.add(new StringRefAddr("url", "url_de_la_base"));
  6. reference.add(new StringRefAddr("username", "username"));
  7. reference.add(new StringRefAddr("password", "password"));
  8. 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 :

  • fscontext.jar
  • providerutil.jar
  • commons-dbcp-1.4.jar (pour la factory de Datasource)

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

Liens Hibernate

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

Liste des plugin Maven Indispensable pour le Reporting

Voici une liste intéressante de plugin maven utiles pour le reporting et la génération du site.

  1. <reporting>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-pmd-plugin</artifactId>
  6. <configuration>
  7. <targetJdk>1.5</targetJdk>
  8. </configuration>
  9. </plugin>
  10. <plugin>
  11. <groupId>org.apache.maven.plugins</groupId>
  12. <artifactId>maven-checkstyle-plugin</artifactId>
  13. </plugin>
  14. <plugin>
  15. <groupId>org.apache.maven.plugins</groupId>
  16. <artifactId>maven-plugin-plugin</artifactId>
  17. </plugin>
  18. <plugin>
  19. <groupId>org.apache.maven.plugins</groupId>
  20. <artifactId>maven-jxr-plugin</artifactId>
  21. </plugin>
  22. <plugin>
  23. <groupId>org.apache.maven.plugins</groupId>
  24. <artifactId>maven-javadoc-plugin</artifactId>
  25. </plugin>
  26. <plugin>
  27. <groupId>org.codehaus.mojo</groupId>
  28. <artifactId>taglist-maven-plugin</artifactId>
  29. </plugin>
  30. <plugin>
  31. <groupId>org.codehaus.mojo</groupId>
  32. <artifactId>changelog-maven-plugin</artifactId>
  33. </plugin>
  34. <plugin>
  35. <groupId>org.apache.maven.plugins</groupId>
  36. <artifactId>maven-project-info-reports-plugin</artifactId>
  37. <version>2.1.2</version>
  38. <reportSets>
  39. <reportSet>
  40. <reports>
  41. <report>summary</report>
  42. <report>project-team</report>
  43. <report>mailing-list</report>
  44. <report>cim</report>
  45. <report>issue-tracking</report>
  46. <report>license</report>
  47. <report>scm</report>
  48. </reports>
  49. </reportSet>
  50. </reportSets>
  51. </plugin>
  52. </plugins>
  53. </reporting>

mercredi 24 février 2010

Maven Site avec Hudson via SCP

Si vous déployer vos sites Maven via SCP comme dans cette exemple :

  1. <site>
  2. <id>Webeo_Sites</id>
  3. <name>Webeo Sites</name>
  4. <url>scp://development.webeo.fr/var/www/projects/rapidoo-${version}</url>
  5. </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

  1. /var/lib/hudson/tools/Maven_2.2.1/bin/mvn site-deploy -s /var/lib/hudson/.m2/settings.xml
  2.  
  3. [INFO] [site:deploy {execution: default-deploy}]
  4. The authenticity of host 'development.webeo.fr' can't be established.
  5. RSA key fingerprint is 6a:1d:86:8b:a0:7a:1c:23:20:df:7e:ff:bb:17:3f:5f.
  6. 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

Gestion des Map en EMF dans un ecore

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é :

Visualisation du fichier ecore avec gestion de map dans l'éditeur d'Eclipse

Et le code du fichier ecore pour plus d'exhaustivité...

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ecore:EPackage xmi:version="2.0"
  3. xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="fr">
  5. <eSubpackages name="webeo">
  6. <eSubpackages name="blog">
  7. <eClassifiers xsi:type="ecore:EClass" name="CarOwner">
  8. <eStructuralFeatures xsi:type="ecore:EReference" name="carMap" upperBound="-1"
  9. eType="#//webeo/blog/CarMapEntry" containment="true"/>
  10. </eClassifiers>
  11. <eClassifiers xsi:type="ecore:EClass" name="Car"/>
  12. <eClassifiers xsi:type="ecore:EClass" name="CarMapEntry" instanceClassName="java.util.Map$Entry">
  13. <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
  14. <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1"
  15. eType="#//webeo/blog/Car" containment="true"/>
  16. </eClassifiers>
  17. </eSubpackages>
  18. </eSubpackages>
  19. </ecore:EPackage>

Et pour terminer le fichier ecore :D

Fichier Ecore avec Gestion de Map

vendredi 8 janvier 2010

Dns

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:

  1. 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.

- page 2 de 5 -