vendredi 8 juillet 2011

Mettre en place plusieurs applications sous CherryPy

Avec CherryPy 3.X, il est possible d'associer plusieurs applications à un seul site. Nous allons voir comment mettre en place 3 applications basiques (ayant chacune son propre fichier de configuration) et les associer à une instance CherryPy (ayant lui aussi son propre fichier de configuration).

Les instructions que je donne ci-dessous se basent sur un environnement Windows. Mais très peu de choses varient pour Linux (ce qui changent, c'est la façon d'installer Python et CherryPy ainsi que les répertoires de Python et CherryPy).

1 - Installation de Python et CherryPy
  • installer Python 3.X : l'installer dans C:\Python3X
  • installer CherryPy 3.X : il s'installe dans C:\Python3X\Lib\site-packages\cherrypy

2 - Création d'une application
  • dans le répertoire de CherryPy, créer le répertoire app1
  • dans ce répertoire , créer les fichiers :
__init__.py

<fichier vide
>

appli1.conf (le contenu de ce fichier n'est qu'un exemple)

[Databases]

driver: "postgres"
host: "localhost"
port: 5432

appli1.py 

import cherrypy
class App1:    
   def index(self):        
      return "Hello world from app1 !"    
   index.exposed = True 

3 - Création d'une deuxième application

répéter les manips indiquées dans le chapitre "Creation d'une application", en remplacant "1" par "2" ("appli1.py"->"appli2.py" , "class App1"->"class App2", etc)


4 - Création d'une troisième application
 
répéter les manips indiquées dans le chapitre "Creation d'une application", en remplacant "1" par "3" ("appli1.py"->"appli3.py" , "class App1"->"class App3", etc)


5 - Création du script de démarrage du site
 
