Gaelyk is a lightweight Groovy toolkit for developing applications on Google App Engine. It allows using Groovy scripts instead of Java servlets and a Groovy template engine instead of JSP. Gaelyk provides enhancements to the Google App Engine Java SDK to simplify development, leveraging Groovy's dynamic features. The presentation demonstrates how to access services like Datastore, task queues, XMPP, and Memcache using Groovy syntax. Future plans include improvements to querying and object relationships in Datastore.
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009Guillaume Laforge
Reviewing the Groovy 1.6 features, the new 1.7 functionalities, and a look into what the future holds for Groovy 1.8 and beyond!
Presentation given by Guillaume Laforge at the Groovy/Grails eXchange conference, in London.
A brief rollerskate along HTML5 multimedia beach, in which we pop into the soda shop of subtitling and the ice-cream parlour of synchronised media, before we incongruously pop into the igloo of JavaScript access to the camera (because I pulled in from slides from another presso after we talked about it in an earlier presentation).
Create ReactJS Component & publish as npm packageAndrii Lundiak
How to prepare your (provider) ReactJS component and let your friends (consumer) to use it.
What issues you may face with Babel, Webpack, Eslint, Node, npm.
When to use “npm link” approach and “npm publish” approach.
What else to read and to try.
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009Guillaume Laforge
Reviewing the Groovy 1.6 features, the new 1.7 functionalities, and a look into what the future holds for Groovy 1.8 and beyond!
Presentation given by Guillaume Laforge at the Groovy/Grails eXchange conference, in London.
A brief rollerskate along HTML5 multimedia beach, in which we pop into the soda shop of subtitling and the ice-cream parlour of synchronised media, before we incongruously pop into the igloo of JavaScript access to the camera (because I pulled in from slides from another presso after we talked about it in an earlier presentation).
Create ReactJS Component & publish as npm packageAndrii Lundiak
How to prepare your (provider) ReactJS component and let your friends (consumer) to use it.
What issues you may face with Babel, Webpack, Eslint, Node, npm.
When to use “npm link” approach and “npm publish” approach.
What else to read and to try.
Fort de ses 1.7 millions de téléchargements l'an passé, Groovy continue son bonhomme de chemin en tête parmi les langages de programmation alternatifs pour la JVM.
Groovy 2.0, sorti l'an passé, introduisait dans son offre de la modularité, le support de JDK 7 au niveau syntaxique avec "Project Coin" autant qu'au niveau JVM avec l'utilisation d'"invoke dynamic", et proposait des fonctionnalités de typage et de compilation statique.
Groovy 2.1, quant à lui, s'appuie sur ces bases pour compléter le support d'"invoke dynamic" pour plus de performances. Il propose des améliorations permettant de documenter, d'aider les IDEs, et de vérifier statiquement les Domain-Specific Languages construits avec Groovy. Vous pourrez créer des méta-annotations regroupant d'autres annotations, pour éviter l'annotation "hell". Et enfin, vous irez encore plus loin dans la customisation du compilateur !
Accrochez votre ceinture, paré au décollage !
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
Paul King, Andrew Eisenberg and Guillaume Laforge present about implementation of Domain-Specific Languages in Groovy, while at the SpringOne2GX 2012 conference in Washington DC.
"Groovy 2.0 and beyond" presentation given at the Groovy/Grails eXchange conference.
Video can be seen here:
http://skillsmatter.com/podcast/groovy-grails/keynote-speech
Tek 2013 - Building Web Apps from a New Angle with AngularJSPablo Godel
AngularJS is a new JavaScript framework, backed by Google, for building powerful, complex and rich client-side web applications. We will go over the features and basics of building a web application with AngularJS and we will demonstrate how to communicate with a REST server built with PHP.
Lone StarPHP 2013 - Building Web Apps from a New AnglePablo Godel
AngularJS is a new JavaScript framework, backed by Google, for building powerful, complex and rich client-side web applications. We will go over the features and basics of building a web application with AngularJS and we will demonstrate how to communitate with a REST server built with PHP.
Fort de ses 1.7 millions de téléchargements l'an passé, Groovy continue son bonhomme de chemin en tête parmi les langages de programmation alternatifs pour la JVM.
Groovy 2.0, sorti l'an passé, introduisait dans son offre de la modularité, le support de JDK 7 au niveau syntaxique avec "Project Coin" autant qu'au niveau JVM avec l'utilisation d'"invoke dynamic", et proposait des fonctionnalités de typage et de compilation statique.
Groovy 2.1, quant à lui, s'appuie sur ces bases pour compléter le support d'"invoke dynamic" pour plus de performances. Il propose des améliorations permettant de documenter, d'aider les IDEs, et de vérifier statiquement les Domain-Specific Languages construits avec Groovy. Vous pourrez créer des méta-annotations regroupant d'autres annotations, pour éviter l'annotation "hell". Et enfin, vous irez encore plus loin dans la customisation du compilateur !
Accrochez votre ceinture, paré au décollage !
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
Paul King, Andrew Eisenberg and Guillaume Laforge present about implementation of Domain-Specific Languages in Groovy, while at the SpringOne2GX 2012 conference in Washington DC.
"Groovy 2.0 and beyond" presentation given at the Groovy/Grails eXchange conference.
Video can be seen here:
http://skillsmatter.com/podcast/groovy-grails/keynote-speech
Tek 2013 - Building Web Apps from a New Angle with AngularJSPablo Godel
AngularJS is a new JavaScript framework, backed by Google, for building powerful, complex and rich client-side web applications. We will go over the features and basics of building a web application with AngularJS and we will demonstrate how to communicate with a REST server built with PHP.
Lone StarPHP 2013 - Building Web Apps from a New AnglePablo Godel
AngularJS is a new JavaScript framework, backed by Google, for building powerful, complex and rich client-side web applications. We will go over the features and basics of building a web application with AngularJS and we will demonstrate how to communitate with a REST server built with PHP.
Brief introduction of Google App Engine and Play Framework.
Step-by-step instruction to develop and deploy play! web App on GAE with Siena persistence layer, CRUD management interface and login support.
The Rich Standard: Getting Familiar with HTML5Todd Anglin
HTML 5 may take some time to find full support in all major browsers, but you may be surprised to discover how many of HTML 5’s features are available today! HTML 5 is the next generation standard for web applications, and it promises to give plug-in based RIAs a serious challenge. In this demo heavy session, you’ll see HTML 5 in action and learn what you can do with today’s browser support for the new standard. If you’re building rich web applications and you’ve never touched HTML 5, this session is a must see.
Javascript Frameworks Comparison - Angular, Knockout, Ember and BackboneDeepu S Nath
Introduction and Comparison of polpular JS Frameworks Knockout, Ember, Angular and Backbone. The presentation descrobes How and when to select each framework.
Similar to Gaelyk quickie - GR8Conf Europe 2010 - Guillaume Laforge (20)
Groovy update - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
Groovy Update: what's new in 1.8 and what's coming in 1.9
The Groovy Development team is releasing Groovy 1.8, and this session will cover the new features including improved support for advanced and readable Domain-Specific Languages thanks to Groovy 1.8's "Extended Command Expressions", new performance improvements in the area of integer arithmetics, built-in support for parsing and producing JSON payloads, new AST transformations and now GPars come already bundled.
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
Design Your Own Domain Specific Language
This talk examines how dynamic languages in general and Groovy in particular provide toos to help design programming languages that are closer of the natural language of the target subject matter expert. It offers many features that allow you to create embedded DSLs: Closures, compile-time and run-time metaprogramming, operator overloading, named arguments, a more concise and expressive syntax and more.
Dr. Sean Tan, Head of Data Science, Changi Airport Group
Discover how Changi Airport Group (CAG) leverages graph technologies and generative AI to revolutionize their search capabilities. This session delves into the unique search needs of CAG’s diverse passengers and customers, showcasing how graph data structures enhance the accuracy and relevance of AI-generated search results, mitigating the risk of “hallucinations” and improving the overall customer journey.
GridMate - End to end testing is a critical piece to ensure quality and avoid...ThomasParaiso2
End to end testing is a critical piece to ensure quality and avoid regressions. In this session, we share our journey building an E2E testing pipeline for GridMate components (LWC and Aura) using Cypress, JSForce, FakerJS…
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
Communications Mining Series - Zero to Hero - Session 1DianaGray10
This session provides introduction to UiPath Communication Mining, importance and platform overview. You will acquire a good understand of the phases in Communication Mining as we go over the platform with you. Topics covered:
• Communication Mining Overview
• Why is it important?
• How can it help today’s business and the benefits
• Phases in Communication Mining
• Demo on Platform overview
• Q/A
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
Pushing the limits of ePRTC: 100ns holdover for 100 daysAdtran
At WSTS 2024, Alon Stern explored the topic of parametric holdover and explained how recent research findings can be implemented in real-world PNT networks to achieve 100 nanoseconds of accuracy for up to 100 days.
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfPaige Cruz
Monitoring and observability aren’t traditionally found in software curriculums and many of us cobble this knowledge together from whatever vendor or ecosystem we were first introduced to and whatever is a part of your current company’s observability stack.
While the dev and ops silo continues to crumble….many organizations still relegate monitoring & observability as the purview of ops, infra and SRE teams. This is a mistake - achieving a highly observable system requires collaboration up and down the stack.
I, a former op, would like to extend an invitation to all application developers to join the observability party will share these foundational concepts to build on:
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...SOFTTECHHUB
The choice of an operating system plays a pivotal role in shaping our computing experience. For decades, Microsoft's Windows has dominated the market, offering a familiar and widely adopted platform for personal and professional use. However, as technological advancements continue to push the boundaries of innovation, alternative operating systems have emerged, challenging the status quo and offering users a fresh perspective on computing.
One such alternative that has garnered significant attention and acclaim is Nitrux Linux 3.5.0, a sleek, powerful, and user-friendly Linux distribution that promises to redefine the way we interact with our devices. With its focus on performance, security, and customization, Nitrux Linux presents a compelling case for those seeking to break free from the constraints of proprietary software and embrace the freedom and flexibility of open-source computing.
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024Neo4j
Neha Bajwa, Vice President of Product Marketing, Neo4j
Join us as we explore breakthrough innovations enabled by interconnected data and AI. Discover firsthand how organizations use relationships in data to uncover contextual insights and solve our most pressing challenges – from optimizing supply chains, detecting fraud, and improving customer experiences to accelerating drug discoveries.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
Threats to mobile devices are more prevalent and increasing in scope and complexity. Users of mobile devices desire to take full advantage of the features
available on those devices, but many of the features provide convenience and capability but sacrifice security. This best practices guide outlines steps the users can take to better protect personal devices and information.
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...Neo4j
Leonard Jayamohan, Partner & Generative AI Lead, Deloitte
This keynote will reveal how Deloitte leverages Neo4j’s graph power for groundbreaking digital twin solutions, achieving a staggering 100x performance boost. Discover the essential role knowledge graphs play in successful generative AI implementations. Plus, get an exclusive look at an innovative Neo4j + Generative AI solution Deloitte is developing in-house.
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Gaelyk quickie - GR8Conf Europe 2010 - Guillaume Laforge
1. F GAELYK
a lightweight Groovy toolkit
for Google App Engine
Guillaume Laforge
SpringSource, a division of VMWare
mercredi 19 mai 2010
2. Guillaume Laforge
Groovy Project Manager
on Groovy since 2003!
JSR-241 Spec Lead
Head of Groovy Development
at SpringSource (division of VMWare)
Initiator of the Grails framework
Creator of the Gaelyk toolkit
Co-author of Groovy in Action
International speaker
mercredi 19 mai 2010
4. IaaS, PaaS, SaaS
Software as a Service
Gmail, SalesForce.com SaaS
Platform as a Service
Google App Engine PaaS
Infrastructure as a Service
Amazon EC2 IaaS
mercredi 19 mai 2010
5. IaaS, PaaS, SaaS
Software as a Service
Gmail, SalesForce.com SaaS
Platform as a Service
Google App Engine PaaS
Infrastructure as a Service
Amazon EC2 IaaS
mercredi 19 mai 2010
6. IaaS, PaaS, SaaS
Software as a Service
Gmail, SalesForce.com SaaS
Platform as a Service
Google App Engine PaaS
Infrastructure as a Service
Amazon EC2 IaaS
mercredi 19 mai 2010
10. Gaelyk
Gaelyk is a lightweight Groovy toolkit on top of the
Google App Engine Java SDK
Gaelyk builds on Groovy’s servlet support
Groovlets: Groovy scripts instead of raw servlets!
Groovy templates: JSP-like template engine
Both allow for a clean separation of views and logic
Gaelyk provides several enhancements around the GAE Java
SDK to make life easier, thanks to Groovy’s dynamic nature
mercredi 19 mai 2010
11. Why Groovy?
Groovy is a dynamic language for the JVM
very flexible, malleable, expressive and concise syntax
easy to learn for Java developers
deriving from the Java 5 grammar
provides powerful APIs to simplify the life of developers
possibility to dynamically enrich existing APIs
support for Groovlets and its own template engine
The truth: We worked with the Google App Engine Java
team before the official launch of the platform, to ensure
Groovy would run well on this new environment
mercredi 19 mai 2010
12. First steps...
• Go to http://gaelyk.appspot.com
• Download the template project
• Put your first Groovlet in /WEB-INF/
groovy
• And your templates at the root
• And you’re ready to go!
mercredi 19 mai 2010
14. MVC: Groovlets and templates
Groovlets Templates
(controllers) (views)
Entities
(domain)
mercredi 19 mai 2010
15. A groovlet
Instead of writing full-blown servlets, just write
Groovy scripts (aka Groovlets)
def numbers = [1, 2, 3, 4]
def now = new Date()
html.html {
body {
numbers.each { number -> p number }
p now
}
}
mercredi 19 mai 2010
19. Sending emails with Gaelyk
mail.send to: 'foobar@gmail.com',
from: 'other@gmail.com',
subject: 'Hello World',
htmlBody: '<bold>Hello</bold>'
mercredi 19 mai 2010
20. ...compared to Java
Properties props = new Properties();
ops, null);
Ses sion session = Session.getDefaultInstance(pr
String msgBody = "...";
try {
Message msg = new MimeMessage(session);
m", "Admin"));
msg.se tFrom(new InternetAddress("admin@example.co
TO,
msg.addRecipient(Message.RecipientType. "Mr. User"));
new InternetAddress("user@example.com",
n activated");
msg .setSubject("Your Example.com account has bee
msg.setText(msgBody);
Transport.send(msg);
} catch (AddressException e) {}
} catch (MessagingException e) {}
mercredi 19 mai 2010
21. Accessing the datastore
Direct interaction with the low-level datastore API
ty
import com.google.appengine.api.datastore.Enti
Entity entity = new Entity("person")
map
// subscript notation, like when accessing a
entity['name'] = "Guillaume Laforge"
// normal property access notation
entity.age = 32
entity.save()
entity.delete()
datastore.withTransaction {
// do stuff with your entities
// within the transaction
}
mercredi 19 mai 2010
22. Querying to be improved...
import com.google.appengine.api.datastore.*
der.*
import static com.google.appengine.api.datastore.FetchOptions.Buil
// query the scripts stored in the datastore
def query = new Query("savedscript")
// sort results by descending order of the creation date
query.addSort("dateCreated", Query.SortDirection.DESCENDING)
author
// filters the entities so as to return only scripts by a certain
r)
query.addFilter("author", Query.FilterOperator.EQUAL, params.autho
PreparedQuery preparedQuery = datastore.prepare(query)
// return only the first 10 results
def entities = preparedQuery.asList( withLimit(10) )
mercredi 19 mai 2010
23. ...into something groovier?
def entities = datastore.createQuery {
select from: savedscript
sort DESC, on: dateCreated
where author == params.author
limit 10
} as List
mercredi 19 mai 2010
24. ...into something groovier?
def entities = datastore.createQuery {
select from: savedscript
sort DESC, on: dateCreated
where author == params.author
te d!
limit 10 en
} as List l
p em
t Im
t Ye
N o
mercredi 19 mai 2010
25. Task queue API
// access a configured queue using the subscript notation
queues['dailyEmailQueue']
// or using the property access notation
queues.dailyEmailQueue
// you can also access the default queue with:
queues.default
defaultQueue
// add a task to the queue
queue << [
countdownMillis: 1000, url: "/task/dailyEmail",
taskName: "sendDailyEmailNewsletter",
method: 'PUT', params: [date: '20090914'],
payload: content
]
mercredi 19 mai 2010
26. Jabber / XMPP support (1/3)
Sending instant messages
String recipient = "someone@gmail.com"
// check if the user is online
if (xmpp.getPresence(recipient).isAvailable()) {
// send the message
def status = xmpp.send(to: recipient,
body: "Hello, how are you?")
// checks the message was successfully
// delivered to all the recipients
assert status.isSuccessful()
}
mercredi 19 mai 2010
27. Jabber / XMPP support (2/3)
Sending instant messages with an XML payload
String recipient = "service@gmail.com"
// check if the service is online
if (xmpp.getPresence(recipient).isAvailable()) {
// send the message
def status = xmpp.send(to: recipient, xml: {
customers {
customer(id: 1) {
name 'Google'
}
}
})
// checks the message was successfully delivered to the service
assert status.isSuccessful()
}
mercredi 19 mai 2010
28. Jabber / XMPP support (2/3)
Sending instant messages with an XML payload
String recipient = "service@gmail.com"
// check if the service is online
if (xmpp.getPresence(recipient).isAvailable()) {
// send the message
def status = xmpp.send(to: recipient, xml: {
customers {
customer(id: 1) { <customers>
name 'Google' <customer id=’1’>
} <name>Google</name>
} </customer>
}) </customers>
// checks the message was successfully delivered to the service
assert status.isSuccessful()
}
mercredi 19 mai 2010
29. Jabber / XMPP support (3/3)
Receving incoming instant messages
Configure the XmppServlet in web.xml
Add the inbound message service in appengine-web.xml
// get the body of the message
message.body
// get the sender Jabber ID
message.from
// get the list of recipients Jabber IDs
message.recipients
// if the message is an XML document instead of a raw string
message
if (message.isXml()) {
// get the raw XML
message.stanza
// get a document parsed with XmlSlurper
message.xml
}
mercredi 19 mai 2010
30. Memcache service
Map notation access to the cache
}
class Country implements Serialzable { String name
def countryFr = new Country(name: 'France')
in the cache
// use the subscript notation to put a country object
// (you can also use non-string keys)
memcache['FR'] = countryFr
// check that a key is present in the cache
if ('FR' in memcache) {
the cache using a key
// use the subscript notation to get an entry from
def countryFromCache = memcache['FR']
}
mercredi 19 mai 2010
31. URL Routing system
You can have friendly URL mappings with the URL
routing system introduce in Gaelyk 0.3.2
all "/blog/@year/@month/@day/@title",
@day@title=@title"
forward: "/blog.groovy?year=@year&month=@month@day=
get "/blog/@year/@month/@day",
@day"
forward: "/blog.groovy?year=@year&month=@month@day=
all "/aboutus",
redirect: "/blog/2008/10/20/about-us"
get "/book/isbn/@isbn",
forward: "/book.groovy?isbn=@isbn",
validate: { isbn ==~ /d{9}(d|X)/ }
mercredi 19 mai 2010
32. Simple plugin system (1/3)
Gaelyk 0.4 introduces a simple plugin system for
extending your apps and share commonalities
A plugin lets you
provide additional groovlets and templates
contribute new URL routes
add new categories
define variables in the binding
provide any static content
add new libraries
do any initialization
mercredi 19 mai 2010
33. Simple plugin system (2/3)
A plugin is actually just a zip file!
Basically, just a Gaelyk application, minus...
the Groovy / Gaelyk / GAE JARs
the web.xml and appengine-web.xml descriptors
But with a /WEB-INF/plugins/myplugin.groovy descriptor
A plugin must be referenced in /WEB-INF/
plugins.groovy with
install myplugin
shortcut to /WEB-INF/plugins/myplugin.groovy
mercredi 19 mai 2010
34. Simple plugin system (3/3)
An example plugin descriptor
/WEB-INF/plugins/jsonPlugin.groovy
import net.sf.json.*
import net.sf.json.groovy.*
// add new variables in the binding
binding {
le
jsonLibVersion = "2.3" // a simple string variab
of a 3rd‐party JAR
json = new JsonGroovyBuilder() // an instance of a class
}
// add new routes with the usual routing system format
routes {
get "/json", forward: "/json.groovy"
}
// install a category you've developped
categories jsonlib.JsonlibCategory
// any other initialization code you'd need
mercredi 19 mai 2010
35. What’s coming next?
Gaelyk 0.4 was released a few days ago
Features a lightweight plugin system
A 0.4.1 bug fix is coming soon
Expect more sugar around the Datastore
An SQL-like query DSL
Easier relationship management (builder)
Perhaps pre-compiled groovlets and templates
More generally...
Anything that’ll come up in upcoming GAE SDK versions
mercredi 19 mai 2010
36. Summary
Easy access to a cloud solution
Deploying Java apps, as easily as you would with PHP
Familiar to Java folks
Your good old Servlet centric webapps style
Pretty cheap
You need a high-trafficed website to reach the quotas
Gaelyk provides a simplified approach to creating
Servlet centric webapps in a productive manner
Leveraging Groovy’s servlet / template support and dynamic
capabilities
mercredi 19 mai 2010
38. Thanks for your attention!
e
aforg pment
ume L Develo
Guilla Groovy
Hea d of m ail.com
afo rge@g
E mail: gl glaforge
@
T witter :
References:
• http://gaelyk.appspot.com/
• http://groovy.codehaus.org/
• http://code.google.com/appengine/
mercredi 19 mai 2010
39. Images used in this presentation
Clouds
http://www.morguefile.com/archive/display/627059
http://www.morguefile.com/archive/display/625552
http://www.morguefile.com/archive/display/629785
Duke ok GAE
http://code.google.com/images/duke-on-gae.jpg
http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.png
Python logo : http://python.org/images/python-logo.gif
Gaelyc cross with clouds : http://www.morguefile.com/archive/display/37889
Speed limit : http://www.morguefile.com/archive/display/18492
Warehouse : http://www.morguefile.com/archive/display/85628
Snow foot steps : http://www.flickr.com/photos/robinvanmourik/2875929243/
Sugar : http://www.flickr.com/photos/ayelie/441101223/sizes/l/
mercredi 19 mai 2010