Archive for the ‘Réflexion’ Category

Speech au prochain DDD Users’ Group Paris

mardi, avril 23rd, 2013

LogoDDDFRGrâce à Tomasz Jaskula qui l’a repris en main, le Domain Driven Design Users’ Group Paris est enfin actif régulièrement.

J’ai l’honneur d’y présenter un speech lors de la prochaine session, mardi 30 avril 2013 : Il n’y a pas de Bon Modèle Métier. C’est pratiquement le même que celui que j’avais animé à Devoxx France  2012.

J’y démonte quelques idées reçues sur les Modèles Métiers et surtout, sur la façon de les construire. Le lien avec le DDD ? La notion centrale de « Bounded Context ».

Si vous n’étiez pas à Devoxx l’an dernier ou si vous y étiez et que vous n’avez pas tout compris, je serai ravi de vous y retrouver.

 

 

« Ouvert » n’est pas « Vrai »

lundi, mars 5th, 2012

J’ai assisté, il y a quelque jours, à une soirée organisée à la Cantine sur l’Open Data vu par les candidats à l’élection présidentielle. J’ai été agréablement surpris par le niveau de compétences sur le sujet des différents intervenants (chaque candidat déclaré, sauf le FN, avait dépêché un représentant qui parlait au nom de son champion).

La soirée était finalement relativement consensuelle : tout le monde trouve que l’Open Data, c’est bien ;-). Le seul point (un peu) clivant était en fait le type de licence que chacun recommandait de mettre en place pour protéger les contenus mis à disposition. Les uns (les plus à gauche) préconisent une licence très restrictive quant à l’utilisation commerciale des données (licence virale de type GPL dans le monde de l’Open Source). A l’autre bout, des licences plus « libérales » permettent toute utilisation même commerciale des données, à condition de citer la source (c’est le cas de la licence ouverte qui régit les données publiées par la mission etalab). Entre les deux, des licences permettent l’utilisation commerciale pour proposer des services à valeur ajoutée tout en imposant le « partage à l’identique » et la redistribution des données produites (c’est le type de licence ODbL utilisée par la Mairie de Paris pour ses publications).

Je ne suis pas un expert, mais il me semble que le problème de ce dernier type de licence (un peu chèvre et chou) est de fixer la limite entre Création Produite et simple Base de Données dérivée, la seconde obligeant un partage à l’identique, la première pouvant se limiter à la mention de la source. Qui décide et comment ?

En fait si je fais ce billet, c’est que j’ai été surpris que personne ne fasse mention d’un point qui me semble pourtant essentiel : comment garantir l’intégrité de l’information produite à partir des données ouvertes utilisées ?

Je m’explique. La donnée ouverte brute a une caractéristique intéressante : elle est mise à disposition par l’état ou un organisme public ou parapublic qui lui confère une certaine garantie de qualité liée à la confiance qu’on peut accorder à son producteur. C’est ce qui fait dire à beaucoup de gens que l’Open Data, en permettant à chaque citoyen d’accéder directement aux données « à la source » l’aidera à prendre des décisions éclairées et à savoir si les politiques lui mentent ou non (chacun pourra faire son « fact checking » personnel). L’Open Data serait donc un grand progrès pour la démocratie.

Je suis assez dubitatif : la donnée n’est pas l’information. Ne serait-ce que parce qu’elle est extrêmement volumineuse, la donnée ouverte n’est pas manipulable ni a fortiori directement interprétable par le citoyen. Pour faire un parallèle avec un monde que je connais mieux, on a besoin de requêter, manipuler, agréger, transformer la donnée pour créer l’information nécessaire à la prise de décision (c’est justement le propos de l’informatique décisionnelle).

Autrement dit, les citoyens devront passer par des intermédiaires qui proposeront cette information agrégée (et donc interprétée). Mais qui va contrôler cette interprétation ? Qui va garantir que sous couvert d’une donnée objective issue directement de l’INSEE par exemple, ne se cache pas une information biaisée ? On le sait, il est extrêmement facile de « faire dire ce qu’on veut aux chiffres ». Il n’y aura pas, ici, de règles déontologiques (celles qui encadrent les instituts de sondages) ou d’éthique professionnelle (celle des bons journalistes par exemple) pour freiner, ou au moins expliciter, les interprétations partisanes. Et l’intégrité ne va pas de soi.

