mardi 24 décembre 2013

Tips n°3 - Oracle, compter le nombre de colonne dans les tables

Bonjour,

Aujourd'hui une petite astuce Oracle, et comment voir quelles sont les tables avec le plus de colonne ? Oracle vous propose donc d'utiliser une table system : ALL_TAB_COLUMNS

SELECT   table_name, COUNT (*)
    FROM all_tab_columns
GROUP BY table_name
ORDER BY COUNT (*) DESC

C'est tout simple, ca sert pas tous les jours, mais si vous aimez les statistiques vous aimerez cette requete :)

Joyeuse fetes !

vendredi 20 décembre 2013

Tips n°2 - C# Conversion quote, caractère javascript/jquery

Bonjour à tous,

Je continue sur les petites astuces du quotidien au niveau du développement. Pour aujourd'hui une conversion des chaines de caractères depuis C# vers de javascript/jquery.

Souvent  les apostrophes ne passent pas au niveau des variables JS, du coup il faut faire des conversion dans tous les sens ... avec des vieilles expression régulieres. Clairement je ne suis pas fan !

Microsoft a donc fait encore une fois les choses correctement en proposant une fonction bien pratique mais, méconnu : HttpUtility.JavaScriptStringEncode

Du coup l'usage est vraiment tres simple :

var testAffiche = HttpUtility.JavaScriptStringEncode(Model.Texte);

Ce qui se traduit en code Html par :

... RATION / \\ \u0026\u0027 ...


Comme d'hab c'est une astuce qui m'était inconnue, donc si vous utilisé C#, MVC et javascript, ceci peu vous être d'une grande utilité :)

Coding 4 Fun

vendredi 22 novembre 2013

Compilation des vues MVC (view)

Bonjour,
Si comme moi vous utiliser MVC pour vos applications WEB avec C#, vous devriez connaitre ce mot clé : MvcBuildViews.
Pour les autres, c’est tout simplement le moyen de vérifier par compilation que l’ensemble de vos vues de votre Projet MVC ne comporte aucune erreur de compilation. Attention, cette opération est assez longue a s’exécuter.
Pour faire cette modification, il suffit de modifier votre fichier project (.csproj), sous l’élément propertygroup, rajouter la clé xml suivante :
Lancer la compilation classique de MVC dans Visual studio, et la miracle, dans la fenêtre de sortie vous devriez voir apparaitre la ligne suivante :

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v temp -p C:\MonSiteMVC\bin\maDll.dll

Maintenant, le constant :
  • changer a chaque fois le projet pour vérifier la compilation des vues c’est super chiant (passer true/false), et risque d’oubli
  • laisser a true, c’est super chiant, car la compilation prend a chaque fois 3 Min !!
  • laisser a false, c’est pas propre car on ne voit donc pas les erreurs sur les vues (surtout si il en existe beaucoup)
Du coup, une solution toute simple existe, c’est le lié l’élément XML a une configuration. Dans notre cas, ce que je conseil est d’associer :
  • Config DEBUG : MvcBuildViews : False
  • Config RELEASE : MvcBuildViews : False

Pour cela, il faut éditer le fichier projet (csproj) en rajoutant 2 sections :
Ps : si vous avez un serveur d’intégration du style TFS (Visual Studio Online de son nouveau nom) ou TeamCity, il suffit de lancer votre build en mode Release pour obtenir la compilation des vues automatiques.

Voila, j’espère être assez clair.
Coding4Fun

mercredi 9 octobre 2013

Tips n°1 - C# Comparaison de date dans l'heure (DateTime)

Bonjour à tous,

Je me lance dans les petits tuyaux de tous les jours, sur C#. (on verra si cela est suffisant, assez de matières...)

Aujourd'hui une petite astuce est la comparaison du format DateTime mais sans les horaires.

Je souhaite avoir la liste des produits qui ont été créer aujourd'hui par exemple.Je doit faire :

