vendredi 23 janvier 2015

Code VBA pour inserer un fichier de données dans un tableau excel

J'ai une feuille de calcul avec des tableaux croisés dynamique des des graphiques, et j'ai voulu automatiser l'insertion de données quotidienne.

Voici le code VBA que j'ai mis en place pour cela


Sub FichierTxtCopieSurFeuilleDeCalculs()
Dim Ligne As String, NoLigne As Long, NoCol As Integer, Indice As Integer
Dim Tableau, Chemin$, nomFich$, separateur
 Application.Volatile
    '*** ouverture "d"une" boite de dialogue ***
    'de laquelle on extrait :
    Chemin = "C:\chemin\sur\le\disque\"
    nomFich = "FICHIER.TXT" 'ou .csv
    '********************************
    'Ouverture du fichier
    Open Chemin & nomFich For Input As #1
 
    'Lecture
    While Not EOF(1)
        Input #1, Ligne
 
        'recherche du séparateur
        If InStr(Ligne, ";") <> 0 Then ' ";"
             separateur = ";"
        ElseIf InStr(Ligne, vbTab) <> 0 Then 'Tab
             separateur = vbTab
        ElseIf InStr(Ligne, ",") <> 0 Then ' ","
             separateur = ","
        ElseIf InStr(Ligne, " ") <> 0 Then ' espace
             separateur = " "
        End If
 
        'création d'un tableau des données de la ligne
        Tableau = Split(Ligne, separateur)
        NoLigne = 5
        Cells(NoLigne, 1).EntireRow.Insert
        'transfert des données dans une feuille Excel vierge
        For Indice = 0 To UBound(Tableau)
        If (NoCol = 12) Then
        NoCol = 1
        NoLigne = NoLigne + 1
        Cells(NoLigne + 1, 1).EntireRow.Insert
        Else
        NoCol = NoCol + 1
        End If
        If ((NoCol = 8) Or (NoCol = 12)) Then
        'Dans le 8éme et la 12éme colonne j'insere des nombres
             Cells(NoLigne, NoCol).Value = Val(RTrim(Tableau(Indice)))
        ElseIf (NoCol = 5) Then
        'Dans la 5éme colonne j'insere une date formaté
            Cells(NoLigne, NoCol).Value = Format(Tableau(Indice), "dd-mmm")
        ElseIf (NoCol = 6) Then
        'Dans la 6éme colonne j'insere une formule
        Cells(NoLigne, NoCol).NumberFormat = "General"
        Cells(NoLigne, NoCol).Formula = "=IF(B84=""PLEBIC"",""Boostées"",IF(B84=""FNAC  "",""Offres FNAC"",""Normales""))"
        
        Cells(NoLigne, NoCol).Calculate
         'Cells(NoLigne, NoCol).Value = Cells(NoLigne, NoCol).Value
         
        Else
        'Dans les autres colonnes j'insére du texte
             Cells(NoLigne, NoCol).Value = RTrim(Tableau(Indice))
        End If
        Next
    Wend
    Close #1
    
End Sub

mercredi 23 octobre 2013

Comment recupérer la date d'un enregistrement CQL ?

Vous serez surement un jour ou l'autre confronté au problème de récupération de la date d'enregistrement d'une donnée dans cassandra.

Vous savez tous que cassandra gére pour chaque enregistrement une date, ce qui lui permet de connaitre la dernière version de cette donnée au travers tous ces noeuds.

Afin de récupérer cette date en CQL, il suffit d'utiliser la fonction "writetime(#nom_du_champ)" dans la requête CQL.

exemple:

SELECT WRITETIME (title )
  FROM news
  WHERE  id_news = 8a172618-b121-4136-bb10-f665cfc469ac; 
 
 writetime(title )
------------------
 1353890622373000
 
N.B: J'ai eu quelques problème à récupérer en Java la date avec Cassandra-JDBC

article.setDate(new java.util.Date(result.getLong("writetime(id_news)")/1000));


Enjoy.

lundi 25 mars 2013

How to schedule a hive job with java?