J’applaudis des deux mains tout ce qui peut encourager l’état à nous restituer notre propriété (ces données dont nous payons la production avec nos impôts). Je suis persuadé que nous avons là une nouvelle source de création de valeur et donc de richesse. Mais je n’y vois, malheureusement pas, le grand pas en avant démocratique promis par tous les speakers de la soirée.

Software Craftsmanship, ou le marketing de l’échec

jeudi, février 10th, 2011

Suite à un intéressant article de Nicolas Martignole, ça buzze beaucoup ces temps-ci autour du Software craftsmanship et ça me donne envie de réagir. En particulier quand je vois les tentatives de récupération (je n’ai pas mis de lien pour ne pas les encourager ;-).

Le mouvement du Software Craftsmanship constate que les bons logiciels sont faits par de bons programmeurs. Notre profession aura atteint la maturité lorsque les bons logiciels pourront être faits par de mauvais programmeurs ou même, sans programmeur du tout.

Le Software Craftsmanship : commercialement anxiogène

Comment terroriser nos clients : en leur expliquant que la seule manière de leur apporter de la valeur c’est de réunir des développeurs expérimentés, membres de la communauté des Software Craftsmen (sorte de compagnonnage). Pour que le projet fonctionne il leur faut l’élite : tous ont fait leur Tour de France et réalisé leur Chef d’Oeuvre. Sinon, c’est l’échec assuré.
En toute logique, le client part en courant acheter un ERP (au fait, qui met en place les ERP ? En tout état de cause pas des Software Craftsmen. Pourtant ça fonctionne plutôt pas mal, et ça crée de la valeur chez leurs utilisateurs).
Je pense qu’un client sera bien plus rassuré si on lui explique que le projet ne repose pas exclusivement sur des individualités, mais sur une entreprise qui, par les processus mis en place, par sa capacité à recruter, mais aussi, à former et à encadrer, par ses outils et ses infrastructures, lui garantit une qualité de service éprouvable et surtout, répétable.
C’est justement la différence entre une boîte qui « vend des CV » (donc des individus) même bons, et une boîte qui vend un savoir faire d’entreprise.
Si ma boîte n’apporte rien de plus à mon client que la somme des qualités individuelles de ses salariés, je passe freelance immédiatement.

Le Software craftsman et le Renard (Jean de la Fontaine)

L’idée d’une « Communauté de professionnels » est intéressante par son aspect « partage de bonnes pratiques » : c’est exactement ce que je recherche en participant à des conférences ou à des séminaires professionnels. Elle l’est beaucoup moins par son aspect ségrégationniste : il y aurait donc deux sortes de gens. Ceux qui en sont, et les autres.

Evidemment tout ce discours s’adresse aux premiers. Ceux qui adhèrent aux valeurs et qui ont signé le Manifeste. Ceux qui sont de « bons » artisans qui, jours après jour cisellent leur code pour en faire un chef d’oeuvre.
Les bons programmeurs seraient donc les gardiens des bonnes pratiques qui se transmettraient leur savoir faire « de bouche de druide à oreille de druide ».

Sauf qu’en fait, il n’y a pas de ségrégation : tout le monde se reconnait dans le manifeste. Tout le monde veut (ou croit) être un partenaire productif de son client, membre d’une communauté de professionnels qui apportent de la valeur en créant du bon logiciel (sic).

C’est en fait une grosse ficelle. Il s’agit simplement de développer l’esprit de corps.
Pour une SSII, faire l’apologie du Software Craftsmanship, c’est du clientélisme. C’est flatter la communauté dans le sens du poil en espérant ramasser des CV.
Et Uncle Bob, dans ses conférences comme dans ses posts est sur la même longueur d’onde. Il espère mettre dans sa poche son auditoire en lui jouant du violon : « comme vous ête forts, vous les programmeurs quand vous vous efforcez de faire de la belle oouvrage ».  Ca marche plutôt bien, il parait qu’il ya même des SSII qui l’écoutent… Cette leçon vaut bien un fromage sans doute.

Software Craftsmanship : un constat d’échec

Quelqu’un se souvient-il de ce que signifie le premier « I » de SSII ? « Ingénierie » ! Nous sommes censés être des ingénieurs. Pas des artisans.Et notre métier est considéré comme « industriel ».