listeProduits.where(p => p.Creation.Date == DateTime.Today.Date)

En fait la comparaison va se faire en prenant l'heure 00:00:00.

Remarque :
DateTime.Today = DateTime.Today.Date = DateTime.Now.Date = 09/10/2013 00:00:00

Je trouve que c'est une astuce toute simple que je ne connaissait pas. Et si vous développez depuis un moment vous devez etre au courant que la comparaison de date (C#, JS, SQL), ben c'est toujours la merde ^^.

lundi 7 octobre 2013

Injection de dépendance sur les controllers WebApi MVC (ApiController)

Bonjour à tous,
Dans un précédent article, je vous parlais de la mise en place de WEB Api avec les instructions MVC 4. Dans l’article, je ne parlais pas d’injection de dépendance, très souvent utilisée avec NHibernate par exemple (ce qui est mon cas).
Pour cela quelques étapes sont nécessaire pour faire le paramétrage de cette injection. MVC a déjà tout prévu pour nous :)
  • Modification du Global.asax
  • Utilisation de IHttpControllerActivator
  • Utilisation de Windsor Castle
Avant de rentrer dans le vif du sujet, attardons nous un petit moment sur l’injection de dépendance. Comment résumer cette notion sur un blog ? Hum pas évident. pour ma part je l’expliquerai avec une boite (container – conteneur en français ^^) qui connait les définitions des (de nos) objets.
De ce faite, c’est ce container qui construira/fabriquera/instanciera a la demande les objets nécessaire a l’exécution du code. L’intérêt de cette méthode est de rendre autonome au maximum nos classes (dépendance). Généralement cette dépendance, se voit au constructeur; ce dernier disposera alors comme paramètre l’ensemble des dépendances a résoudre lors de l’instanciation.
Ce n’est pas une notion facile a appréhender / comprendre. Moi même j’ai eu beaucoup de mal au début. Cependant, l’intérêt est tout de suite parlant dès lors ou vous avez a faire a des projet utilisant, ou nécessitant l’utilisation de ce mécanisme.

Global.asax

Le point d’entré de l’application permet d’exécuter le paramétrage de notre/nos injection(s). Dans notre cas, nous alors donc remplacer la “routine” du Controller sur nos  Web API, par notre propre “Activator” qui se positionnera donc entre la demande de la requête et son traitement. Permettant ainsi de résoudre, et de fournir le contrôleur adéquate (comprendre: Castle.Windors instanciera alors notre Controller avec les dépendances et le retournera a MVC).
Il est important de noter qu’il faut distinguer les routes de type WebAPI et les autres (mvc classique). L’injection ne sera pas la même, on passera alors par la fabrique de controller (ControllerBuilder.Current.SetControllerFactory(controllerFactory) )

protected void Application_Start()   
{

[…]

GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Dispatcher.IHttpControllerActivator), new WindsorCompositionRoot(container.Kernel));

}

IHttpControllerActivator

Une fois l’appel fait dans notre Application_Start, nous fournissons alors a notre Activator le Kernel (notre container de référence), pour que ce dernier puisse piocher dedans afin de faire l’instanciation.
L’interface est assez simple; 2 méthodes
- Create : création du controller en question, on va résoude (resolve) dans notre container la référence, et retourner ce dernier.
- Le Dispose, il faut lors de la fin d’execution de la requete HTTP (webapi) que les ressources acquises soient libérées. On implemente alors un classe Disposable, utilisable a l’aide de RegisterForDispose.
public class WindsorCompositionRoot : IHttpControllerActivator   
{    
    private readonly IKernel kernel;

    public WindsorCompositionRoot(IKernel kernel)   
    {    
        this.kernel = kernel;    
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)   
    {    
        var controller = (IHttpController)this.kernel.Resolve(controllerType);

        request.RegisterForDispose(new RessCtrlRelease(this.kernel, controller));

        return controller;   
    }

