Version mobile du site

Posté par seiyar81 le 6 avril 2014 | Laisser un commentaire (0)

Une news rapide pour informer qu’une version mobile du site est maintenant disponible pour tous ceux qui y accèdent via leur téléphone ou tablette (et cela représente de plus en plus de monde par rapport aux utilisateurs PC classiques).

Et en raison du spam qui continue d’augmenter, j’ai été forcé de rajouter un Captcha dans le formulaire de commentaire, bien que je trouve que cela gêne plus les utilisateurs “normaux” que les spammeurs …

Très bientôt de nouveaux articles !

Catégorie: Yriase | Laisser un commentaire (0)

Java : créer une archive Zip en mémoire avec ZipOutputStream

Posté par seiyar81 le 3 avril 2014 | Laisser un commentaire (0)

Une petite class utilitaire pour générer des archives Zip en mémoire, sans rien écrire sur le disque, le tout aussi bien à partir de fichiers physiques ou de texte brut.

package fr.yriase.tools;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.ServletOutputStream;

public class ZipFileWriter {

  /**
  * Flux de l'archive zip
  */
  private ZipOutputStream zos;
  
  /**
  * Constructor: creation d'une nouvelle archive directement dans le stream passé en paramètre
  * @param OutputStream out
  * @throws FileNotFoundException
  */
  public ZipFileWriter(OutputStream out) throws FileNotFoundException {
  	this.zos = new ZipOutputStream(out);
  }
  
  public ZipOutputStream getOutputStream()
  {
  	return this.zos;
  }
  
  /**
  * Ajouter un fichier depuis le disque dur au zip
  * @param String fileName
  * @throws FileNotFoundException
  * @throws IOException
  */
  public void addFile(String fileName) throws FileNotFoundException, IOException {
    FileInputStream fis = new FileInputStream(fileName);
    int size = 0;
    byte[] buffer = new byte[1024];
    
    //Ajouter une entree à l'archive zip
    File file = new File(fileName);
    ZipEntry zipEntry = new ZipEntry(file.getName());
    this.zos.putNextEntry(zipEntry);
    
    //copier et compresser les données
    while ((size = fis.read(buffer, 0, buffer.length)) > 0) {
    	this.zos.write(buffer, 0, size);
  	}
  
  	this.zos.closeEntry();
  	fis.close();
  }
  
  /**
  * Ajouter un fichier depuis un array de bytes au zip
	* @param 
  * @param fileName
  * @throws IOException
  */
  public void addFile(byte[] bytes, String fileName) throws IOException {
    //Ajouter une entree à l'archive zip
    ZipEntry zipEntry = new ZipEntry(fileName);
    this.zos.putNextEntry(zipEntry);
    
    //Copier et compresser les données
    this.zos.write(bytes, 0, bytes.length);
    
    this.zos.closeEntry();
  }
  
  /**
  * Fermer le fichier zip
  * @throws IOException
  */
  public void close() throws IOException {
  	this.zos.finish();
  	this.zos.close();
  }
}

A utiliser comme ceci dans une action Struts par exemple :

public class DownloadZipAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	
		ServletOutputStream out = response.getOutputStream();

		response.setHeader("Content-Type","application/zip");
		response.setHeader("Content-Disposition", "attachment; filename=\"test.zip\"");

		ZipFileWriter zip = new ZipFileWriter(out);

		zip.addFile("<?xml version=\"1.0\" encoding=\"UTF-8\"?><test>var1</test>", "test.xml");
		zip.addFile("C:/test.xml");
		
		zip.close();

	}

}

A garder sous le coude, ça peut toujours servir.

Catégorie: Développement Web, Java | Laisser un commentaire (0)

Prestashop Advanced Sitemap: v1.5 et sitemaps multiples

Posté par seiyar81 le 26 février 2014 | Laisser un commentaire (16)

Une petite news rapide pour informer de la nouvelle version du module qui passe en 1.5 avec au menu une fonctionnalité demandée depuis quelques temps :

  • Génération de sitemaps multiples
  • Compression gzip des sitemaps générés
  • Sauvegarde des paramètres sans regénérer le sitemap
  • Stabilité du code