Our project is running on Cassandra bundled in DataStax Entreprise plateforme.
To schedule a hive job with java and datastax entreprise, i used the scheduler embeded in Jboss 7 and Hive-JDBC.

First step in to includ the following libraries to the project

- ~/dse-3.0/resources/hive/lib/hive-jdbc-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/hive-metastore-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/hive-service-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/libfb303-0.7.0.jar
- ~/dse-3.0/resources/hadoop/hadoop-core-1.0.4.2.jar
- ~/dse-3.0/resources/hive/lib/hive-serde-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/commons-logging-1.0.4.jar
- ~/dse-3.0/resources/hive/lib/hive-exec-0.9.0.1.jar


Then start hive server:
dse-3.0/bin/dse hive --service hives


Then follow this example of Hive-JDBC to write my job:

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; import javax.ejb.Schedule; import javax.ejb.Stateless; import org.apache.log4j.Logger; @Stateless(name = "AutomaticSchedulerBean") public class HiveJob { private static Logger mLogger = Logger.getLogger(HiveJob.class); private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; @Schedule(dayOfWeek = "*", hour = "*", minute = "*/5", year = "*", persistent = false) public void execute() throws SQLException{ mLogger.info("Start HiveJob"); try { Class.forName(driverName); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", ""); Statement stmt = con.createStatement(); // regular hive query String sql = "select count(*) from universe where status = 'GO'"; System.out.println("Running: " + sql); ResultSet res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1)); } mLogger.info("HiveJob executed!"); } }

This Job is going to run every 5 minutes.

Enjoy :)

jeudi 21 mars 2013

Mettre en place les logs sous DataStax Entreprise

Datastax entreprise nous permet de stoker les logs de notre application dans cassandra.

Pour cela, On commence par activer le service sur le cluster en se rendant dans le repertoire contenant le script d'init:

\>cd /usr/share/dse-demos/log_search
\>./1-add-schema.sh


Dans le projet sous eclipse, il faut ajouter les librairies suivantes au projet:
Ajouter le fichier de configuration de log4j, dans l'arborescence du projet comme ceci:


Le contenu du fichier est le suivant:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

 <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss}] %5p %c : %m%n" />
  </layout>
 </appender>

 <appender name="Cassandra" class="com.datastax.logging.appender.CassandraAppender">
  <param name="hosts" value="localhost" />
  <param name="port" value="9160" />
  <param name="appName" value="price" />
  <param name="keyspaceName" value="Logging" />
  <param name="columnFamily" value="log_entries" />
  <param name="placementStrategy" value="org.apache.cassandra.locator.SimpleStrategy" />
  <param name="replicationFactor" value="1" />
  <param name="consistencyLevelWrite" value="ONE" />
  <param name="maxBufferedRows" value="256" />

  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss}] %5p %c{6}: %m%n" />
  </layout>
 </appender>

 <logger name="it.example">
  <param name="additivity" value="false" />
  <level value="debug" />
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="Cassandra" />
 </logger>

 <root>
  <level value="error" />
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="Cassandra" />
 </root>
</log4j:configuration>

Dans le cas ou vous utilisez un serveur d'application JBoss, il faut dire à JBoss de ne pas utiliser sont propre module log4j. Pour cela, on ajoute un fichier d'exclusion dans l'arborescence projet comme ceci:


Le fichier contient le code suivant:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
 <deployment>
  <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
  <exclusions>
   <module name="org.apache.log4j" />
  </exclusions>
 </deployment>
</jboss-deployment-structure>

Ensuite il ne reste plus qu'a inserer des logs aux endroits stratégique du code de la manière suivante:

public class Dao {
 private static Logger mLogger = Logger.getLogger(Dao.class);
 private static Dao dao = null;

