Sep 24

Serveur de téléchargement en nodeJS

NodeJS

NodeJS

Je viens de réaliser ma première application NodeJS. Un serveur de téléchargement qui revoit les données depuis un site web. Le client est le console JavaScript de navigateur. Un traitement est fait pour déterminer les éléments à télécharger. Le code complet du client WebSocket n’est pas présenté ici pour des raison de confidentialité.

 

 

Le code du client

var wsDl = new WebSocket("ws://localhost:8001");
var url = "xxx";
var fileName = "yyy";
wsDl.send(JSON.stringify({cmd: 'download', 'title': fileName, url: url}));

Le code du serveur

var ws = require("nodejs-websocket");
var http = require('http');
var fs = require('fs');
var util = require('util');
 

function saveToFile(fileName, url)
{
	var file = fs.createWriteStream(fileName+'.m4a');
	var request = http.get(url, function(response) 
	{
  		response.pipe(file);
	});
}

var server = ws.createServer(function (conn) 
{
    conn.on("text", function (data) 
    {
    	data = eval('('+ data + ')');
    	var cmd = data.cmd;
        var title = data.title;
        var url = data.url;

        console.log('Prepare to download => ' + url);

        if(cmd == 'download')
        {
        	saveToFile(title, url);
        }
    });

    conn.on("version", function (str) 
    {
        conn.sendText("xxx - Downloader 0.0");
    });

}).listen(8001);

Aug 13

Jascal Scripting Engine

Jascal Scripting Engine (GitHub)

Jascal is an implementation of JAVA JSR 223 for the Pascal Language. The engine uses the Free-Pascal compiler for the JVM. It is tested on Windows and Linux. It implements the Compilable interface. The support for the Invokable interface is planned in a future. The Engine support passing ScriptEngine.ARGV to the context and bindings.

Unlinke the standard FPC for JVM, Jascal supports the write/writeln instructions, “ParamStr(i:integer) : String” function and has the “ParamCount : integer” variable. To achieve this result a slight transformation of the code is done before compilation. The following code is injected before compilation.

program {$program_name$};

        { %VERSION=1.1 }
        {$namespace com.darrylsite.jascal.fpc}

         {$mode objfpc}
         {$modeswitch unicodestrings}
         {$h+}

        uses
         jdk15, scriptingstream;

        type
          qprinttype = int64;

          var
                usedErrPutStream : JIWriter;
                programStream : OFRScriptingStreams;
                commandLine : OFRCommandLine;
                ParamCount : integer;
                {$binding_vars$}

        procedure initProgram(argv: Arr1JLString);
        begin
         programStream :=  OFRScriptingStreams.create(); 
         commandLine :=  OFRCommandLine.create(argv);
            ParamCount :=  commandLine.getParamCount();
        end;

        function ParamStr(i: integer): JLString;
        begin
            result := commandLine.getParamter(i);
         end;

        procedure setOutPut(outPut: JIWriter);
         Begin
         programStream.setWriter(outPut);
        end;

        procedure setInPut(inPut: JIReader);
        Begin
             programStream.setReader(inPut);
         end;

        procedure setErrPut(errPut: JIWriter);
        Begin
         usedErrPutStream := errPut;
         end;

Usage

To use Jascal, add the JAR file in your project classPath. An example of a JAVA code using Jascal is given bellow. The full code is available in the unit test.

   ScriptEngineManager scriptManager = new ScriptEngineManager();
    ScriptEngine jascal = scriptManager.getEngineByName("Jascal");

    jascal.getContext().setWriter(new OutputStreamWriter(System.out));
    //String[] argv = new String[]{"1458796"};
    //jascal.put(ScriptEngine.ARGV, argv);
    jascal.put("nombre", "1478523699852"); //Binding, it initializes a global variable declared in the pascal code
    jascal.put("nombreTxt", null); //binding for getting the result value

    Compilable CompilableEngine = (Compilable) jascal;
    CompiledScript scriptCompile = CompilableEngine.compile(getScriptFile());

    scriptCompile.eval();


    //jascal.getContext().getWriter().flush();

Sep 08

JMassRename : Renommer dynamiquement des fichiers avec du JS

JMassRename est un outil que j’ai développé pour le renommage en masse des fichiers dans un répertoire et ses sous répertoires. L’outil est destiné aux développeurs.

Il permet de renommer et/ou de faire des traitements sur les fichiers en utilisant du code JavaScript. Je vous ai fourni un exemple de code pour réorganiser des ebooks d’un répertoire et ses sous dossiers en fonctions de leurs noms.
Le projet est hébergé sur Google code : http://code.google.com/p/jmass-file-rename/

 

/*
* Scripting language : JavaScript
*@param fileName  : the file name
*@param ignore : if true, the file will not be processed
*@param file : The java file Object. It is null when you're in test mode
*/