Et bien en fait non. Nous sommes encore (malgré un demi siècle d’existence) un métier où le savoir faire individuel reste plus important que le processus et l’outillage.
L’existence même d’un mouvement comme le Software Craftsmanship est un aveu d’échec pour notre profession. Ca me désole mais, je dois bien l’admettre, on ne sait pas, aujourd’hui, fabriquer du logiciel comme on fabrique des voitures. D’ailleurs, si c’était le cas, il n’existerait pas de « petites SSII ». A-t-on déjà vu un « petit constructeur automobile » ? Oui, il y a un siècle, quand le métier balbutiait.

Le Software Craftsmanship est donc un pis aller pour pallier notre incapacité à industrialiser la production de logiciel. Et bien mon objectif personnel n’est pas de me complaire là dedans mais plutôt de tenter de faire changer les choses !

A contrario d’une réaction au post de Nicolas, j’ai l’impression que les initiatives de type Centres de Service vont plutôt dans le bon sens de ce point de vue. L’industrialisation d’un processus de production, la mutualisation des moyens ne sont pas antinomiques du développement du savoir faire individuel des programmeurs, au contraire. En créant un environnement communautaire et en lui donnant plus de confort, il favorise le partage des connaissances au quotidien, il permet la répétabilité et l’amélioration des processus, il autorise l’investissement dans l’outillage. Le seul inconvénient est le possible éloignement du client ou de l’utilisateur final qui peut être compensé par une organisation distribuée (par exemple des products owners délégués qui font la colle). Et évidemment, le MDA est un autre avatar de la même ambition industrielle.

Je voudrais tout de même terminer sur une note un peu plus positive par rapport au Software Craftsmanship. Ne vous méprenez pas, je reconnais bien volontiers (mieux, j’apprécie et surtout je revendique), le caractère créatif de notre métier. Je suis sensible à l’esthétique, voire à l’élégance d’un programme (ou à sa laideur). Et, pratiquant le coaching, je suis souvent amené à tenter de partager mon expérience avec de jeunes Padawan. Je suis juste un peu déçu, de voir que c’est ce genre de sujet plutôt passéiste, qui tient le haut du pavé dans notre profession. J’aimerais bien pouvoir m’enthousiasmer pour des idées vraiment nouvelles, des « changements de paradigmes » ou des « révolutions technologiques » plutôt que pour ce qui me semble fortement teinté d’un conservatisme confortable.

PS Les commentaires sont réactivés

QCon, Models and Integrism

mardi, mars 30th, 2010

Cet article est disponible en français sur le blog d’Objet Direct.

logo_qcon8I am just coming back from my three days of escape at QCon London. As always, an opportunity to step back, take a breath, open my eyes on what others do, how they work. I can there feel the trends and try and guess what my job will look like, next year and even after.

I promise, I will sum up the best moments and the keypoints of the conference. But before I go on, I would like to react off the cuff on something that seems important.

However, this year, I come back with a bad taste in my mouth (don’t misunderstand : as always, beer was great !). A taste of bitterness and anger.

Modeling is not only banned from QCon (as it has already been in the past two years), it has become a dirty word.

Code is the all-time star, which is fair, considering development is the conference main concern. Pointing at yesterdays mistakes seems to be quite healthy too (especially “overmodeling” syndrom which used to be an obvious sign of lack of confidence in the development process).

But I can’t stand to hear stars like Uncle Bob (writer of an UML for Java Programmers in 2003 !) saying that “as we all know, models are completely useless”, or Dan North (who gave an excellent talk besides) considering that the use of a modeler is a useless “complification”. It sounds to me like hypocrisy, demagoguery or fundamentalism (which is not far from stupidity).

The only talk I attended which was positive about modeling was Eric Evans’s speach about agile design. Nevertheless, he did not use the word Modeling but the more consensual Design. I think he had the right word: he said that developer community had “thrown away the baby with its bath water”.

I had the feeling of being in a religious circle attending professions of faith.

On one hand, the code fundamentalists, pure monotheists, nostalgic of a mythical golden age when the developper used to be the one and only master of its production, communicating directly with God (the Product Owner), custodian of a millenium knowledge (the Software Craftsmanship) taught by guru’s mouth.

And there are those UMLists, seen as dangerous unfaithful visionaries, whose delirium corrupted the perfect world of the above. These ones have to be exterminated by all means. I felt like being under a fatwa !

As always when there are problems, we need to find scapegoats. The models (and those who make them) seem to play this role today: symbols of the « Big Upfront Design », they are being the responsible for the failure of big projects. The models are seen as pure documentation artifacts: modeling would be a time consuming and unnecessary (or even perverse) activity, especially in an agile world.