Cette fonctionnalité permet d’éviter un refus du sitemap par Google si le nombre d’URLs dépasse 50 000 ou si la taille est supérieure à 50 Mo.
Le module fonctionne maintenant ainsi :

  • vous définissez une limite à ne pas dépasser par sitemap (10 000 par défaut, car il faut tenir compte des images)
  • une fois cette limite atteinte lors de la génération, le module sauvegarde un premier fichier et passe au second
  • et ainsi de suite jusqu’à avoir traité toutes les URLs
  • une fois la génération terminée, le module génère un Sitemap Index qui regroupe tous les sitemaps générés et le transmet aux moteurs de recherche
  • si la limite définie n’est pas atteinte, un fichier sitemap simple est généré.

Vous pouvez ensuite choisir de compresser ou non tous les fichiers générés.

La prochaine étape sera maintenant de proposer une génération par langage !

Tout ça se récupère sur GitHub.


MAJ v1.5.1 : version mineure pour corriger 2 petits bugs
- Ajout forcé d’un ‘/’ à la fin des URLs personnalisées (si non présent) pour éviter les URLs malformées
- Correction de la génération du sitemap XML pour la validation XSD

La prochaine version vera l’ajout des fournisseurs/marques et éventuellement la sélection du type d’image à ajouter et/ou la possibilité de ne pas les ajouter au sitemap.

Catégorie: Développement Web, Internet, PHP | Laisser un commentaire (16)

L’offre VyprVPN s’enrichie avec Chameleon

Posté par seiyar81 le 4 février 2014 | Commentaires fermés
Vyprvpn

Comme vous le savez probablement déjà l’équipe dérrière Giganews propose une solution de VPN, qui est d’ailleurs offerte avec les offres Diamond, appellée VyprVPN.

Comparée aux autres solutions payantes du marché, VyprVPN offre 41 destinations réparties sur 4 continents (Europe, Asie, Océanie, Amérique du Nord), des applicaitons mobiles ainsi que plus de 700 serveurs eux aussi répartis sur les 4 continents et 700 000 adresses IP.

De quoi satisfaire les besoins de tous et d’offrir une expérience Web sécurisée.

Mais l’équipe va aujourd’hui plus loin et vient d’ajouter à ses offres Pro et Premier un nouveau protocole (en plus de ceux déjà proposés : PPTP, L2TP/IPSec et OpenVPN) : Chameleon.

Ce protocole a pour particularité de masquer le traffic afin de ne pas être identifié comme étant du traffic VPN (par un système de DPI par exemple) le tout en 256bits.
A quoi cela sert ?
Et bien tout simplement à contourner la censure et à s’ouvrir les portes d’un Web sans frontières ni blocage tout ça sans contrainte de vitesse ou de qualité de connexion.

Pour l’avoir personnellement testé je n’ai en effet pas noté de perte de vitesse entre Chameleon et OpenVPN.

Le protocole est pour l’instant disponible sur Windows, Mac OS X, Linux et Android et est disponible sur les 41 locations proposées.

Voici d’ailleurs deux offres intéressantes si vous souhaitez souscrire à une offre VyprVPN :

- [ -10% ] tous les mois
- [ -50% ] sur un mois d’abonnement (idéal pour tester la solution à moindre coût)

A tester d’urgence si vous êtes justement victime de ce type de blocage ou bien si vous souhaitez dissimuler le fait que vous surfez derrière un VPN.

Catégorie: Geek, Internet | Commentaires fermés

Développer en ligne avec Koding

Posté par seiyar81 le 30 janvier 2014 | Laisser un commentaire (0)
Koding

Une petite news rapide pour préciser que le site Koding offre à tout nouvel inscrit un espace de 4Go pour développer ses applications en ligne (dans la limite de 100 To pour tout le monde).

Pour information Koding est un service qui offre une VM accessible via une interface Web et avec tout ce qui va avec : terminal, explorateur de fichiers, applications etc …

Idéal lorsqu’on travaille sur plusieurs machines en même temps ou que l’on souhaite tester un bout de code rapidement.