à la racine de CherryPy (dans notre cas il s'agit de C:\Python3X\Lib\site-packages\cherrypy), créer le fichier :
startup.py 

import cherrypy
import appli1.appli1
import appli2.appli2
import appli3.appli3

def initApp( path, confFileName=None, app=None):    
   appliConf = os.path.join(os.path.dirname(__file__), confFileName)    
   cherrypy.tree.mount(app, path, config=appliConf)

if __name__ == '__main__':    
   import os.path       
   #initialisation du fichier de configuration du site :    
   globalconf = os.path.join(os.path.dirname(__file__), 'global.conf')    
   cherrypy.config.update(globalconf)
   #initialisation des fichiers de configuration des appli1, 2 et 3 :    
   initApp('/1', 'appli1/appli1.conf',appli1.appli1.App1());    
   initApp('/2', 'appli2/appli2.conf',appli2.appli2.App2());    
   initApp('/3', 'appli3/appli3.conf',appli3.appli3.App3());        
   cherrypy.engine.start()    
   cherrypy.engine.block()


6 - Création du fichier de configuration du site
 
à la racine de cherrypy (dans notre cas il s'agit de C:\Python3X\Lib\site-packages\cherrypy), créer le fichier :
global.conf 
[global]server.socket_host = "127.0.0.1"
server.socket_port = 8088server.thread_pool = 10

7 - Lancement de CherryPy

  • taper la commande : python startup.py

  • lancer un navigateur et aller à : http://127.0.0.1:8088/1/
    =>"Hello world from app1 !" s'affiche :o)

  • lancer un navigateur et aller à : http://127.0.0.1:8088/2/
    =>"Hello world from app2 !" s'affiche :o)

  • lancer un navigateur et aller à : http://127.0.0.1:8088/3/
    =>"Hello world from app3 !" s'affiche :o)

 

mercredi 15 juin 2011

leparisien.fr : site en japonais => site hacké ?

Waouuuuuuu, quand on tape leparisien.fr, superbe page blanche avec comme message :

無効なURLです。ドメイン設定の反映待ちか、存在しないアドレスです。
再度ご確認のうえアクセスをお試しください


Configuration d'une application Java/Spring/Hibernate pour utiliser JavaMelody

Ceci est un petit résumé...
  • Monitoring SQL, sans Datasource :
- modifier le driver :
hibernate.connection.driver_class : net.bull.javamelody.JdbcDriver
hibernate.connection.driver : oracle.jdbc.driver.OracleDriver
  • Monitoring des Services (les @Service) :
- rajouter l'interface Monitored dans le package com.toto

- rajouter "implements Monitored" sur les classes des services que l'on souhaite monitorer

- rajouter dans applicationContext.xml :

<bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
    <property name="pointcut">
            <bean class="net.bull.javamelody.MonitoredWithInterfacePointcut">
                 <property name="interfaceName" value="com.toto.Monitored" />
            </bean>
        </property>
</bean>



PS : on peut aussi le faire avec @net.bull.javamelody.MonitoredWithSpring à la place de l'interface... 
pour plus d'infos : doc de JavaMelody


  • Configuration diverse:
- rajouter dans web.xml :

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:net/bull/javamelody/monitoring-spring.xml
            classpath:applicationContext*.xml
        </param-value>
</context-param>

<filter>
         <filter-name>monitoring</filter-name>
         <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
</filter>
<filter-mapping>
         <filter-name>monitoring</filter-name>
         <url-pattern>/monitoring</url-pattern>
</filter-mapping>
 
<listener>
         <listener-class>net.bull.javamelody.SessionListener</listener-class>
</listener>


- rajouter dans pom.xml :

<dependency>
            <groupId>net.bull</groupId>
            <artifactId>javamelody</artifactId>
            <version>1.29.0</version>
</dependency>
<dependency>
            <groupId>org</groupId>
            <artifactId>jrobin</artifactId>
            <version>1.5.9.1</version>
</dependency>  



  • Si jamais vous avez un message du genre "dépendance cyclique" (en gros un service A fait référence à un service B qui fait référence au A) :
- créer la classe AllowRawInjectionDespiteWrappingXMLWebApplicationContext :

package com.toto.utils.spring;

import java.io.IOException;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.web.context.support.XmlWebApplicationContext;

public class AllowRawInjectionDespiteWrappingXMLWebApplicationContext extends XmlWebApplicationContext {

  @Override
  protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
    beanFactory.setAllowRawInjectionDespiteWrapping(true);
    super.loadBeanDefinitions(beanFactory);
  }
}


- rajouter dans web.xml :
<context-param>
        <param-name>contextClass</param-name>
        <param-value>com.toto.utils.spring.AllowRawInjectionDespiteWrappingXMLWebApplicationContext</param-value>
    </context-param>


    

mardi 7 juin 2011

Affiches Hadopi : "future auteure"

Oh miracle ! Je viens d'apprendre (merci la news PC INpact) qu'Hadopi va démarrer des campagnes de presse/télé/radio.

En lisant le texte sur les affiches Hadopi pour la presse je remarque une chose étrange : le terme "future auteure". Mhhhhhhhhhh gros doute.... Moué, je me dis qu'Hadopi (ou plutôt son agence de com' Havas ???) n'a quand même pas fait une si grosse boulette...

Allons sur Larousse : "auteur" existe (nom masculin) mais pas "auteure"... 
Allons sur le dictionnaire de TV5 mmmmhhhhh idem : "auteure" n'existe pas...

Très très curieux...

lundi 30 mai 2011

Serialiser en Python (et l'inverse)

Pour transformer un objet Python en bytes (et inversement), il existe le module pickle, qui permet :

- de serialiser : myBytes=pickle.dumps(myObject)
- de deserialiser : myObject=pickle.loads(myBytes)

Cela fonctionne avec Python 2 et 3


PS : il y a aussi marshal pour les types "basiques", cf http://python.developpez.com/faq/?page=Objet#ObjetSave

jeudi 14 avril 2011

Supprimer Orange Messenger et Orange Maps du Blackberry

- Aller dans Options > Options avancées > Annuaire de services
- Aller sur la ligne "Orange IM"
- Cliquer sur la touche avec le logo Blackberry
- Choisir "Supprimer"
- Aller sur la ligne "Orange Maps"
- Cliquer sur la touche avec le logo Blackberry
- Choisir "Supprimer"

N'hésitez pas à me laisser un petit commentaire et un +1 si vous avez trouvé cette astuce utile. Merci :o)

jeudi 7 avril 2011

Lister les contraintes sous Oracle

Lister les contraintes de l'utilisateur en cours :
SELECT count(*)  FROM USER_CONSTRAINTS

Lister les contraintes d'un autre utilisateur :
SELECT count(*)  FROM ALL_CONSTRAINTS WHERE OWNER='<THE_USER>';

Connaitre la version d'Oracle via SQL

select * from v$version;

select * from product_component_version;

Categories