In such a surrounding, I was really ashamed of showing my business card: besides my name you can read “MDA business line manager”. Like having an STD!

Yet it seems to me that modeling, instead of developping, allows to:

  • analyze a problem
  • compress its complexity
  • give a global view
  • abstract from technology
  • communicate

My brain is not big enough to do all this on its own. I need UML (or any other formalism) both as a crutch, a whiteboard, a memory expansion, a pair of glasses and a math formulary.

Modeling is not against developing (not to mention MDA that combines both). Modeling simply helps developing better.

Moreover, the code itself IS a model (“system of abstractions that describes selected aspects of a domain”) as an UML diagram is. Just a little more verbose (and a little more easy to execute).

Maybe this gap is only a symptom of various thinking modes: a French analytical thought (after all, Descartes and Merise are French creations!) vs. a pragmatic Anglo-Saxon thought.

I like to think there is good in both worlds and both complement each other nicely. By the way, it is what I think is the main interest of our job: to analyze a problem in order to be able to computerize its solving. This is what renews my daily motivation: how can I put the complexity of the world in a (good) program.

2011/02/15 Comments have been re-opened.

Une syntaxe concrète pour ASL

mercredi, octobre 22nd, 2008

image Pas trop tôt ! L’OMG a enfin proposé un RFP pour une syntaxe concrète pour ASL (Action Semantics Language). Dit comme ça ça ne fait pas trop rêver :-) Pourtant c’est depuis longtemps un de mes dadas et un sujet dont je parle régulièrement dans mes présentations/séminaires MD.

La norme UML2 définit une syntaxe abstraite (un méta-modèle) pour décrire les actions sur un modèle statique : ASL. C’est ce méta-modèle qui est derrière une bonne partie des diagrammes dynamiques d’UML.

Autrement dit, aujourd’hui, pour décrire un comportement en UML (le contenu d’une méthode par exemple) on dispose des diagrammes dynamiques (activités, séquence, vue d’ensemble des interactions) mais pas d’un langage de programmation (une syntaxe concrète). Même si aucune norme n’existe, certains outils (peu finalement) incluent leur version propriétaire d’un tel langage :

Pourquoi suis-je si intéressé par le sujet ? A mon avis l’absence d’un tel langage dans les modeleurs actuels est un des freins majeurs à l’adoption de démarches MD.

Je m’explique : un modèle source d’une approche MD (le PIM en MDA), pour permettre de générer un pourcentage raisonnable du code (>50% sinon on est pas vraiment centré sur le modèle), doit inclure l’aspect comportemental (les règles de gestion du domaine par exemple).

En théorie il y a tout ce qu’il faut dans UML pour modéliser un algorithme avec les diagrammes dynamiques.

Dans la réalité celui qui a déjà essayé sait que l’approche n’est pas pertinente ! Si on veut pouvoir produire le code cible à partir de ces diagrammes ils doivent être équivalents à du code, c’est-à-dire être complets et extrêmement rigoureux.

Or les diagrammes dynamiques d’UML n’ont pas été faits pour être compilés : ils sont très difficile à maintenir et surtout, leur syntaxe, telle qu’implémentée dans les modeleurs, est toujours incomplète et la plupart du temps beaucoup trop laxiste.

Une syntaxe concrète (i.e. un langage de programmation) associée à ASL suffirait donc pour non plus modéliser, mais programmer en UML !

Avantage supplémentaire de l’approche : on peut simuler, et donc tester, ces méthodes avant même de disposer des transformateurs vers la plate-forme cible.

On espère que (pour une fois à l’OMG !) cette RFP donnera lieu rapidement à un standard dont les éditeurs s’empareront.

Wake Up REST à la Cantine

mardi, septembre 30th, 2008

image J’ai eu la chance de participer jeudi matin (25/09) à une nouvelle initiative de Didier Girard (au fait, merci Didier), grand animateur de la communauté des architectes. Un « Wake Up » : ambiance conviviale autour d’un café à la Cantine (un peu tôt pour la bière tout de même !) pour une rencontre qui se voulait un brin polémique. L’idée était de nous faire réagir à l’arrivée de REST dans les architectures Web.