Plus intéressant encore, Koding permet de travailler en collaboration avec d’autres utilisateurs ! Voir la vidéo ci-dessous :

Un outil à tester d’urgence car le tout est plutôt fluide et simple à utiliser !

Catégorie: Développement Web, Geek, Internet | Laisser un commentaire (0)

jQuery UI DatePicker : désactiver certains jours de la semaine

Posté par seiyar81 le 28 janvier 2014 | Laisser un commentaire (3)
jQuery UI DatePicker

jQuery UI propose bon nombre de widgets très utiles lorsqu’on développe des applications Web dynamiques.
Parmis ces derniers le DatePicker, ou calendrier, qui propose plusieurs options de configuration très précises.

Prenons par exemple le cas suivant : le client pour qui vous développez une application de réservation de restaurants vous informe que tous les réservations ne sont pas possibles les lundis et jeudis.

Et bien pas de problèmes, la fonction beforeShowDay permet de pré-filtrer chaque date et de définir si elle est sélectionnable ou pas.
Ce qui donne dans notre cas :


	jQuery(document).ready(function() {
		jQuery("#calendar").datepicker({
			beforeShowDay: function (date) {
				if (date.getDay() == 1 || date.getDay() == 4) { // La semaine commence à 0 = Dimanche
					return [false, ''];
				} else {
					return [true, ''];
				}
			}
		});
	});

Et voilà c’est tout simple.

On peut également utiliser la même méthode pour supprimer certaines semaines ou mois de l’année (vacances par exemple) :


	jQuery(document).ready(function() {
		jQuery("#calendar").datepicker({
			beforeShowDay: function (date) {
				if (date.getMonth() == 6 || date.getMonth() == 7) { // Mois Juillet et Août
					return [false, ''];
				} else {
					return [true, ''];
				}
			}
		});
	});

Si vous souhaitez par contre mettre une date minimum, utilisez plutôt l’option minDate :


	jQuery(document).ready(function() {
		jQuery("#calendar").datepicker({
			minDate: new Date(2014, 1 - 1, 1)
		});
	});

A vos claviers !

Catégorie: Développement Web, Javascript | Laisser un commentaire (3)

Java : sérialisation personnalisée de ses objets en JSON avec Flexjson

Posté par seiyar81 le 16 janvier 2014 | Laisser un commentaire (0)
JSON - Flexjson

Si vous travaillez sur des applis Web et Java et que vous vous retrouvez à devoir sérialiser vos données en JSON, il y a de fortes chances pour que vous utilisiez la bibliothèque Flexjson.

Les fonctionnalités de sérialisation sont puissantes et permettent par exemple de sériliaser un objet en profondeur.

Un exemple plutôt simple :


public class Yriase {
	
	private String name;