    private class RessCtrlRelease : IDisposable   
    {    
        private readonly IKernel kernel;    
        private IHttpController httpController;

        public RessCtrlRelease(IKernel kernel, IHttpController httpController)   
        {    
            this.kernel = kernel;    
            this.httpController = httpController;    
        }    
        public void Dispose()    
        {    
            this.kernel.ReleaseComponent(this.httpController);    
        }    
    }

}

Je ne sais pas si j’ai été suffisamment clair, c’est un sujet assez vague et complexe, mais j’espère que les bouts d’informations que j’ai mise en place permettront d’éclaircir et d’aider les développeurs que nous sommes.
Parce que beaucoup d’information existe sur la toile, un article m’a beaucoup aider : http://blog.ploeh.dk/2012/04/17/InjectingHttpControllerContextWiththeASP.NETWebAPI/
Articles en relation :

lundi 5 août 2013

Mise en place de Web API - MVC4


Bonjour à tous, aujourd’hui dans ce billet nous allons voir et appréhender une nouveauté de MVC 4 qui est les WEB API. Pour faire simple, est le WEB API de MVC4 permet principalement de faire du REST (REpresentational State Transfer) afin de piloter les données envoyées depuis différentes sources :
  1. le serveur reçoit un requête HTTP (http://mon-site.com/api/GetProducts)
  2. le serveur traite la demande (base de données, calcul etc…
  3. le serveur renvoi la requête sous forme XML/JSON au client.

mardi 30 juillet 2013

Recherche JQuery (Ctrl+F)


Aujourd’hui un petit bout de JavaScript pour effectuer une recherche dans un bloc HTML. L’exemple montre comment rechercher une occurrence (sans respect de la casse) dans un bloc, afficher le nombre de résultat, et passer a l’occurrence suivante en appuyant sur ENTREE.

mercredi 24 juillet 2013

Ajout d’item dans le bouton droit windows (shell)


Aujourd’hui nous allons voir comment ajouter un item dans le contexte menu Windows lors du clic droit.
image

mardi 22 janvier 2013

Mise place des liens externe sur Blooger

Astuce toute simple, pour que tous vos liens ouvrent une nouvelle fenetre ou onglet sur votre site Blogger sans avoir a ajouter chaque fois target="_blank" dans vos URL.

Il vous suffit de modifier votre Modèle de page (en HTML) et d'ajouter dans le HEAD de votre modèle la ligne suivante :

[...]
 
[...]

Voila.

Objet List (IList) et référence (pointeur)

Petit billet concernant les références des objets en C#.

Je viens de constater un principe auquel je n'avais pas fait attention, a savoir la modification (par référence) d'un objet présent dans une IList.

Savoir si les clés étrangères (FK) sont présente (Oracle)


Pour connaitre les tables qui dispose ou non de foreign key (clés étrangères –FK). j’ai conçus une petit fonction Oracle pour déterminer l’existence sur une table d’une FK par rapport a un champs.

lundi 21 janvier 2013

Merge Oracle et Taod


Ou comment mettre a jour des données d’une base sur une autre base oracle (ou un autre schéma)… Cas qui arrive assez fréquemment sur les environnements de production, de test/recette, de développement et d’intégration.

Toad est un formidable outil pour tous ce qui touche la base de données. Il permet entre autre d’utiliser une panoplie de raccourcis très pratiques.

Voici la liste des possibilités fourni par Toad :
image
  • Access Database File
  • Delimited Test
  • Excel File / Excel Instance
  • Fixe Field Spacing
  • HTML Table
  • Insert Statements
  • Merge Statements
  • SQL Loader
  • XML (plain) / XML (with XSL)

Aujourd'hui le MERGE Statement :

Préambule : Je veux mettre a jour mes données d’une table de l’environnement de production sur l’environnement de Test (sans truncate, drop ou autre)

Requête sur l’environnement de PROD

select * from NATIONALITE where rownum < 2

Requête générée par notre ami Toad :

  • Génération du mot clé MERGE
  • Utilisation d’une requete ‘Seclect’ fictive
  • Comparaison d’égalité grace a la clé primaire (PK, primary key)
    • Si Ok alors réalisation d’un UPDATE
    • Si NOk alors réalisation d’un INSERT
MERGE INTO NATIONALITE A USING
 (SELECT
  'YUG' as "NATIONALITE_ID",
  'YOUGOSLAVE' as "NATIONALITE_LIBELLE"
  FROM DUAL) B
ON (A.NATIONALITE_ID = B.NATIONALITE_ID)
WHEN NOT MATCHED THEN 
INSERT (
  NATIONALITE_ID, NATIONALITE_LIBELLE)
VALUES (
  B.NATIONALITE_ID, B.NATIONALITE_LIBELLE)
WHEN MATCHED THEN
UPDATE SET 
  A.NATIONALITE_LIBELLE = B.NATIONALITE_LIBELLE;

COMMIT;

C’est tout simple avec Toad, cela facilite grandement la tache sur ce genre d’opération. (Pour le coup, un truncate, et Insert Statement aurait bien également bien fonctionner)

mardi 8 janvier 2013

Optimisation Oracle Index et tables procédures (étape 2)


Il y a un petit moment j’ai mis un article concernant les requêtes permettant d’optimiser les tables et les index dans Oracle.

Ce script est très pratique, et je l’ai fait un peu évoluer afin de le rendre “automatique”. Je vous présente donc la monture v2 en en faisant une procédure. Cette dernière n’a rien de révolutionnaire, quelques curseurs pour parcourir les statements et les exécuter :

CREATE OR REPLACE PROCEDURE SU.REBUILD_INDEX (ma_table IN VARCHAR2)
IS
   CURSOR CURS_REBUILD
   IS
        -- rebuild  
    select 'ALTER INDEX ' || index_name || ' REBUILD ' as txt_sql from user_indexes  where UPPER(table_name) = UPPER(ma_table) and INDEX_TYPE!='LOB';
    R1         CURS_REBUILD%ROWTYPE;

   CURSOR CURS_STRUCT
   IS
        -- validate structure
    select 'ANALYZE INDEX ' || index_name || ' VALIDATE STRUCTURE ' as txt_sql from user_indexes  where UPPER(table_name) = UPPER(ma_table) and INDEX_TYPE!='LOB';
    R2         CURS_STRUCT%ROWTYPE;

   CURSOR CURS_STAT
   IS
        -- stat Analyse
    select 'Analyze Table ' || UPPER(ma_table) || ' Estimate Statistics ' as txt_sql from dual;
    R3         CURS_STAT%ROWTYPE;
      
BEGIN
    ---------rebuild  ----------------------------------------------------
   OPEN CURS_REBUILD;
       LOOP
          FETCH CURS_REBUILD INTO R1;        

            EXIT WHEN CURS_REBUILD%NOTFOUND;

            EXECUTE IMMEDIATE R1.txt_sql;
       END LOOP;
   CLOSE CURS_REBUILD;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 1 ok : TABLE : ' || ma_table);
      
   ----------validate structure---------------------------------------------------
   OPEN CURS_STRUCT;
       LOOP
          FETCH CURS_STRUCT INTO R2;        

            EXIT WHEN CURS_STRUCT%NOTFOUND;

            EXECUTE IMMEDIATE R2.txt_sql;
       END LOOP;   
   CLOSE CURS_STRUCT;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 2 ok : TABLE : ' || ma_table);
   
   -----------stat Analyse--------------------------------------------------
   OPEN CURS_STAT;
       LOOP
          FETCH CURS_STAT INTO R3;        

            EXIT WHEN CURS_STAT%NOTFOUND;

            EXECUTE IMMEDIATE R3.txt_sql;
       END LOOP;   
   CLOSE CURS_STAT;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 3 ok : TABLE : ' || ma_table);

END;
/