We bought a siphon for cooking some time ago and are having fun with it to prepare desserts and starters (we made a mousse de foie gras that was awesome). Yesterday, we prepared a velours de mangue (velvet of mango).
One of the most important new features is Shared Subscription.
Let's assume you are using a topic to send messages. There are several components subscribed to this topic that are processing the messages in different fashion (for example to process jobs A and B).
When a message
M is sent to the topic, all consumers subscribed to the topic receive it:
M +--------------+ ---> | consumer CA1 | < a consumer for the job A > +----------+ M +-------+ / +--------------+ | producer | ---> | topic | +----------+ +-------+ \ M +--------------+ ---> | consumer CB1 | < a consumer for the job B > +--------------+
The consumer CB1 is subscribed to the topic. Every time, it receives a message, it processes the job B.
Unfortunately, this job is time-consuming and we would like to scale it out by having several consumers for the job B running on different machines.
We can not have several consumers on the topic for this job, otherwise they would all receive copies of the same message and process it several times. What we need is a set of consumers that receives a single message from the topic amongst them.
If the component is running inside a Java EE application server, you can use a Message-Drive Bean for that. If the component is a Java SE application, you are out of luck.
Before JMS 2.0, each messaging brokers has different ways to provide this feature.
Diverts allow you to transparently divert messages routed to one address to some other address, without making any changes to any client application logic.
We use a divert to route the messages sent to the topic to another queue (let's called it
Queue_B since it's for the processing job B). Everytime a message is sent to the topic, a copy is also routed to the queue. Our divert is non-exclusive since we want it to still be received by the topic consumers.
We can then create as many consumers we want for
Queue_B. Since this destination is a queue, only one of them will receive a message that was initially sent to the topic:
M +--------------+ ---> | consumer CA1 | +----------+ M +-------+ / +--------------+ | producer | ---> | topic | +----------+ +-------+ \ +--------------+ \ M ---> | consumer CB1 | divert \ / +--------------+ \ +---------+ / +--------------+ | Queue_B | -- ---> | consumer CB2 | +---------+ \ +--------------+ \ M +--------------+ ---> | consumer CB3 | +--------------+
Among CB1, CB2 and CB3, only CB3 received the message sent to the topic.
There are still many shortcomings of using diverts (or similar features) to share consumers of a topic.
Enter JMS 2.0 and its "shared subscription".
A non-durable shared subscription is used by a client which needs to be able to share the work of receiving messages from a topic subscription amongst multiple consumers. A non-durable shared subscription may therefore have more than one consumer. Each message from the subscription will be delivered to only one of the consumers on that subscription.
The basic idea behing sharing a subscription is to have a set of consumers (identified by a shared subscription name) receiving exclusively a message from a topic.
That solves all the issues we originally had in a standard fashion. We can now create many shared consumers with the shared subscription name
<< sub B >> to have them process messages for the job B and scale out nicely:
M +--------------+ ----------------> | consumer CA1 | / +--------------+ / +--------------+ +----------+ M +-------+ / ---> | consumer CB1 | | producer | ---> | topic | / +--------------+ +----------+ +-------+ \ / M +--------------+ << sub B >> -- ---> | consumer CB2 | \ +--------------+ \ +--------------+ ---> | consumer CB3 | +--------------+
Among the shared consumers CB1, CB2 and CB3, only CB2 received the message sent to the topic.
The JMS 2.0 API adds new methods to create shared consumer:
JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName) JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)
It is also possible to create shared durable consumers:
JMSContext.createSharedDurableConsumer(Topic topic, String name) JMSContext.createSharedDurableConsumer(Topic topic, String name, String messageSelector)
Sharability and durability of subscriptions are two orthogonal notions and all the combination are possible:
JMS 2.0 is an incremental update to JMS that should simplify any Java application using messages. Shared subscription is one of this interesting new features.
Insightful portrait of Tim Duncan on the cusp of his 5th NBA finals (he won his first fours):
Sometimes people will mention the swimming when trying to pinpoint the origin of Duncan’s remarkable discipline and relentless consistency. Duncan swam until he was 14 and seemed on a path toward the Olympics like his sister, Tricia. That was when Hurricane Hugo roared through the Island and wrecked the swimming pool. More, that was the year his mother, Ione, died of cancer. She had been his greatest fan, the loudest cheers at the pool, the voice inside his head. He would talk about the little nursery rhyme that she would repeat to him over and over and over …
Good, better, best
Never let it rest
Until your good is better
And your better is your best
You can’t help but think that if you cut Tim Duncan open, those words would be etched on his heart.
There has never been a basket-ball player so consistent for the whole span of his career (stats per 36 minutes):
I am rooting for the spurs for these finals! #GoSpursGo
This sunday was held the 2013 edition of Uriage Cabriolet Classic, a large gathering of classic (and more recent) cars.
I am not a connaisseur of cars but I can recognize a beautiful one when I see it. I really enjoy the attention to details of these cars and the love and care of their owners (the engines were all shining!).
This gathering is an opportunity to appreciate all the shapes and colours of cars. Even the most modest cars look fantastic with out of the ordinary colours.
We were lucky having a beautiful weather for the gathering and enjoyed the familial atmosphere.
My girlfriend and I spent one week in Tuscany. We loved every moment of it.
Spoiler: he loves the camera and, unsurprisingly, makes beautiful pictures with it.
I bought his book, The Print and the Process, this week-end. It is a beautifully crafted book composed of 4 sections, Venic, Iceland, Kenya, and Antarctica providing a variety of scenes (it's mostly landscapes and portraits though, it's a David duChemin's book after all :) Each section is composed of a set of 20-30 images without any text that helps appreciate the flow of pictures without any interruption. At the end of each section, there is a text for each images where the author describes what his intent or feeling was when he took the picture.
The book is bound along the short edge in landscape mode. This design makes the beautiful landscape images really stand out.
Beautiful book, gorgeous photos and instructive reading. Heartily recommended.
Onwards with WildFly!
The new weather app from Yahoo! looks gorgeous and is a pleasure to use with an intuitive navigation.
The photos are geolocated and taken from Flickr photo pool. That's a great way to leverage Flickr.
With the updated Flickr app and this new weather app, Marissa Meyer is on the right track to hold her promise to make Flick awesome again.
With the release of the 55-200mm ƒ/3.5-4.8 telephoto lens, the Fuji X system gains enough reach to build a complete system and the announced 56 ƒ/1.2 will make an awesome portrait lens.
It's getting harder and harder to resist getting a X-E1...
Last month, my girlfriend offered me for my birthday a cooking class with a chef to make macarons. We already tried several times to make them without much success. The recipe is simple but not forgiving: one has to pay attention to a lot of details to cook macarons that please both the eyes and the palate.
This week-end, we had the cooking class with the chef and made macarons garnis à la pâte d'amandes et au caramel au beurre salé
The chef was friendly and gave us lot of explanation to make the best macarons and we are quite happy with the results. They look good and taste even better!
We heartily recommend anyone in Rhône-Alpes, France who is interested to improve its cooking craftsmanship to take a class with Jean-Luc at http://www.coachculinaire.fr.
I find Erlang's mailbox approach simpler to understand and read (but I can not warm up to Erlang syntax...).
Promises looks... promising but I'd like to try them out on a pet project to get a better feel on them. In France, we have a saying that said that "promises bind only whose that listen to them", so I prefer to be cautious :)
Awestruct is the static web site generator I use for my Web site.
I upgraded this morning and it worked like a charm.
We spent the week-end near Roanne and visited Saint-Haon-le-Châtel, one of the smallest medieval town of France.
This town is located on the top of a hill. The church is at the very top of the town and offers a nice panorama view of the plain of Roanne. The cemetary near the church was deserted, most graves were moved to a more recent cemetary and only remain a few tombstones and ruins around a tree.
Last Saturday, near home, the city of Gières organized a spectacle to celebrate the end of winter and the beginning of spring.
A local artist created a huge leprechaun representing the winter.
A local troop of jugglers, "les Lutins Farceurs", gave a representation after sunset. Their make-up was very well made, they looked half-elves half-daemons.
Kids were both frightened and in amazement looking at them, especially when they were jumping using stilts and going incredibly high with them.
Once the Lutins Farceurs ended their representation, the Leprechaun was burnt to celebrate the end of winter.
The spectacle was great but it was untimely to celebrate the end of winter: it was snowing again this morning.
Spring will have to wait a bit more to come... :)
Food photography is fun.
I feel a bit limited using a Nikon 35mm ƒ/1.8 DX for it but my other lenses are not bright enough or focus close enough to obtain a shallow depth of field. If I were not thinking about changing my photo gear to something else than Nikon DX system, I would definitively buy the 85mm macro lens.
I also need to work on lighting the food. The light is not soft enough when it hits the broccoli at the foreground. It's time to invest in a good flash...
My girlfriend and I went to Paris for the week-end and I carried my photo gear for 2 days for a grand total of 20 pictures.
I took my Nikon D7000 with the 16-85mm DX (and the 35mm ƒ/1.8 DX for low light). The camera bag weighed 2.7kg all included. We walked a lot during the 2 days and I felt the camera and the bag getting heavier with each kilometer.
I am looking for a camera that would match (or exceed) the IQ of my DSLR while being more compact and weighing less.
I really like the Fuji X series and particularly the X-E1 but I am not sold on it yet. My main issues are the autofocus issues, the lack of lens (60mm is the maximum it can reach) and the lack of support from Adobe Lightroom for its RAW files.
The autofocus issues looks to be improved with each firmware updates (and the X100s show promises for the 2nd generation). I like the lens roadmap (especially the 23mm ƒ/2) if they can pull it off.
The main issue is the lack of support from Adobe. I don't want to buy into a system based on the X-Trans sensor to be able to generate only JPEG files out of the camera... I enjoy the latitude provided by post-processing RAW files too much to give it up.
This also means that I will not get a X100s even with all the improvements from the X100 (phase detection, focus peaking, etc.). It is an ideal combo with a 23mm lens in a small package but again it is based on the X-Trans sensor.
Yesterday, I read Duncan's review of the Sony DSC RX1. This camera looks fun to use and provides gorgeous pictures (you have to read it on a Hi-DPI display to really enjoy the images quality) but it is way too expensive for me. I would not say that it is overpriced. For the same budget, I would take a RX1 over a Nikon D600 + Zeiss 35mm ƒ/2 lens any day but both are above my budget at the moment.
I am considering waiting for the 2nd generation of Fuji X cameras, provided their RAW files are supported by Adobe. In the meantime, I could carry out a Sony DSC RX100. It looks to be a competent compact camera with a fast lens at the wide end. That would be a temporary solution but I don't take my DSLR as much as I could because it is too heavy. Having a compact camera with good IQ would make it fun again to shoot every time I am out.
A few months ago, I updated my web site to use static content generated by Awestruct instead of a hosted WordPress instance. It is much simpler to maintain and tweak (something I am constantly doing), less expensive to host since it does not need any runtime or database and static content is fast, cacheable, etc.
More recently, I acquired a Retina MacBook Pro and updated my web site to display Retina-ready responsive images. This requires to server several JPEG files of the same image at various sizes. Retina images may be quite big and using a content delivery service improves the latency to serve these images. I decided to use Amazon CloudFront for content delivery of all my media assets.
This post is a quick reference of the different services and settings I have used to achieve this goal.
The source code of my web site is hosted at Github and uses Awestruct to generate its content. I write the posts (including this one) using Markdown syntax and Awestruct generates the whole web site for me (including an Atom feed, archive page, sitemap, etc.)
The content is hosted in a S3 bucket named
jmesnil.net and is deployed to S3 using Awestruct directly:
$ cat _config/site.yml ... profiles: production: deploy: type: s3 bucket: s3://jmesnil.net/ $ awestruct -P production --deploy ... Syncing XXX/jmesnil.net/_site to bucket s3://jmesnil.net/
I contributed the S3 deployment to Awestruct recently and there is no release with that feature yet. Alternatively, you can use s3cmd.
I use Amazon S3 to host the static content in a bucket
jmesnil.net (without the
www) and enable the
Static Website Hosting in its properties.
To achieve this, I need a second S3 bucket named
www.jmesnil.net. However, instead of enabling website hosting, its
Static Website Hosting property is set to
Redirect all requests to another host name (using the value
This 2nd bucket will remain empty (nothing is deployed to it) but is required to redirect content from www.jmesnil.net.
Amazon Route 53 is a domain name service that I use to provide the domain names of my web site.
I created a hosted name for
jmesnil.net with the following record sets:
Atype record that is an
ALIASto the S3 bucket
jmesnil.net(the dropdown list will propose all the S3 buckets you own)
CNAMEtype record corresponding to the S3 bucket www.jmesnil.net public domain name (i.e. in my case it is
Using Amazon S3 and Route 53, it is very simple and cost-effective to host a static web site1. Using Awestruct makes it simple and fun to write content for it :)
Amazon provides good documentation for its Web services including a full tutorial to set up a static website using a custom domain.
For ech retina-ready responsive image I want to display, I need to export eight JPEG files from Lightroom.
My media assets (including these images) are deployed in a S3 bucket named
media.jmesnil.net using s3cmd and I enabled the
Static Website Hosting for it.
To use Amazon CloudFront as my content delivery service for the media assets, I created a
Download distribution from the S3 bucket
Content delivered by CloudFront is served from a
XXX.cloudfront.net domain name. Since I want to keep all my content under my own domain name, I use Route 53 again to serve the CloudFront content from
In Route 53's hosted zone for
jmesnil.net, I added a new record set for
media.jmesnil.net which is a
CNAME type set to the CloudFront domain name (i.e.
XXX.cloudfront.net). Then in Cloudfront distribution, I added
media.jmesnil.net as an
Alternate Domain Name.
To sum up:
http://jmesnil.net/XXXis served by the S3 bucket
http://www.jmesnil.net/YYYis redirected to the naked URL
http://media.jmesnil.net/ZZZis using CloudFront to deliver the media assets and is backed by the S3 bucket
All my content is served by URLs under my domain name
jmesnil.net. With this configuration, I will not be depending on any third-party URLs for my own content If I decide one day to move to another hosted service or platform2.
The watch can and should, for most of us, eliminate passcodes altogether on iPhones, and Macs and, if Apple’s smart, PCs: As long as my watch is in range, let me in! That, to me, would be the single-most compelling feature a smartwatch could offer: If the watch did nothing but release me from having to enter my passcode/password 10 to 20 times a day, I would buy it.
Using 1Password means that I only need to remember my master password but I still need to type it too many times a day (and it is long to type it with a virtual keyboard).
Such a watch would be a good idea. I have stopped wearing a watch a few years ago since I always have near me a mobile phone that provides the same functionalities. I would not buy a watch just for this feature but I would definitely buy a small gadget that I could attach to my keyring (like the RSA security token I used to have to connect to my company VPN).