	public Yriase {
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


public static void main(String[] args) {

	Yriase y = new Yriase();
	y.setName( "yriase" );

	System.out.println( new JSONSerializer().exclude("*.class").serialize(yriase) );

}

Devrait vous renvoyer la chaîne suivante :

{
	name: "yriase"
}

Imaginons maintenant un cas un peu plus complexe. Vous avez créé une classe, et vous vous attendez à ce que les objets soient formattés d’une façon bien définie.
Pas de chance vous tombez dans le cas où le formattage par défaut de Flexjson ne vous convient pas.

Aucun problème, la bibliothèque vous offre la possibilité de définir vos propres Transformer pour vos données.

Prenons la classe template suivante :


public class Pair<String, Integer> {
	private String key;
	private Integer value;
    
	public Pair() {
	}
    
	public Pair(String k, Integer v) {
		this.key = k;
		this.value = v;
	}
    
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public Integer getValue() {
		return value;
	}
	public void setValue(Integer value) {
		this.value = value;
	}
}

Le formattage par défaut donnera ceci :

{
	key: "keyname",
	value: 10
}

Or on préfèrerait avoir le formattage suivant :

[ "keyname", 10 ]

Et bien il suffit d’implémenter une classe qui étends AbstractTransformer.
Voici donc la solution au problème :


public class PairTransformer extends AbstractTransformer {
	
	@Override
	public void transform(Object object) {
		Pair<String, Integer> p = (Pair<String, Integer>) object;
		
		getContext().writeOpenArray();
		
		getContext().writeQuoted( p.getKey());
		
		getContext().writeComma();
		
		getContext().write( String.valueOf(p.getValue()) );
		
		getContext().writeCloseArray();
	}
	
}

Et pour terminer il nous faut précisier lors de la sérialisation que l’on a un Transformer customisé :


JSONSerializer serializer = new JSONSerializer();
serializer.transform(new PairTransformer(), 	new Pair<String,Integer>().getClass());

Le tour est joué !

Catégorie: Développement Web, Java | Laisser un commentaire (0)

Remplir un formulaire avec jQuery

Posté par seiyar81 le 7 janvier 2014 | Laisser un commentaire (0)
jQuery Populate

Lorsque vous developpez une application Web, disons en PHP par exemple et que vous devez assigner vous-même les valeurs aux champs d’un formulaire, le mélange HTML/PHP peut vite s’avérer indigeste.

Si vous disposez de données JSON, ou de la possibilité de formater des données dans ce format, pour remplir votre formulaire, alors le plugin jQuery Populate devrait répondre à tous vos besoins.

Imaginons le formulaire HTML suivant :

	

Vous récupérez un jeu de données JSON via une requête AJAX ou bien directement formaté dans la page du type :

  var data = {

		name: "Yriase",

		type: ["0","2"],

		valider: false,

		comment: "Commentaire plus long"

	}

Grâce à Populate vous n’avez plus qu’à réaliser l’appel suivant :


	$('form["myform"]').populate(data);

Et le tour est joué !

Catégorie: Développement Web, Javascript | Laisser un commentaire (0)

Du nouveau à venir dans les offres de Giganews

Posté par seiyar81 le 17 novembre 2013 | Laisser un commentaire (0)
728x90a

Giganews a modifié ses offres Jeudi et pour le bien de tous puisque les tarifs sont en baisse !

Les tarifs des offres Diamond et Platinium baissent en effet de 5$ ce qui nous amènent à 20$ pour l’offre Platinium et 30$ pour l’offre Diamond. Les 3 premiers mois de cette dernière restant à -50% soit 15$.

Les deux offres procurent un accès illimité aux newsgroup avec une rétention binaire qui atteint aujourd’hui 1930 jours, le tout chiffré en SSL 256bits.
Les offres divergent ensuite avec les services ajoutés :

Platinium Diamond
20 connections 50 connections
5 Go de stockage Dump Truck 30 Go de stockage Dump Truck
VyprVPN Basic :
1 connection, PPTP
VyprVPN Pro :
2 connections, PPTP, L2TP/IPsec, OpenVPN, NAT Firewall

Sachez enfin que Mimo, le logiciel d’accès aux Newsgroup, est maintenant inclus avec toutes les offres.

Rendez-vous dans 70 jours donc pour fêter les 2000 jours de rétention binaire !

Catégorie: Geek, Internet, Newsgroup | Laisser un commentaire (0)

Initialiser une std::map avec C++11

Posté par seiyar81 le 17 novembre 2013 | Laisser un commentaire (0)
C++11

Une petite astuce, si l’on peut appeler ça comme ça, sur l’utilisation des maps en C++11. Cette nouvelle version du langage a en effet introduit les initializer_list et le principe de l’uniform initialization.
Je ne détaillerai pas plus en détails les méchanismes ni les possibilités apportées par ces fonctionnaliés mais je vous conseille de vous y intéresser dans un premier temps sur Wikipédia.

Imaginons que vous disposez d’une map à initialiser sur plusieurs niveaux, voilà ce que vous pouvez maintenant faire avec les nouveaux principes évoqués ci dessus :

std::map<int, std::map<int, int>> my_map = {
    {1, 
			{
				{2, 3}
			}
		}
};

Vous gagnez ainsi de nombreuses lignes à écrire et sans y perdre en visibilité.

Catégorie: C++ | Laisser un commentaire (0)