Faire une requête http en telnet avec Putty

Pour faire une requête GET en telnet avec PUTTY (utile pour vérfier les retours serveurs sans interprétation du Brower):
- Host Name ou IP: le nom du serveur cible
- Port: le port d’écoute du serveur Web (généralement 80)
- Connection Type: Raw
- Close window on exit: Never (sinon, le retour ne sera pas affiché).
Une fois la connexion ouverte, taper la requête. Par exemple:

1
GET / HTTP/1.0

Puis 2 fois “entrée”.
Pour faire la même chose en https, utiliser openssl (téléchargeable ici : http://www.slproweb.com/products/Win32OpenSSL.html)
openssl s_client -connect www.somesite:443
ensuite:

1
GET /index.html HTTP/1.1
{lang: 'fr'}

Comparer des fichiers distants en ligne de commande

Il est souvent utile de faire un diff entre deux fichiers sur un serveur.  C’est là que la commande vimdiff est magique ! (equivalent de vim -d )

vimdiff file1 file2

vous donnera l’affichage suivant :

vimdiff 2 colonnes

vimdiff 2 colonnes

Encore mieux : vous pouvez comparer n fichiers (avec un grand écran c’est plus facile)

vimdiff file1 file2 file3
vimdiff 3 colonnes

vimdiff 3 colonnes

 

Quelques petites options a connaitre :

  • Diviser en horizontal plutôt qu’en vertical vimdiff -o  file1 file2 file 3
  • Changer de buffer : ctrl+w ctrl+w  (oui : ctrl + w deux fois)

 

et le fin du fin, comparer des fichiers distants grace à ssh :

vimdiff scp://login@machine1//path/to/file.txt scp://login@machine2//path/to/file.txt

Pour arriver a trouver une différence de configuration entre deux serveurs, c’est très utile !

{lang: 'fr'}

Limitations des bases de données Blackberry

Avec l’OS 5, RIM a intégré les bases SQLite dans les Blackberry. Avant de commencer à utiliser celles-ci, il peut être utile de savoir ses limites. Cet article expose diverses informations utiles.

Versions de SQLite utilisées:

  • OS 5 utilise la version 3.6.16
  • OS 6 utilise la version 3.6.21

INSERT:
Toute insertion/update de donnée dans un BLOB est limité à 4ko.

IN:
Le nombre de cas dans une requête utilisant IN est limité à environs 500

Taille de l’application
On peut être amener à préembarquer la base de donnée avec l’application. Or le package est limité à 14Mo, il faut donc penser à mettre en place un service de téléchargement pour le premier démarrage.

Toutes les informations officielles concernant le développement sont situées ici

{lang: 'fr'}

Maintenir plusieurs versions d’une application Blackberry

Pour gérer les multiples OS Blackberry ou déployer aisément différentes versions d’une application (version gratuite / payante, …) il est pratique d’utiliser les préprocesseurs.

//#preprocess
 
//#ifndef BlackBerrySDK4.5.0 | BlackBerrySDK4.6.0 | BlackBerrySDK4.6.1 | BlackBerrySDK4.7.0
import net.rim.device.api.database.Database;
import net.rim.device.api.database.DatabaseFactory;
import net.rim.device.api.io.URI;
//#endif
 
public class DemoClass {
 
public static void doSomething(){
//#ifndef BlackBerrySDK4.5.0 | BlackBerrySDK4.6.0 | BlackBerrySDK4.6.1 | BlackBerrySDK4.7.0
try {
URI myURI = URI.create("databaseDemo");
Database d = DatabaseFactory.open(myURI);
}
catch (Exception e) {
}
 
//#else
System.out.println("No database for your OS");
//#endif
}
}

Il y a 3 étapes à suivre:

  • Mettre //#preprocess au tout début du fichier
  • Encadrer le code spécifique par des balises #ifdef, #ifndef, #else et #endif
  • Pour compiler la bonne version, il suffit de choisir la JRE correspondante sur eclipse
Ensuite, ouvrez le fichier manfiest.xml sur l’onglet « Build ». Vous pouvez ainsi créer une nouvelle condition de préprocesseur et l’activer/la désactiver pour la compilation.

Présente les conditions de préprocesseurs disponibles

 

{lang: 'fr'}

Obtenir le userId dans un ModelListener Liferay

Lorsqu’on est dans un ModelListener, nous n’avons pas la request et donc à priori aucun moyen d’obtenir le userId. Pourtant, en regardant la classe com.liferay.portal.service.base.PrincipalBean (dont tous les services liferay héritent) on aperçoit la méthode getUserId() ci-dessous.

    public long getUserId() throws PrincipalException {
    String name = PrincipalThreadLocal.getName();
 
    if (name == null) {
    throw new PrincipalException();
    }
 
    if (Validator.isNull(name)) {
    throw new PrincipalException("Principal cannot be null");
    }
    else {
    for (int i = 0; i < ANONYMOUS_NAMES.length; i++) {
    if (name.equalsIgnoreCase(ANONYMOUS_NAMES[i])) {
    throw new PrincipalException(
    "Principal cannot be " + ANONYMOUS_NAMES[i]);
    }
    }
    }
 
    return GetterUtil.getLong(name);
    }

On a donc juste à réutiliser le code de cette méthode dans un ModelListener pour récupérer le userId courant.

{lang: 'fr'}

Contrôler et augmenter le nombre de sessions Oracle

L’utilisation de pool de connexions peut facilement saturer le nombre de connexions disponibles par défaut sur une base Oracle. D’autant plus qu’Oracle semble en utiliser pour son propre usage.

Une saturation se caractérise généralement par les erreurs suivantes:

ORA-12519, TNS:no appropriate service handler found

ATTENTION: pour passer les commandes ci-dessous, il faut avoir les droits DBA.
Pour les contrôler, utiliser la commande suivante:

SELECT sid, username, program, server FROM v$session

Pour augmenter:

alter system set PROCESSES=200 SCOPE=SPFILE ;
alter system set SESSIONS=200 SCOPE=SPFILE ;

Un arrêt / relance d’Oracle est ensuite nécessaire pour prendre en compte ces modifications.
Pour vérifier que la modification a bien été prise en compte:

select name, value from v$parameter where name in (’processes’,’sessions’);
{lang: 'fr'}

Liferay Clusterlink : Synchronisation des indexs Lucene

La synchronisation entre les différents noeuds d’un cluster (réel ou simple load-balancing) Liferay est devenue maintenant très simple grâce à une nouvelle fonctionnalité : Le ClusterLink.
Il n’est actuellement (version 6.0CE) utilisé que pour la synchro des indexes lucene mais son utilisation sera étendu à la synchronisation des caches (http://www.liferay.com/about-us/news/-/blogs/5229206/maximized).
Trois propriétés sont à rajouter dans le portal-ext.properties :

cluster.link.enabled=true
# Set this property to autodetect the default outgoing IP address so that
# JGroups can bind to it. The property must point to an address that is
# accessible to the portal server, www.google.com or your local gateway.
cluster.link.autodetect.address=192.X.X.X:XX <-- à remplacer par une adresse connue de tous les noeuds
lucene.replicate.write=true

Rajouter la ligne suivante pour vérifier que tout marche bien au démarrage :

cluster.executor.debug.enabled=true

(par contre, pas de log pendant son fonctionnement)

{lang: 'fr'}