Archives par mot-clé : HOWTO

Comment se faire rembourser une application Android

Si l’application a été achetée il y a moins de 15 min

C’est très simple

  1. Sur mobile, rendez-vous dans Google play store, puis « Mes applications ».
  2. Sélectionnez l’application que vous souhaitez retourner, et cliquez « désinstaller et rembourser »

Si l’application a été achetée avant

C’est plus compliqué, et le remboursement n’est pas garanti.

  1. Sur le web, rendez-vous dans « Mes commandes et paramètres« 
  2. Sur la ligne de l’application que vous souhaitez retourner, choisissez « Signaler un problème ». Sélectionnez « Je souhaite demander un remboursement ».
  3. Justifiez-vous. Envoyez le rapport.

Gmail, mon centre de communication unifiée email / SMS / messagerie instantannée

Alors que Facebook est en train de déployer sa messagerie unifiée, j’écris cet article pour proposer une alternative basée sur Gmail.

Gmail marche déjà tout seul pour gérer mes emails (avec un luxueux 7 Go d’espace), discuter en messagerie instantanée, ou gérer mon carnet d’adresses.

Je viens de découvrir l’application SMS Backup+ sur Android qui permet de sauver mes SMS dans des messages Gmail.

C’est très simple et astucieux, le téléphone se connecte en IMAP sur gmail pour ajouter de faux emails. J’ai ainsi accès à mon historique des conversations SMS.

MP550 support for linux

On many forums, I’ve read my brand new Canon Pixma MP550 would not be supported under Linux.

Well, that’s incorrect 🙂 Mandriva linux does not provide out-of-the-box support, but you’ll find official Canon drivers for this very nice printer on the Canon Australian web site. Strangely enough, they are not on the sites in other countries :-/

Here are my instructions:

Go to Canan Australia Support services

Go to http://www.canon.com.au/Support-Services

Open the download link for my printer

Search for Printer
First, search for my printer (in my case MP550)
Then, Follow the download link
Follow the download link

Download the driver

Browse the results and find the Canon driver for linux.

The Canon driver for linux
The Canon driver for linux

You find, the source code, the Redhat RPM package, and the Debian DEB package.

You’ll also find the drivers for the scanner.

For a RPM-based distribution, download the RPM packages for

the printer
MP550 series IJ Printer Driver Ver. 3.20 for Linux (rpm Packagearchive)
the scanner
MP550 series ScanGear MP Ver. 1.40 for Linux (rpm Packagearchive)

Install the drivers

Unpack the archive

root@localhost /tmp # tar xzvf cnijfilter-mp550series-3.20-1-i386-rpm.tar.gz

run the install script

cd cnijfilter-mp550series-3.20-1-i386-rpm
./install.sh

That’s it

Check in the CUPS adminsitration that the printer was added, and print the test page.

Convertir un RPM en tgz

À mon travail, j’ai un compte Unix sur un serveur AIX sur lequel il n’y a pas tout ce que je veux… Du coup j’ai envie d’en ajouter un peu…

Première solution: compiler moi-même les programmes que je veux. Problème: il faut le compilateur, il faut arriver à compiler (et ce n’est pas toujours évident sous AIX — c’est un PowerPC, beaucoup de programmes systèmes ne sont pas identiques à Linux, l’assembleur d’IBM est buggé, etc.).

Deuxième solution; installer les RPM fournis par Redhat. Il faut bidouiller son .rpmmacros. Mais les RPM d’IBM sont mal conçus et ne sont pas relocalisables. Les RPM utilisent en dur /opt/freeware et ne sont pas relocalisables. Bouhhhh.

Dernière solution: extraire le contenu du RPM et l’utiliser tel quel. Je fais cela avec rpm2cpio et cpio. Mais comme le rpm2cpio d’AIX semble buggué, j’ai eu l’idée de faire ça sous Linux pour générer un tgz… Voici mon programme:

  1. #!/bin/sh
  2. #verbose. set to 'v' for verbose mode
  3. v=''
  4.  
  5. #the original working directory (in order to restaure context)
  6. pwdorig=$(pwd)
  7. if [ "$v" == "v" ] ; then
  8.   echo pwdorig=$pwdorig
  9. fi
  10.  
  11. #catch interrupt
  12. trap 'echo "Cleaning up" >&2; cd "$pwdorig" ; rm -rf $tmp ; exit' 1 2 3 15
  13.  
  14.  
  15. RDS_extract() {
  16.         echo "Extract RPM $file"
  17.         cd $tmpdir
  18.         rpm2cpio $file | cpio -id$v
  19. }
  20.  
  21. RDS_tarball() {
  22.         echo "Build tarball $destfile"
  23.         cd $tmpdir
  24.         tar c${v}zf $destfile *
  25. }
  26.  
  27. RDS_finish(){
  28.         echo "Cleaning temp files"
  29.         cd $pwdorig
  30.         cp $tmpdir/$destfile .
  31.         rm -rf $tmpdir
  32. }
  33.  
  34. echo "rpm2tgz $*"
  35. for file in $*
  36. do
  37. tmpdir=$(mktemp -d)
  38. destfile=$(dirname $1)/$(basename $file .rpm).tgz
  39. #$file is the absolute path of the file
  40. if [ ! "$(echo $file | cut -c 1)" = "/" ] ; then
  41.   file=$pwdorig/$file
  42. fi
  43. RDS_extract
  44. RDS_tarball
  45. RDS_finish
  46. done

Et oui, je sais: j’ai réinventé la roue.

Maven est formidable

Maven, le gentoo-portage pour Java

J’ai découvert Maven il y a (trop) peu longtemps.