Didier nous présente REST comme un retour aux sources : finalement le web comme outil de publication documentaire à fait ses preuves, pourquoi ne pas voir une application comme un fournisseur de ressources (vues logiques sur les données) mises à disposition par les applications. Chaque ressource peut-être lue (GET), mise à jour (POST), créée (PUT) ou supprimée (DELETE) via une opération HTTP standard. Un des intérêts, faciliter la mise à disposition des données du SI (agrégée à la demande via des portails) et susciter de nouveaux usages.

Retour de balancier : la SOA voyait l’application comme fournisseur de services, les données n’étant que les valeurs de sortie des-dits service, REST nous propose une vision duale de la SOA, où les traitements sont implicites (une donnée est dans un état qui est gouverné par la dernière requête qui y a accédé).

Comme je l’ai dit lors de notre discussion jeudi, j’ai encore du mal à voir la valeur ajoutée, ou plutôt, j’ai l’impression que l’architecture REST, comme la SOA, est réductrice : les applications de gestion (celles sur lesquelles je travaille) sont plutôt conçues par rapport aux processus qu’elles automatisent et donc, centrées sur des activités métier (qui correspondent aux cas d’utilisation de l’application). Seules exceptions, les Référentiels, responsables de garantir la cohérence des données de références du SI ne fournissent souvent que des services CRUD (justement ceux cités plus haut). REST serait l’architecture adaptée à la mise à disposition en architecture web des Référentiels du SI ?

Je pense surtout qu’on tourne en rond ! Au « commencement » on publiait des documents sans état (web 1.0). On s’est rendu compte que pour faire des « vraies » applications, on avait besoin de publier des services (avènement de la SOA). On trouve ça trop compliqué (à juste titre) et on revient à la publication des données.

En fait quel est le besoin ? C’est la notion de « formulaire » au sens large : des données affichées + des traitements associés (les boutons). Suivant le cas, l’intérêt de l’utilisateur est plutôt centré sur les données ou sur les traitements.

Dans le cas général, cette chose étrange qui réunit des données et des traitements, on pourrait par exemple l’appeler un « objet » et se demander comment le publier sur le web…

Vivement la prochaine fois pour un Tribunal du SI ;-)

Google Developer Day Paris

jeudi, septembre 25th, 2008

image J’ai participé la semaine dernière (18/09), comme spectateur, au passage à Paris du Google Developer Day.

Un petit retour rapide sur deux des présentations auxquelles j’ai assisté :

Android

J’ai eu envie d’en savoir un peu plus sur Android, un des buzz à la mode. Malgré un présentation plutôt sympa, pas d’annonce fracassante ni d’exclu juteuse. On n’a même pas pu voir le G1 « en vrai » !
Petite confidence « off » du conférencier : « j’ai un iPhone et un G1 et je préfère quand même l’iPhone » :-)

Un truc très sympa : un gagnant français du concours de développements Android (Android Developer Challenge) organisé par Google à parlé de son appli : un central de gestion de covoiturage (avec paiement éventuel et gestion de blacklist) intégrant la géolocalisation. A suivre probablement.

Au passage le concours en question, très bien doté puisqu’au total, ils ont distribué 5 millions de dollars, leur a permis de se constituer une logithèque de qualité (~2000 softs) avant même la sortie du mobile !
La vraie question est : nous, développeurs d’applis de gestion, devons-nous nous pencher sur le développement mobile ? Devons nous investir, nous former ?

