jeudi 2 décembre 2010

Sniffer les transactions réseau sur Android

Récemment, je me suis retrouvé confronté à un problème dans une appli Android. En effet, cette appli utilisait une API privée pour envoyer des statistiques d'utilisation aux serveurs de Webtrends (une bibliothèque que je ne saurais trop conseiller, préférez-lui Google Analytics, mais là n'est pas le sujet).

Ainsi, non content de ne pas avoir de message d'erreur dans la console, nous envoyons l'appli à notre client, qui nous informe que les données analytiques ne sont pas remontées. Il a fallu trouver une solution pour "sniffer" les transactions éventuelles de Webtrends.




C'est ainsi que j'ai découvert "Shark for root" sur le market, ainsi que son "Shark Reader" pour lire les résultats. A noter que la première appli nécessite les droit de super-utilisateur (root) sur votre terminal, Et que la seconde est d'un intéret limité sans la première :)

En faisant une recherche Google, je viens de trouver ceci à propos de l'appli, par l'auteur, avec les apk qui vont bien :) http://forum.xda-developers.com/showthread.php?t=725692

Shark for root:


Shar reader:

mardi 3 août 2010

Créer son premier projet Android

Après avoir installé notre SDK Android sur Eclipse et configuré notre Android Virtual Device (AVD) nous voilà fins prèts à créer ce fameux projet Android.


  • Première étape, il faut bien penser à configurer l'emplacement du SDK dans les paramètres d'Eclipse. Pour cela nous allons dans le menu Fenètres > Préférences d'Eclipse.

    Dans la fenètre de préférence sélectionnez le menu Android et ici donnez le chemin de votre SDK (dans mon cas /home/climbatize/android-sdk-linux_86). Si le chemin est bon, lorsque vous cliquez sur "Appliquer", la liste de vos API devrait apparaître:







    Voilà pour la config.


  • Maintenant créons gaiement notre projet. Rien de bien compliqué là non plus, Fichier > Nouveau > Autre...

    Dans le champs de recherche tapez "Android":




    Sélectionnez "Android Project".
     Cliquez sur Suivant.


    Donnez un nom à votre projet. Si vous avez intallé les samples pour un SDK et que vous souhaitez les compiler pour tester, sélectionnez ce SDK et les samples apparaîtront.


    Si vous désirez partir de zéro, remplissez tous les champs obligatoires. (Nom de projet, package, etc...) ces noms ne sont pas important pour votre première appli, mais sont obligatoires.




    Voilà, c'est le stricte minimum dont vous avez besoin pour créer votre projet. Cliquez sur terminer.



  • Comme vous pouvez le constater, votre projet contient déjà des erreurs. C'est un bug du SDK Android pour Eclipse:


    On se retrouve donc avec l'erreur "The project cannot be built until build path errors are resolved" ou encore "Project ‘Nom du projet’ is missing required source folder: ‘gen’".

    Autant vous dire que j'en ai testé des combinaisons de build path avant de corriger cette erreur :)

    Pas de panique, rien de bien sorcier à corriger au final, il suffit simplement de supprimer le firchier R.java dans les sous-dossiers de "Gen".

  • Et voilà, c'est vraiment fini, les vrais challenges peuvent commencer! Rendez-vous dans les prochain post pour vos balbutiement de code, ou mieux, essayez de pondre quelque chose par vous-même ^^

    dimanche 18 juillet 2010

    Lire ses DivX et MKV sur Android

    En demo fermée jusqu'à maintenant, le meilleur lecteur DivX Android (le seul?) est dispo sur le market. Il lit quasi tous les formats (AAC AC3 DTS FLV4 LPCM ALAW ULAW MPEG Audio MPEG-1 MPEG-2 RealVideo RealAideo Vorbis AVC VC1 XVID DIVX SVQ) et supporte l'incrustation des sous-titres.


    Le logiciel est un adware, mais on peut se passer de la pub (très discrète) en faisant un don de 10$ à l'auteur ou en coupant son réseau avant le lancement de la video.

    Il est dispo en 3 versions:


    qrcode
    • ARMv7 (Google Nexus One, HTC Desire Incredible EVO , Moto Milestone XT800, Droid Series,Acer Liquid, Samsung Galaxy S, Sony Ericsson X10 ,Dell Thunder Streak, LG LU2300 etc .)
    • ARMv6_VFP(Samsung SHW-M100S GT-i5700 ,HTC Legend ,etc.)
    • ARMv6 compatible avec tous les téléphones (mais moins optimisé)

    lundi 12 juillet 2010

    Tuto pour créer votre première application Android grâce à App Inventor

    Dans son soucis de démocratisation de sa plateforme Android, Google nous dote d'un outil fort intéressant: le App Inventor. Sous ce nom simpliste se cache une plateforme de développement vous permettant de créer votre application Android de façon visuelle (WYSIWYG).

    Voici la vidéo de démonstration officielle:



    Prérequis:

    Vous aurez besoin de:

    • Système d'exploitation:


      • Macintosh: Mac OS X 10.5, 10.6
      • Windows: Windows XP, Windows Vista, Windows 7
      • GNU/Linux: Ubuntu 8+, Debian 5+
    • Navigateur:


      • Mozilla Firefox 3.6 ou plus
      • Apple Safari 5.0 ou plus
      • Google Chrome 4.0 ou plus
      • Microsoft Internet Explorer 6 ou plus
    • Java 1.6 ou plus


    Vous l'aurez compris, ce kit utilise java pour lancer uen application dans votre navigateur internet.

    Su le site de google vous pouvez télécharger un kit pour installer un émulateur android et autres:


    Si vous voulez travailler à partir de votre propre téléphone Android, pensez à le paramétrer correctement. Allez dans Paramètres>Applications et cochez "Sources Inconnues". Sur le même écran, activez le déboggage USB.

    Google vous conseille aussi d'aller dans Paramètres> Affichage (et Sons selon votre version d'Android) puis de décocher l'Orientation Auto, qui semblerait poser des problèmes avec App Inventor.
    Si vous devez activer ce paramètre pour votre appli, pensez à le faire avant de lancer App Inventor.

    Pensez à connecter votre téléphone en USB, l'icone debugging devrait apparaitre dans la barre de notifications.

    Voilà, vous êtes fins prèt à utiliser App Inventor. La suite se passe dans le prochain post, quand google aura activé mon compte App Inventor ^^
    Pour activer vous aussi votre compte, c'est par ici:


    http://appinventor.googlelabs.com/


    A très bientôt donc

    samedi 3 juillet 2010

    Répartition des versions d'Android sur le marché

    Les nouvelles stats sur la répartition des versions d'android sur le marché sont tombées. Sans grosses surprises, voici les résultats pour que nous puissions développer avec un maximum de compatibilité parmi les utilisateurs:





    PlateformeNiveau d'APIDistribution
    Android 1.5321.3%
    Android 1.6423.5%
    Android 2.1753.1%
    Android 2.281.8%


    Données collectées pendant deux semaines se terminant le 1er juillet 2010


    Sans surprise c'est Android 2.1 qui remporte cette manche. Le graphique suivant nous montre que si les tendances restent telles qu'elles sont, dans un avenir proche il va vraiment falloir s'atteler à programmer des applis compatibles avec Android 2.1 et abandonner l'API 1.5:




    Il ne reste plus qu'à vous fournir des tutos pour développer de belles applis, je vais m'y atteler avant qu'Android 2.1 disparaisse :)

    vendredi 18 juin 2010

    Comptoir Biosud, vente de linge en coton biologique


    Voici le nouveau site que nous avons réalisé avec le collectif UnaLabs sous Prestashop. Ce site propose une gamme de produits (vetements bébé, T-Shirt hommes/femmes, linge de maison...) en coton biologique, je vous invite donc à y jeter un oeil :)

    jeudi 25 mars 2010

    Créer un AVD sous windows 7 et le SDK Android 2.1, ADT r5

    Cette semaine je vous ai fait découvrir comment installer le SDK Android avec ADT pour Eclipse. (http://pm-villa.blogspot.com/2010/03/utiliser-le-android-sdk-avec-eclipse.html).

    Certain d'entre vous on pu essayer de créer un "virtual device" et se retrouver confronté à ce message:

    emulator: ERROR: unknown virtual device name: 'Dream'
    emulator: could not find virtual device named 'Dream'


    Alors pour ce qui n'ont pas encore franchit le pas, et ceux qui ont eu des soucis, voici la marche à suivre:

    • Etape 0: Installation du SDK
    Pour cela pas de soucis, si vous avez raté un épisode ça se passe par là:  Utiliser le Android SDK avec Eclipse

    •  Etape 1: Lancez le AVD Manager du SDK (Android Virtual Device Manager)
    Lancez Eclipse comme installé précédemment. Une icone du SDK apparaît dans votre toolbar. Cliquez dessus:

    Une boîte de dialogue qui nous est déjà familière apparaît: Android SDK and AVD Manager. Là vous trouverez la rubrique virtual devices, dans laquelle nous allons ajouter notre fameux émulateur android. Cliquez donc sur New...


    Là une nouvelle boîte de dialogue apparaît:


    Donnez un nom à votre terminal virtuel (AVD), n'importe quoi fera l'affaire (pour ma part Dream). Dans target choisissez votre version de l'API Android, moi j'ai choisi Google APIs pour profiter de Google maps.
    On n'oublie pas la taille de la SD Card, 9 Mo minimum, moi j'ai mis 128 ce qui me semble correct pour une appli normale. Moi je veux émuler un HTC Dream, donc j'ai laissé le Skin par défaut pour la taille d'écran.

    Hardware vous permettra de programmer des applications spécifiques à un materiel donné (Accéléromètre, batterie, etc...).

    Voilà, vous n'avez plus qu'à cliquer sur create AVD.

    • Etape 2: Lancez le virtual device... ou pas!

      Moi je suis sous windows 7, et avec la dernière version du SDK 2.1, le SDK Tools r5, et bien impossible de lancer un AVD, le message : emulator: ERROR: unknown virtual device name: 'Dream', emulator: could not find virtual device named 'Dream' s'affiche:


      Mais heureusement, j'ai la solution! Il suffit de rajouter une variable d'environnement ANDROID_SDK_HOME comme suit:

      Cliquez droit sur "Ordinateur", choisissez "Propriétés" dans le menu contextuel.


      Votre "système" apparaît. Cliquez sur "Paramètres Système Avancés":


      La boîte des propriétés de votre poste de travail apparaît:


      Cliquez sur Variables d'environnement, et là cliquez sur Nouvelle...


      Dans le champs "Nom de la Variable" entrez ANDROID_SDK_HOME, et donnez lui pour valeur le chemin vers le SDK, pour moi E:\dev\android-sdk-windows:


      Validez tout ça, redémarrez Eclipse, reprenez le tuto à l'étape 1 :)

      Si tout s'est bien passé, vous devriez obtenir un résultat de ce type:


        dimanche 21 mars 2010

        Utiliser le Android SDK avec Eclipse

        Voici mon premier tuto pour développer pour le système Android!

        Pour débuter, rien de vraiment compliqué, juste comment installer le SDK Android et l'extension qui va avec sous l'IDE Eclipse.

        • Première étape: Récupérer le SDK Android
        Rien de bien compliqué, dans cette étape là, il suffit juste dans un premier temps de récupérer le starter SDK sur le site du developpeur Android:

        Platform Package Size MD5 Checksum
        Windows android-sdk_r05-windows.zip 23449838 bytes cc2c51a24e2f876e0fa652e182ef5840
        Mac OS X (intel) android-sdk_r05-mac_86.zip 19871714 bytes 6fcfeed0e1c36624c926551637eb3308
        Linux (i386) android-sdk_r05-linux_86.tgz 16208523 bytes 1d695d6a31310406f5d49092a1bd9850

        Je vous conseille tout de même de vous rendre sur le site, le SDK est en constante évolution. Ci-dessus ce sont les versions disponibles au 21 mars 2010.

        Décompressez l'archive dans votre dossier de développement. Nous allons lancer l'utilitaire de téléchargement du SDK Android, ou plutôt devrais-je dire de ses multiples versions:



        Bien sûr, nous allons lancer le SDK Setup. Si au premier lancement vous avez ce message d'erreur: Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml, reason: HTTPS SSL error. You might want to force download through HTTP in the settings.


        Alors il vous faut aller dans les settings et désactiver le téléchargement des repositories par https:


        Cliquez ensuite sur Available packages et développez l'arbre:


        Comme vous pouvez le voir, une multitude de packages sont disponibles. Il vous faudra au minimum un package de type SDK Platform Android. Les packages Google APIs contiennent les APIs qui vous serviront à manipuler Google Maps par exemple. Les versions que vous choisirez dépendront de vos besoins, sachant que les statistiques d'utilisation d'Android divisées par versions au 4 janvier 2010 étaient les suivantes (source):


        Moi à l'heure actuelle, je pense qu'il faut compter sur la version 1.6 et sur la 2.1, qui n'apparaît pas dans ces stats mais va équiper de plus en plus de terminaux HTC comme le Nexus One ou le Hero. Donc cochez ce qui vous semble judicieux (pour ma part API 7 et API 4, mais je développerai en API 4 pour toucher le plus de monde).




        Cliquez sur Install Selected et sur la fenêtre suivante choisissez "Accept All" puis validez (Install). Attendez que tout soit téléchargé (ça peut prendre un certain temps).


        Si tout s'est bien déroulé vos packages apparaissent désormais dans "Installed Packages". Nous venons de faire 50% du chemin.

        • 2ème Etape: Installer Eclipse Android Development Tools : ADT
        A l'heure actuelle, ADT est compatible avec Eclipse 3.5 et Eclipse 3.4. Nous utiliserons la dernière version stable d'Eclipse, la 3.5. Vous pouvez la télécharger ici. Une fois lancé, cliquez sur help>Install new software...


        Vous cliquez sur Add... et vous ajoutez les site https://dl-ssl.google.com/android/eclipse/ (dans le champs site :) ):

        Finalement vous cochez tout le developper tools et vous conduisez le processus jusqu'à la fin de l'installation.


        Dans un prochain post je vous expliquerai comment créer votre projet Android, mais la manipulation est assez classique pour ceux qui sont habitués à Eclipse.



        jeudi 11 mars 2010

        Créer une div avec une hauteur minimale et en jQuery



        Après moultes modifications de mon site, il s'est avéré que ma première solution de hauteur minimale pour une div a moins bien fonctionné que prévu, tout du moins sous Firefox. Comme je commençait à avoir un CSS complexe, et que j'avais déjà du jQuery à foison dans tout le site, et donc que ce dernier était indispensable au fonctionnement normal du site, je me suis donc penché sur la solution en script plutôt qu'en CSS.

        Première bonne nouvelle, pas besoin de plugin pour ça, j'ai trouvé tout ce qu'il me fallait dans l'api de base:

        • jquery.height()
        Et c'est tout :)


        Pour commencer, posons notre squelette:


        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
            <title>Redimensionnons nos div</title>
        
        
            <!-- Inclusion de jquery -->
            <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
        
            <!-- votre css -->
            <link type='text/css' href='css/mon.css' rel='stylesheet' media='screen' />
        
        </head>
        <body>
            <div id="div_principale">
                <div id="div_gauche">
                    <!-- Le contenu de votre div gauche-->
                </div>
                <div id="div_droite">
                    <!-- Le contenu de votre div droite-->
                </div>
            </div>
        </body>
        </html> 

        Nous sommes ici face à la problématique suivante: nous devons donner une hauteur fixe à notre div principale, mais nous voulons que notre div de gauche ou notre div de droite à contenu variable ne dépassent pas de la div principale.

        Pour ce faire, entre nos deux balises head, nous allons placer ce petit script:


        <script type="text/javascript">
            $(document).ready(
        
                function()
                {
                    if($('#div_gauche').height()>$('#div_droite').height())
                    {
                        $("#div_principale").height($('#div_gauche').height()+30);
                    }else
                    {
                        $("#div_principale").height($('#div_droite').height()+30);
                    }
                }
            );
        </script>

        Et voilà!

        $(document).ready va permettre de charger le script après les chargement de la page.
        Ensuite le script va déterminer sir la div de gauche est plus grande que la div de droite, si oui la div principale prendra la hauteur de la div de gauche + 30 pixels, si non elle prendra la hauteur de la div de droite + 30 pixels, c'est aussi simple que ça.

        Bien sûr ceci n'est qu'un petit exemple, après l'idéal est faire appel à cette fonction dans des callbacks par exemple :)

        lundi 8 mars 2010

        Créer une div avec une hauteur minimale

        Bonjour à tous!

        Aujourd'hui je me suis trouvé confronté au problème suivant: créer une div qui devait faire au moins 600px de hauteur sous tous les navigateurs, IE6 inclus, même si le bougre est mort depuis peu ^^.

        Après plusieurs essais, voici la solution que j'ai adopté (le site d'origine: http://reignwaterdesigns.com/ad/tidbits/hacks/minimum_height_in_css.shtml) :

        Tout d'abord, utiliser la propriété CSS2 min-height:

        .monDiv{
            min-height:600px;
        }


        Ensuite, utiliser la propriété !important de css2 sur un height, qui indique à un navigateur la gérant bien (je veux bien dire autre que Internet Explorer) que pour deux heightidentiques celui noté !important doit être utilisé:

        .monDiv{
            min-height:600px;
            height:auto !important;
        } 


        Enfin, pour notre IE préféré, on rajoute le height qu'il utilisera puisque trouvé en dernier:

        .monDiv{
            min-height:600px;
            height:auto !important;
            height:600px;
        }


        Et voilà, votre div aura une hauteur de 600px au plus :)
        Un grand merci à Reign Water, je vous conseille de visiter son blog ne serait-ce que pour le remercier ;)

        vendredi 26 février 2010

        Fiche récapitulative des accesseurs en jquery

         Voici un fiche très pratique pour un débutant comme un développeur confirmé. Elle récapitule la liste des accesseurs aux différents élément d'une page html en jQuery:


        C'est vraiment la base de jQuery, mais ce sont 6 pages indispensables :)

        vendredi 5 février 2010

        Générer ses classes java à partir de l'enterprise.wsdl de Salesforce avec Axis 2

        Voici un méthode que j'avais posté il y a quelques temps sur les forum de Salesforce pour générer des classes Java à partir du fichier enterprise.wsdl et axis 2 sous windows. J'utilise wsdl2java pour générer les classes.





        Ajoutez Java et Axis à votre path, par exemple:
        JAVA_HOME = C:\Program Files\Java\jdk1.6.0_07
        AXIS2_HOME = Q:\SalesForce\WSDL2JAVA_Generation\axis2-1.4.1-bin\axis2-1.4.1


        puis, créez un répertoire pour placer vos données. Dans ce répertoire vous pouvez mettre un sous-répertoire pour placer votre WSDL. Puis lancez cette commande:

        %AXIS2_HOME%/bin/wsdl2java -t -uri wsdl/enterprise.wsdl -l java -d xmlbeans -p com.salesforce.webservice -sn SforceService -o generated/Salesforce


        bien entendu:
        - "wsdl/enterprise.wsdl" est le chemin relatif de mon WSDL
        - "com.salesforce.webservice" est le nom du package qui contiendra les classes générées
        - "generated/Salesforce" est le sous-répertoire qui contiendra les classes du package

        Dans mon exemple, a un sous-rpertoire Salesforce est créé dans le répertoire "generated". Il contient:
        - [src] qui contient les classes générées
        - [resources] qui contient les ressources nécessaires à la connexion avec Salesforce
        - [test] qui contient des classes de tests

        Empaquetez le contenu du répertoire resources (pas le répertoire lui-même) dans un fichier .jar.

        Compilez les classes contenues dans src, et empaquetez-les dans un fichier du nom de salesforce.jar (par exemple).

        Ensuite, il vous faut intégrer resources.jar, salesforce.jar et les bibliothèques Axis2 à votre classpath. Pour cela, chacun sa méthode, moi j'utilise Eclipse (pour générer salesforce.jar aussi).

        Et voici mon implémentation java:

        Voici le constructeur pour mon objet de session Salesforce:

        public static final String PROD_SERVER = "https://www.salesforce.com/services/Soap/c/16.0";
            public static final String SANDBOX_SERVER = "https://test.salesforce.com/services/Soap/c/16.0";
            
            public Exception exception;
            
            private Login login;
        
            private SessionHeader sessionHeader;
        
            private SessionHeaderDocument sessionHeaderDocument;
            
            private String endpoint;
        
            private String UserName, PassWord;
        
            private int Progress;
        
            private String ProgressText;
        
            private String server;
        
            private SforceServiceStub stub;
            
        
            /**
             * This constructor initializes a connexion with Saleforce using user name
             * and password. 
             * 
             * @param UN
             *            Salesforce User Name
             * @param PW
             *            Salesforce User Password
             * @throws Exception
             */
            public Salesforce_session(final String UN, final char[] PW) throws Exception
            {
         
         UserName = UN;
         PassWord = String.valueOf(PW);
        
         
          try
          {
        
              setProgress(0, "Loging");
              if (UN.endsWith(".sand"))
              {
           endpoint = SANDBOX_SERVER;
              } else
              {
           endpoint = PROD_SERVER;
              }
        
              stub = new SforceServiceStub(endpoint);
        
              LoginDocument loginDocument = LoginDocument.Factory.newInstance();
        
              login = Login.Factory.newInstance();
        
              login.setUsername(UserName);
        
              login.setPassword(PassWord);
        
              loginDocument.setLogin(login);
        
              LoginResponseDocument loginResponseDocument = stub.login(loginDocument, null);
        
              LoginResponse loginResponse = loginResponseDocument.getLoginResponse();
        
              LoginResult loginResult = loginResponse.getResult();
        
              sessionHeader = SessionHeader.Factory.newInstance();
        
              sessionHeader.setSessionId(loginResult.getSessionId());
        
              sessionHeaderDocument = SessionHeaderDocument.Factory.newInstance();
        
              sessionHeaderDocument.setSessionHeader(sessionHeader);
        
              setProgress(10, "Loading service");
        
              fireMyEvent(new MyEvent("Loading Service..."));
              stub = new SforceServiceStub(loginResult.getServerUrl());
        
              Options options = stub._getServiceClient().getOptions();
              fireMyEvent(new MyEvent("Setting Gzip Compression IN..."));
              options.setProperty(HTTPConstants.MC_ACCEPT_GZIP, Boolean.TRUE);
        
              options.setProperty(HTTPConstants.MC_GZIP_REQUEST, Boolean.TRUE);
        
              fireMyEvent(new MyEvent("Connexion established"));
        
          } catch (AxisFault e)
          {
             exception = e;
        
          } catch (RemoteException e)
          {
              exception = e;
          } catch (InvalidIdFault e)
          {
              exception = e;
          } catch (UnexpectedErrorFault e)
          {
              exception = e;
          } catch (diva.salesforce.webservice.LoginFault e)
          {
              exception = e;
          } catch (ExceptionInInitializerError e)
          {
              exception = (Exception) e.getException();
          }
        
            
        
            }


        ainsi que ma méthode de requètes:

        /**
             * Use this method to send SOQL queries to salesforce.
             * 
             * @param querystr
             *            the SOQL query to send to salesforce.
             * @return Query Result
             * @throws RemoteException
             * @throws InvalidSObjectFault
             * @throws MalformedQueryFault
             * @throws InvalidIdFault
             * @throws InvalidFieldFault
             * @throws UnexpectedErrorFault
             * @throws InvalidQueryLocatorFault
             */
            public QueryResult Query(final String querystr) throws RemoteException, InvalidSObjectFault, MalformedQueryFault,
             InvalidIdFault, InvalidFieldFault, UnexpectedErrorFault, InvalidQueryLocatorFault
            {
         
         Query query;
         QueryDocument queryDocument;
         QueryResponseDocument queryResponseDocument;
         QueryResponse queryResponse;
         QueryResult queryResult = null;
        
         query = Query.Factory.newInstance();
        
         query.setQueryString(querystr);
        
         queryDocument = QueryDocument.Factory.newInstance();
        
         queryDocument.setQuery(query);
        
         queryResponseDocument = stub.query(queryDocument, sessionHeaderDocument, null, null, null);
        
         queryResponse = queryResponseDocument.getQueryResponse();
        
         queryResult = queryResponse.getResult();
        
         return queryResult;
        
            }
         


        pareil pour l'insertion en base:

        /**
             * Use this method to insert several {@link SObject} in salesforce.
             * 
             * @param sObjectsArray
             * @return a {@link SaveResult} array for each inserted objects
             * @throws RemoteException
             * @throws InvalidSObjectFault
             * @throws InvalidIdFault
             * @throws InvalidFieldFault
             * @throws UnexpectedErrorFault
             */
            public SaveResult[] Insert(SObject[] sObjectsArray) throws RemoteException, InvalidSObjectFault, InvalidIdFault,
             InvalidFieldFault, UnexpectedErrorFault
            {
        
         SaveResult[] saveResultArray = null;
         // Invoke the create call
        
         CreateDocument createDocument = CreateDocument.Factory.newInstance();
         Create create = createDocument.addNewCreate();
        
         create.setSObjectsArray(sObjectsArray);
        
         CreateResponseDocument createResponseDocument = stub.create(createDocument, sessionHeaderDocument, null, null,
          null, null, null, null);
        
         CreateResponse createResponse = createResponseDocument.getCreateResponse();
         saveResultArray = createResponse.getResultArray();
        
         return saveResultArray;
        
            }


        et la mise-à-jour de champs:

        /**
             * Use this method to update several {@link SObject} in salesforce.
             * 
             * @param sObjectsArray
             * @return
             * @throws RemoteException
             * @throws InvalidSObjectFault
             * @throws InvalidIdFault
             * @throws InvalidFieldFault
             * @throws UnexpectedErrorFault
             */
            public SaveResult[] Update(SObject[] sObjectsArray) throws RemoteException, InvalidSObjectFault, InvalidIdFault,
             InvalidFieldFault, UnexpectedErrorFault
            {
         
         SaveResult[] updateResultArray = null;
         // Invoke the update call
        
         UpdateDocument updateDocument = UpdateDocument.Factory.newInstance();
         Update update = updateDocument.addNewUpdate();
        
         update.setSObjectsArray(sObjectsArray);
        
         UpdateResponseDocument updateResponseDocument = stub.update(updateDocument, sessionHeaderDocument, null, null,
          null, null, null, null);
         UpdateResponse updateResponse = updateResponseDocument.getUpdateResponse();
         updateResultArray = updateResponse.getResultArray();
        
         return updateResultArray;
        
            }


        ou la suppression de champs:
        /**
             * This method take an array of object ids to delete ins salesforce. Deleted
             * object can be retrieved in the recycle bin.
             * 
             * @param sObjectsIdArray
             * @return
             * @throws RemoteException
             * @throws UnexpectedErrorFault
             */
            public DeleteResult[] Delete(String[] sObjectsIdArray) throws RemoteException, UnexpectedErrorFault
            {
         DeleteResult[] deleteResultArray = null;
         // Invoke the delete call
        
         DeleteDocument deleteDocument = DeleteDocument.Factory.newInstance();
         com.sforce.soap.enterprise.DeleteDocument.Delete delete = deleteDocument.addNewDelete();
        
         delete.setIdsArray(sObjectsIdArray);
        
         DeleteResponseDocument deleteResponseDocument = stub.delete(deleteDocument, sessionHeaderDocument, null, null,
          null, null, null);
         DeleteResponse deleteResponse = deleteResponseDocument.getDeleteResponse();
         deleteResultArray = deleteResponse.getResultArray();
        
         return deleteResultArray;
        
            }


        Comme vous pouvez le voir, c'est un peu le même bateau pour chaque méthode.

        En espérant vous avoir aidé. Mon post original sur le forum communautaire de Salesforce: http://community.salesforce.com/sforce/board/message?board.id=JAVA_development&message.id=6728#M6728 N'hésitez pas à consulter le site de Salfesforce pour plus d'informations sur les évolutions de la solution : www.salesforce.com/fr

        mardi 2 février 2010

        Dyzplastic Production Blog: Android mini collectibles



        Une fois n'est pas coutume, je vous donne un lien vers un objet que tout fan d'Android qui se respecte se doit de posséder! Je vous laisse découvrir:

        Dyzplastic Production Blog: Android mini collectibles

        Add Prefix and/or Suffix to Each Text Line

        Un outils intéressant pour les développeurs :)

        Add Prefix and/or Suffix to Each Text Line

        Ce site permet de coller un texte, et d'entourer chaque ligne d'un préfixe et d'un suffixe.

        Bon certe ce n'est pas la panacée, on peut faire mieux avec un grep, mais ça peut dépanner ;)

        dimanche 31 janvier 2010

        Flasher le bios d'un Acer Aspire One

        Si comme moi vous vous êtes retrouvés avec un écran noir à l'allumage de votre netbook, ou que vous vous êtes retrouvé confrontés aux problèmes de compatibilité avec Ubuntu, vous avez surement eu besoin de flasher le bios de votre Acer Aspire One.


        Voici donc la marche à suivre:

        1. Méthode "douce"

          Cette première méthode que j'appelerai "sofware", utilise un logiciel de flash sous dos. Vous êtes sous linux? pas de soucis, moi aussi! Seul bemol, cette methode nécessite que votre ordinateur démarre au delà du bios.

          Vous aurez besoin pour cela d'une clé usb, une 128 suffira :)


          • Téléchargez le bios qui vous convient à cette adresse: http://macles.blogspot.com/p/acer-aspire-one-bios.html
          • Téléchargez UNetbootin: http://unetbootin.sourceforge.net/
          • Installez le :)
          • Dans UNetbootin, sélectionnez la distribution FreeDOS
          • Sélectionnez ensuite votre clef usb dans la liste des lecteurs usb (en bas) et validez.
          • Dezippez votre bios sur la clef usb.
          • Redémarrez l'ordinateur clef usb insérée.
          • A l'affichage de démarrage du bios, pressez F12 pour afficher le menu de démarrage.
          • Sélectionnez la clef usb.
          • Choisissez le démarrage sans drivers de freedos.
          • Vous êtes sous un environnement de type dos. Tapez C: puis entrée.
          • Tapez 3310.BAT (si vous avez pris le bios 3310 bien entendu).
          • Voilà ça flash, laissez le finir et redémarrer seul votre ordi. N'interrompez le processus sous aucun prétexte!
        2. Méthode "rude"

          C'est la méthode qui m'a sauvé plus d'une fois lorsque mon bios s'est effacé tout seul, et oui, c'est LE plus gros défaut de l'AAO, et non des moindres: écran noir au démarrage, le black screen of death :).

          Voilà la méthode, assez illisible que j'avais trouvé ici:
          http://forums.futura-sciences.com/materiel-hardware/277493-acer-aspire-one-150-ecran-noir.html#post2178832

          Je vous la traduis:


          • Téléchargez le bios qui vous convient à cette adresse: http://sites.google.com/site/maclesblogspotcom/
          • Dézippez le sur votre clef USB et renommez le fichier .fd en  ZG5IA32.FD (pas sur que ce soit nécessaire mais j'ai jamais eu envie de tester autrement ^^
          • Insérez votre clef USB dans le port de gauche.
          • Démarrez l'ordi en maintenant FN+Echap, maintenir ces touches jusqu'à que le bouton d'allumage clignote.
          • Lachez le touches et appuyez sur le bouton d'allumage pour lancer le flashing.
          • Voilà ça flash, laissez le finir et redémarrer seul votre ordi. N'interrompez le processus sous aucun prétexte!

        Installation d'Ubuntu Karmic Koala sur netbook Acer Aspire One

        Bonjour à tous!

        Dans cette entrée je vais vous expliquer comment installer une version d'Ubuntu compatible au maximum avec un Acer Aspire One 150, version vendue sous windows avec 1Go de ram et 160Go de disque dur. Ceci permettra d'avoir un contrôle plus abouti du ventilateur (le rendre silencieux), et surtout de faire fonctionner le wifi. Le reste fonctionne bien de base.



        Dans ce tutoriel vous aurez besoin au minimum d'un clef usb de taille 2Go (recommandée), d'une image d'Ubuntu Netbook Remix (de préférence), du logiciel UNetbootin. Une connexion internet est vivement recommandée. Cette manipulation a été faite à partir de Windows 7, mais je pense qu'elle est identique sous n'importer quel bon Linux :).

        1. Télécharger ou commander le cd d'installation

          Rendez-vous sur le site d'Ubuntu pour télécharger Ubuntu Netbook Remix: http://www.ubuntu.com/getubuntu/download-netbook

        2. Créer une clef USB d'installation

          Une fois l'iso téléchargé, il va falloir trouver un moyen de l'installer proprement. Il y a plusieurs méthodes, moi celle que je préfère c'est l'installation par clef usb grace à Unetbootin sous windows ou linux, que vous pouvez trouver ici: http://unetbootin.sourceforge.net/

          Pour l'utiliser c'est très simple, insérez votre clef usb (formattée et vierge de préférence), lancez unetbootin, choisissez le mode iso et indiquez l'emplacement de votre image ubuntu:


           
          UNetbootin sous windows par exemple

          Indiquez aussi l'emplacement de votre clef usb dans le champ "Drive". Validez par OK.

        3. Installer Ubuntu Netbook Remis (UNR)

          Redémarrez votre AA1 clef usb insérée. Pressez F12 lorsque l'on vous invite à appuyer sur une touche (lorsque l'écran s'allume :) ).

          Un menu apparaît, choisissez de démarrer sur clef USB. Le menu d'installation ubuntu s'affiche, choisissez de l'installer ou de simplement lancer le LiveCD, mais ce qui nous intéresse ici c'est l'installation ;)

          Je ne vous expliquerez pas comment faire cohabiter Linux et Windows sur le même disque dur ou comment faire vos partitions, je vous laisse libre de choix quand au déroulement de cette installation.

        4. Corrigez le WIFI qui ne fonctionne pas

          Alors, si vous avez le même modèle d'AA1 que moi, vous allez vous appercevoir que de base UNR ne gère nos drivers Atheros. Lorsque je l'ai installé pour la premère fois il n'y avait pas encore de solution à ce problème. Je vais vous expliquer comme installer des drivers fonctionnels désormais.

          Rendez-vous sur madwifi.org et téléchargez les derniers drivers dispo, à l'heure actuelle:
          http://snapshots.madwifi-project.org/madwifi-0.9.4-current.tar.gz
          Bien entendu, tout ce qui suit se passe sous ubuntu

          En ligne de commande, placez vous dans le répertoire dans lequel vous avex placé votre archive tar.gz.

          Tapez les commandes suivantes:

          tar xzvf madwifi-0.9.4-current.tar.gz
          cd madwifi-0.9.4-r4100-20090929
          make
          sudo make install
          sudo modprobe ath_pci
          

          Voilà, vous avez désormais un wifi qui fonctionne, c'est aussi simple que ça :)


        5. Réguler la vitesse des ventilateurs

          Un des (nombreux!) défauts de l'AA1, c'est le bruit que font ses ventilateurs. Sous windows il existe l'excellent AA1Ctrl qui fonctionnait bien sous mon Windows 7, mais je n'ai pas trouvé d'équivalence sous Linux. Voilà donc une marche à suivre qui je dois dire les a rendu bien silencieux chez moi, je ne les ai pas encore entendu pour tout vous dire! (j'espère que ça ne jouera pas trop sur la durée de vie du processeur).

          Pour cela nous allons avoir besoin de l'utilitaire qui va nous permettre de détecter notre bios. En ligne de commande:

          sudo aptitude install dmidecode
          

          Ceci installé, téléchargez ces deux fichiers:
          http://aceracpi.googlecode.com/svn/trunk/acer_ec/acer_ec.pl
          http://electronpusher.org/~rachel/acerfand

          Pour les rendre exécutables, tapez ceci:

          chmod a+x acerfand
          sudo cp acer_ec.pl acerfand /usr/local/bin/
          

          Lancez acerfand et regardez s'il est compatible avec votre bios:

          sudo acerfand
          sudo tail -f /var/log/syslog
          

          Si vous avec ce résultat, c'est que vous êtes bon pour un flashage de bios:





          Oct  9 02:04:36 lilput acerfand: acerfand 0.0x starting
          Oct  9 02:04:36 lilput acerfand: Detected bios version v0.3301
          Oct  9 02:04:36 lilput acerfand: Unsupported bios version v0.3301 found. Aborting.
          

          Sinon tout va bien, votre ventilateur devrait se taire. Sinon ce billet pour flasher le bios.

          Si vous choisissez le bios 3310, le même message que précédemment s'affiche. Il vous faut modifier le script acerfand en conséquence:
          BIOS_VERSION_3109="v0.3109"
          BIOS_VERSION_3114="v0.3114"
          BIOS_VERSION_3304="v0.3304"
          BIOS_VERSION_3305="v0.3305"
          BIOS_VERSION_3309="v0.3309"
          #add 3310 BIOS support
          BIOS_VERSION_3310="v0.3310"
          
          ...
          
          case "$BIOS_VERSION" in
                  "${BIOS_VERSION_3309}" | "${BIOS_VERSION_3310}")
                          #change: handle 3309 seperate 0xAF -> 0x20
          ...
          

          Pensez à lancer l'utilitaire au démarrage, pour cela plusieurs solutions, dont celle-ci:

          sudo gedit /etc/rc.local
          

          Et ajoutez cette ligne juste avant "exit 0":

          /usr/local/bin/acerfand

          Si vous avez besoin de compléments d'infos sur les marche à suivre que je vous ai fourni, voici mes sources:

          https://help.ubuntu.com/community/AspireOne/Ubuntu9.10#AOA150-1635

          https://help.ubuntu.com/community/AspireOne110L#Fan%20Control

        Twitter