C’est assez génial, ça offre des archetypes de projet pour aller plus vite, un peu comme les scaffolds de Ruby on rails. Et ensuite ça gère la dépendence des jars, un peu comme une bonne distribution linux.

m2settings

Maven stocke les paramètres d’un utilisateur dans un fichier de configuration XML. Aujourd’hui, j’ai décidé de m’amuser à écrire une petite interface graphique pour modifier ce fichier… Mon projet va s’appeler m2settings

Quel outil de mapping Java<->XML ?

Je ne me pose pas trop de questions, je vais faire ça en Java. Je commence par le lien JavaBean<->XML. Comme toujours en Java, il y a une pléthore de possibilité:

  • Apache Xerces ne répond pas vraiment, il fait le parsing de XML. Mais moi, j’aurais aussi besoin d’écrire la configuration modifiée
  • Justement Apache betwixt fait le contraire: il transforme un Bean en XML.
  • Jato semble répondre, mais manque de documentation et le projet est visiblement mort en hibernation
  • castor répond parfaitement à mon besoin (et en plus je l’ai déjà un peu utilisé au boulot)
  • Xstream fait aussi tout à fait ce que je veux faire, et semble vraiment très simple à utiliser.

Je décide donc de commencer avec Xstream.

On démarre avec XStream

Je crée donc un projet Java, compatible avec eclipse

mvn create
mvn eclipse:eclipse

En pratique, voilà ce que je veux faire:

  1. package org.sourceforge.m2settings.beans;
  2.  
  3. import org.sourceforge.m2settings.XMLBinder;
  4.  
  5. import junit.framework.TestCase;
  6.  
  7. public class XMLBinderTest extends TestCase {
  8.     private XMLBinder xmlbind;
  9.  
  10.     private static final String XML_PROXY =
  11.          "<proxy>\n  <active>true</active>\n  <protocol>http</protocol>\n  <username>user</username>\n  <password>secretpwd</password>\n  <port>8080</port>\n  <host>proxy.intra</host>\n  <nonProxyHosts>*.intra</nonProxyHosts>\n  <id>myproxy-id</id>\n</proxy>";
  12.  
  13.     private static final Proxy proxy =
  14.             new Proxy(true, "http", "user",
  15.             "secretpwd", "8080", "proxy.intra", "*.intra", "myproxy-id");;
  16.  
  17.     @Override
  18.     protected void setUp() throws Exception {
  19.         xmlbind = new XMLBinder();
  20.     }
  21.  
  22.     /**
  23.      * Test transformation of Proxy bean into XML:
  24.      */
  25.     public void testMarshallProxy() {
  26.         assertEquals(XML_PROXY, xmlbind.toXML(proxy));
  27.     }
  28.  
  29.     /**
  30.      * Test transform XML section of &lt;proxy&gt; into Proxy bean
  31.      *
  32.      */
  33.     public void testUnmarshallProxy() {
  34.         Proxy p=(Proxy) xmlbind.fromXML(XML_MIRROR);
  35.         assertEquals(proxy, p);
  36.     }
  37. }

Pour résoudre mes erreurs de compilation, il me fau vite écrire mon xmlbind qui étant Xstream:

  1. package org.sourceforge.m2settings;
  2.  
  3. import org.sourceforge.m2settings.beans.Mirror;
  4.  
  5. public class XMLBinder extends XStream {
  6.     public XMLBinder() {
  7.         // does not require XPP3 library
  8.         // uses standard DOM library instead
  9.         super(new DomDriver());
  10.         this.alias("proxy", Proxy.class);
  11.     }
  12. }

Ce qui m’oblige enfin à écrire le bean en question:

  1. package org.sourceforge.m2settings.beans;
  2.  
  3. /**
  4.  * <proxy> <active/> <protocol/> <username/> <password/> <port/> <host/>
  5.  * <nonProxyHosts/> <id/> </proxy>
  6.  *
  7.  * @author regis
  8.  *
  9.  */
  10. public class Proxy {
  11.     /**
  12.      * Whether this proxy configuration is the active one.
  13.      */
  14.     private boolean active;
  15.  
  16.     private String protocol; // TODO enumeration
  17.  
  18.     private String username;
  19.  
  20.     private String password;
  21.  
  22.     private String port;
  23.  
  24.     private String host;
  25.  
  26.     /**
  27.      * The list of non-proxied hosts (usually comma-delimited).
  28.      */
  29.     private String nonProxyHosts;
  30.  
  31.     private String id;
  32.  
  33.     public Proxy(Boolean active, String protocol, String username,
  34.             String password, String port, String host, String nonProxyHosts,
  35.             String id) {
  36.         setActive(active);
  37.         setProtocol(protocol);
  38.         setUsername(username);
  39.         setPassword(password);
  40.         setPort(port);
  41.         setHost(host);
  42.         setNonProxyHosts(nonProxyHosts);
  43.         setId(id);
  44.     }
  45.  
  46.     @Override
  47.     public boolean equals(Object obj) {
  48.         if (obj.getClass() != Proxy.class)
  49.             return false;
  50.  
  51.         Proxy p = (Proxy) obj;
  52.         return (active == p.isActive() && protocol == p.getProtocol()
  53.                 && username == p.getUsername() && password == p.getPassword()
  54.                 && port == p.getPort() && host == p.getHost()
  55.                 && nonProxyHosts == p.getNonProxyHosts() && id == p.getId());
  56.     }
  57. }

Il faut écrite tous ses beans à la main?

Tout cela marche très bien, mais il faut écrire tous les beans…

Alors je passe à Castor, qui sait faire cela à partir de schéma XML. Et justement, j’ai le XSD de settings.

La suite au prochain épisode!