importClass(java.io.File)

var rootFolder = "C:/Users/nabster/Desktop/test_rename"
var romanFolder = new java.io.File(rootFolder + "/roman")
var itEbookFolder = new java.io.File(rootFolder + "/it_ebook")

if(!romanFolder.exists())
     romanFolder.mkdirs();

if(!itEbookFolder.exists())
    itEbookFolder.mkdirs();

if(!file.isDirectory())
{
    ignore = true;
    if(file.getName().indexOf("roman___") == 0)
        file.renameTo(new File(romanFolder.getAbsolutePath() + "/"+file.getName()));
else
    if(file.getName().indexOf("it___") == 0)
        file.renameTo(new File(itEbookFolder.getAbsolutePath() + "/"+file.getName()))
}

Sep 07

Convertion d’une date Excel en unix timestamp

excel-phpExcel conserve interne les dates en comptant le nombre de jours passés depuis le premier (1) janvier 1900.

En développement, on utilise plus le timestamp ou encore UNIX timestamp qui lui est définit comme le nombre de secondes écroulé depuis le premier (1) Janvier 1970 UTC (Universal Time Coordinated).

Par exemple le 19 Juin 2011 sera représenté en Excel sous la forme 40713.

Une petite formule pour convertir les dates Excel en Unix timestamp serait :
unixTimestamp =  (ExcelDate – 25569) * 86400

où 25569 est le nombre de jours écroulés entre le 1 Janvier 1900 et le 1 Janvier 1970 UTC, et 86400 est le nombre de seconde que comprend une journée.

Le code JAVA qui permettra de faire automatiquement cette conversion serait :

public class ExcelToUnixTimestamp
{

  private static int _SEC_IN_DAY = 86400;
  private static int _DAY_DIFF = 25569;

  public static long ExcelToUnix(double date)
  {
    if(date <= _DAY_DIFF)
      return 0;

    return (long) ((date - _DAY_DIFF) * _SEC_IN_DAY);
  }

 public static double UnixToExcel(long timestamp)
  {
    return (timestamp / _SEC_IN_DAY) + _DAY_DIFF;
  }

}

Sep 07

Jeu de devin en PowerShell

windows powershell
Je vous presente aujourd’hui le premier bout de code que j’ai écrit en PowerShell.
Le code de code permet de jouer au jeu de devin.

 

 

 

 

 

#Guess game
function jeu
{
 param($max, $rep)
 $hidden = Get-Random $max
 $nb = -1

 Write-Host "*********** Guess Game ***********"
 Write-Host "Please find the hidden number"
 for($i=1; ($i -le $rep) -and ($nb -ne $hidden) ; $i++)
 {
  Write-Host "Atempt $i"
  $nb = Read-Host
  if($nb -gt $hidden)
  {
    Write-Host "#The number $nb is too big for my brain"
  }

  if($nb -lt $hidden)
  {
   Write-Host "#The number $nb is not big anough for my mounth"
  }
 }

 if($nb -eq $hidden)
 {
  Write-Host "Cool ! you got it !!! !!! !!! !! "
 }
 else
 {
  Write-Host "Not smart enough to find $hidden"
 }
  Write-Host "*****-***** By The Nabster, http://darrylsite.com ****-*****"
}

Sep 07

Accepter les certificats SSL non valides lors des requetes HTTPS

certificat sslJ’ai récemment été confronté à écrire une application qui échange des données avec applications qui utilise des certificats de sécurité parfois non valides. Après avoir passé quelques heures à faire des recherche et à écrire du code, je suis arrivé au bout de code présenté ci-dessous qui accepte touts les sites webs quelques soit leurs certificats.

 

public static URL getSslURL(String url) throws Exception
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]
{
new X509TrustManager()
{
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return null;
}

public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType)
{
}

public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType)
{
}
}
};

// Create empty HostnameVerifier
HostnameVerifier hv = new HostnameVerifier()
{
public boolean verify(String arg0, SSLSession arg1)
{
return true;
}
};

// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);

return new URL(url);
}

On peut alors l’utiliser comme suit :

URL page;

if (url.startsWith("https"))
{
page = getSslURL(url);
} else
{
page = new URL(url);
}

Sep 07

JAVA 7 – Lire et écrire plusieurs lignes dans un fichier texte avec NIO.2

Ecriture de plusieurs lignes dans un fichier texte

Un exemple de code d’écriture de plusieurs lignes dans un fichier texte à l’aides de nouveautés introduites part nio.2.