Autant vous le dire, la présentation ne m’a pas apporté la réponse :-(

M2C : même si le rapport au mobile est aujourd’hui très « personnel » voire privé, il me semble que son coût extrêmement faible au regard de la technologie qu’il embarque devrait (moyennant un peu plus d’imagination que ce à quoi nous avons habitué nos clients) nous permettre d’explorer de nouveaux « use cases ». Désolé, ça reste vague, mais je pense que ça viendra probablement de la BI pour qui la diffusion d’informations, leur présentation, la dimension « aide à la décision » devraient être des moteurs. Je vais en causer avec mes voisins de bureau

Google App Engine

La présentation pour laquelle j’étais essentiellement venu m’a laissé sur ma faim. Il m’a semblé que les deux conférenciers (non « Googliens ») avaient juste passé deux heures de plus que moi sur le sujet (j’avais téléchargé le SDK la veille et déroulé le « Hello World » : 10 mn montre en main) ! Ils ont déroulé le Hello World en une demi-heure puis passé en revue les services disponibles. A leur décharge, on ne peut pas dire que Google nous « arrose » d’informations sur le sujet !

Pour résumer, qu’est-ce que le Google App Engine ?

  • Vision commerciale : c’est l’offre « cloud computing » de Google (essentiellement en réponse à EC2 d’Amazon).
  • Vision technique : c’est un serveur d’application hébergé exclusivement chez Google et qui s’appuie sur son infrastructure et met à disposition ses services : authentification, mail, persistance dans « BigTable » (LA base Google), accès aux Google Apps…

Concernant la technique, plusieurs points peuvent faire « tiquer » : un développement pour Google App Engine est exclusivement pour Google App Engine ! Google n’a pas eu la volonté d’implémenter, avec ses ressources, un serveur d’appli « standard » (J2EE ?). Tout est un peu « exotique » : l’authentification nécessite d’avoir un compte Google (la page d’authent est la même que pour votre GMail), la base n’est pas relationnelle, le langage de programmation est Python… et, aujourd’hui, aucune solution connue (en tout cas utilisée dans ma boîte, Objet Direct) ne permet de développer facilement (c’est le point important !) des IHM web pour GAE.

Ca veut dire, investir pas mal pour un business à peine émergent (GAE n’existe que depuis avril !).
La donne va changer dès que les API java sortiront (ce qui ne devrait tout de même pas tarder, même si, même sous le sceau du secret, ils ont refusé de nous dire quand !).
Il est donc urgent d’attendre (mais pas longtemps, j’espère).

Une chose très sensible : ce sont des maniaques du secret. Je pense que même après douze bières, il est impossible de leur faire avouer quand java sortira sur GAE. Il doivent avoir un flingue dans le dos (et en tout état de cause, ils sont très, très « briefés »).
A part ça je confirme que l’accueil était très sympa et l’esprit (faussement !) startup affiché (allez voir les photos, il y a même une preuve que j’y étais !). Une bonne occasion de faire du networking » et/ou du recrutement ou tout simplement de croiser des gens sympas « en vrai » (salut Samuel :-) ) ou de vieilles connaissances.

Et, comme prévu, malheureusement, pas de MD chez Google pour le moment :-(

Epoux et amants (2)

dimanche, janvier 6th, 2008

Ce post fait suite au premier du même nom qui s’intéressait à l’implémentation de relation UML en java. On avait vu qu’une simple association 1-1 donnait déjà lieu à du code non trivial.

Un problème amusant (!) du même genre est la transformation en java, d’une relation multivaluée. L’objectif est, toujours, de conserver en implémentation le maximum d’informations contenues dans le modèle.

Pour planter le décor concernant nos époux (qui sont tous les deux des personnes :-) ), je vous propose d’étendre le domaine de notre application au delà de leur vie amoureuse. Considérons par exemple leur lieu d’habitation et leurs changements d’adresse successifs. Notre modèle de domaine ressemblera à ça :

Adresses

(suite…)

Objecteering et les architectes

jeudi, janvier 3rd, 2008

Une nouvelle version d’Objecteering, la 6.1, est sortie en décembre.

image Je vous en parle car parmi les nouveautés annoncées, une m’a particulièrement attiré l’oeil : jusqu’ici, tout le « scripting » lié à la transformation de modèle et à la génération de code s’écrivait à l’aide d’un langage propriétaire, « J ». Depuis cette version, on a la possibilité de développer directement en Java.

(suite…)

Epoux et amants

mercredi, décembre 19th, 2007

J’ai beaucoup apprécié la réflexion de Xavier Blanc au MDDay expliquant que quand il demandait à ses étudiants de lui implémenter ça en java :

Epoux
On lui écrivait ça :

public class H {
  public F f;
}
public class F {
  public H h;
}

Ce qui s’apparente plutôt à l’implémentation de ça :

Amants

(suite…)

buy sale viagra
buy viagra online price
buy discount levitra
buy sale viagra
viagra 100 mg
buy cheap cialis
buy viagra
cheapest levitra
buy viagra online
buy viagra usa
buy viagra online
buy now viagra
buy price viagra
buy now levitra
buy discount viagra
cheap viagra online
buy viagra fedex
buy viagra overnight
buy viagra las vegas
generic viagra
cheap price viagra
Pfizer viagra free samples
generic cialis
cialis black reviews
buy cheap cialis
free madonna ringtones
cheapest cialis
buy now viagra online