 public static Dao getInstance() {
  if (Dao.dao == null)
   Dao.dao = new Dao();
  return Dao.dao;
 }
...
public void insertImage(String imageUrl, byte[] image) {
  mLogger.debug("Insertion d'une image: " + imageUrl);
  Connection con = getConnection();
  try {
...

Enfin, on peux aller consulter les logs grace à l'interface de consultation mise en place dans le DSE:

http://localhost:8983/demos/log_search/


(Pour que l'interface fonctionne, il faut suivre les instructions suivantes: http://www.datastax.com/docs/datastax_enterprise3.0/solutions/log4j_logging )

Enjoy :)

mercredi 20 mars 2013

Comment ajouter du code informatique dans un blog ?

Tous les blogueur le savent, il est difficile de pouvoir mettre en forme du code informatique dans leurs articles. Pour ma part je viens d'essayer avec succès une solution très robuste: SyntaxHighlighter.

Cela se fait en deux fois:
  • Il faut tout d'abord faire appel aux librairies javascript. Cela se fait en mettant le code suivant dans la page du blog:
<link href='http://alexgorbatchev.com/pub/sh/2.1.364/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/2.1.364/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shCore.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCpp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCSharp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCss.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJava.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJScript.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPhp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPython.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushRuby.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushSql.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushVb.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushXml.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPerl.js' type='text/javascript'></script> 
<script language='javascript'> 
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.1.364/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>


  • Il faut ensuite entourer le code informatique avec les balises suivante:
<pre class="brush: XXX">
Mettre le code informatique ici...
</pre>

Il faut remplacer les XXX par le nom du langage que vous souhaitez présenter. La liste des langages se trouve ici.

Attention: Pour que tout cela marche, il faut remplacer les caractères '<' et '>' par leurs code html, à savoir '&lt;' et '&gt;'.

Enjoy :)


lundi 27 août 2012

Comment faire des virtual-host avec JBoss AS 7?

Le but de ce billet et de montrer comment faire pour configurer JBoss AS 7 pour qu'il fasse tourner plusieurs applications répondant à des nom d’hôte différents.

Nous  allons prendre pour l'exemple deux applications: HelloWorld.war et ByeByeWorld.war.
Et nous voulons que la première réponde au nom d'hote "hello.com" et que la seconde réponde à "byebye.net".

Dans la première application, nous ajoutons le repertoire "~/WebContent/WEB-INF" le fichier "jboss-web.xml" avec le contenu suivant:



<jboss-web>
    <context-root>/</context-root>
    <virtual-host>hello.com</virtual-host>
</jboss-web>

On fait la même chose pour le second projet.

On dispose les deux "war" dans le repertoire "~/jboss-as-7.1.1.Final/standalone/deployments".

On se rend ensuite dans la console du JBoss onglet "Profile"

On se rend ensuite dans la rubrique: Web > Servlet/HTTP > Virtual Servers:


On clique ensuite sur le bouton "Add" et on renseigne les données comme suit:


On sauvegarde et on refait la meme opération pour le second domaine.
On redemarre le JBoss pour qu'il prenne en compte ces changements et on test.

Enjoy.

mercredi 22 août 2012

Comment configurer un HAProxy pour rediriger les flux selon le Host ?

Pour répondre à la problématique de faire répondre un JBoss et un Apache sur le même port 80, j'ai utilisé un proxy.
Le proxy écoute sur le port 80 et selon le paterne de l'URL, il route le flux vers le port 8000 d'apache ou le port 8080 de JBoss.
Le proxy que j'ai utilisé, est HAProxy. (un produit francais maintenu par Willy TARREAU).

Sous debian, j'ai installé le produit:
$apt-get install haproxy

Je me suis rendu dans le repertoire:
/etc/haproxy

J'ai édité le fichier haproxy.cfg et j'ai ajouté la configuration suivante:


frontend http
        bind 0.0.0.0:80
        default_backend jboss
        # NAT static host names and static paths in other hostnames to a different backend
        acl host_static hdr_beg(host) -i static.
        acl url_static  path_beg         /static
        use_backend apache if host_static or url_static

backend jboss
        balance roundrobin
        server  qa1 127.0.0.1:8080
        #server  qa2 10.177.1.45:80

backend apache
        balance roundrobin
        server  media1 127.0.0.1:8000

Enjoy.