/**
* import java.nio.file.Paths;
* import java.nio.file.Path;
* import java.util.List;
* import java.util.ArrayList
* import java.nio.charset.Charset
*/

  Path helloPath = Paths.get("c:/naster/java7/nio2", "hello.txt");

  Charset charset = Charset.forName("UTF-8");
  List<String> lines = new ArrayList<>();

  lines.add("Hello World (en français - bonjour le monde -)");
  lines.add("sont les mots traditionnellement écrits ");
  lines.add("par un programme informatique simple dont ");
  lines.add("le but est de faire la démonstration rapide");
  lines.add("d'un langage de programmation");
  lines.add("\n");
  lines.add(" ldc \"Hello world!\" ");

  try
  {
    Files.write(helloPath, lines, charset, StandardOpenOption.APPEND);
  }
catch (IOException e)
{
  e.printStackTrace;
 }

Lecture de plusieurs lignes dans un fichier texte

Un exemple de code de lecture de plusieurs lignes dans un fichier texte à l’aides de nouveautés introduites part nio.2. Cette méthode n’est applicable que sur fichier de taille réduite. Pour de grand fichier, nous aurions droit à une Exception OutOfMemory

/**
* import java.nio.file.Paths;
* import java.nio.file.Path;
* import java.util.List;
* import java.nio.charset.Charset
*/

 Path helloPath = Paths.get("c:/naster/java7/nio2", "hello.txt");
 Charset charset = Charset.forName("UTF-8");

try
{
  List<String> lines = Files.readAllLines(helloPath, charset);

 for (String line : lines)
 {
   System.out.println(line);
 }
}
 catch (IOException e)
 {
   System.out.println(e);
 }

Sep 03

JAVA 7 : copie de fichier et repertoire

La copie des fichiers et repertoires avec NIO.2 est devenue des plus simples. Elle se fait avec la méthode statique Files.copy().

/**
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
*/
Path source = Paths.get("C:/java7", "source.txt");
Path destination = Paths.get("C:/java7/copy", source.getFileName().toString());
try
{
   Files.copy(source, destination);
}
catch (IOException e)
{
    e.printStackTrace();
}

La méthode Files.copy() a deux autres surcharges qui permettent de copier un fichier à partir / vers un InputStream ou un OutputStream.

public static long copy(InputStream in, Path target, CopyOption... options) throws IOException
public static long copy(Path source, OutputStream out) throws IOException

Les méthodes Files.copy() peuvent prendre une liste d’arguments provenant des énumérationsStandardCopyOption et LinkOption.

  • REPLACE_EXISTING
  • COPY_ATTRIBUTES
  • NOFOLLOW_LINKS
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;
import static java.nio.file.LinkOption.NOFOLLOW_LINKS;

Sep 07

Decompilation d’une application android

Une des faiblesse de faiblesse de JAVA est dû au fait qu’il est assez simple de décompiler les binaires produits.

Pour rappel, le code source JAVA est compilé dans un code intermédiaire appelé Byte-Code qui sera ensuite exécuter par la machine virtuelle JAVA. De même, Android, le code source d’un projet Android écrit en JAVA sera compiler dans un Byte-Code exécutable par la machine virtuelle Dalvik.

Pour la décompilation des programmes JAVA, il existe le logiciel JD-GUI qui en plus offre une interface graphique bien conviviale. JD-GUI permet de décompiler à la fois les fichiers *.JAR et les fichier *.CLASS seule. JD-GUI est un projet gratuit et est accessible à l’adresse : http://java.decompiler.free.fr/

Vu qu’ Android n’utilise pas la même machine virtuelle que JAVA, le chalenge pour pouvoir décompiler une application Android serait de traduire le binaire compilé pour Dalvik VM en binaire compréhensible par la machine virtuelle JAVA.

Pour ce faire, vous auriez besoin de deux outils bien complémentaire :

  1.  apktool : pour la décompilation des fichiers ressources -images, layout, …
  2. dex2jar : pour traduire le fichier *.APk – binaire pour Android- en fichier *JAR compréhensible par la machine virtuelle JAVA (JVM)

Une fois le fichier *.APK traduit en *.JAR vous pouvez utiliser JG-GUI pour accéder à tout le code source de l’application.

Sep 07

Singame disponible sur Google Code

Mon projet Singmè (si-nga-mè) est désormais disponible sur Google Code. Le projet est accéssible depuis le lien suivant : http://code.google.com/p/singame/

Singame est un centre de messagerie qui utilise un téléphone comme modem. Les téléphones compatibles sont les téléphones supportant les commandes AT, ainsi que les téléphones sous Android.

Le logiciel est encore en cours de développement. Une première version beta est prévu pour la fin du mois d’Août.

Singamè a été développé en JAVA et utilise la technologie JPA pour la persistance des donnés. La base de données utilisé est MySQL.

Singamè permet la réception et l’envoie de message groupé, la gestion de contacts et des groupes de contacts. Il aussi possible de configuré plusieurs modem.

Développé en JAVA, Singame sera disponible sur les plateforme Windows et Linux.