<?xml version="1.0" encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title type="html">Raible Designs</title>
    <subtitle type="html">Raible Designs is an Enterprise Open Source Consulting company. We specialize in UI and Full Stack Architectures using HTML5, CSS, JavaScript and Java. We love HTML5, Angular, Bootstrap, Spring Boot, and especially JHipster.</subtitle>
    <id>https://raibledesigns.com/rd/feed/entries/atom</id>
            <link rel="self" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?tags=java" />
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/" />
        <updated>2026-04-30T03:43:46-06:00</updated>
    <generator uri="http://roller.apache.org" version="5.0.3 (1388864191739:dave)">Apache Roller (incubating)</generator>
        <entry>
        <id>https://raibledesigns.com/rd/entry/my_marvelous_road_trip_to</id>
        <title type="html">My Marvelous Road Trip to the Utah JUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/my_marvelous_road_trip_to"/>
        <published>2024-05-22T09:35:09-06:00</published>
        <updated>2024-05-22T10:01:45-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="skiing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="utahjug" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I have many fond memories from speaking at the &lt;a href=&quot;https://ujug.org/&quot;&gt;Utah JUG&lt;/a&gt; over the years. I fell in love
    with Utah when I worked at Overstock in 2011 and experienced the &lt;a href=&quot;https://raibledesigns.com/rd/entry/the_greatest_snow_on_earth&quot;&gt;greatest snow on earth&lt;/a&gt;. It&apos;s wild
    to &lt;a href=&quot;https://raibledesigns.com/rd/entry/farewell_to_the_2017_18&quot;&gt;reminisce about 2018&lt;/a&gt; too. I spoke at the
    Denver JUG on Wednesday, then woke up early on Thursday and drove eight hours (through multiple snow storms) and
    made it 15 minutes before my talk. I lost a windshield wiper in the process and didn&apos;t have time to replace it, so
    it permanently etched a line in the vehicle&apos;s windshield. In &lt;a href=&quot;https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at&quot;&gt;February 2020&lt;/a&gt;, I did a Rocky
    Mountain JUG tour with &lt;a href=&quot;https://saturnism.me/&quot;&gt;Ray Tsang&lt;/a&gt;. That&apos;s when I learned that Ray is &lt;em&gt;really
        good&lt;/em&gt; at pool.
&lt;/p&gt;
&lt;p&gt;Because of these experiences, I always jump at the opportunity when I&apos;m invited back. This year, I decided
    to take my time and do a road trip in my trusty VW Vanagon (Stout) to Utah. I planned to mountain bike in Fruita and
    Moab along the way, then ski at a couple Utah resorts before returning home.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737179534_fefec577e8_c.jpg&quot; title=&quot;Since I have the time, I&apos;m road-tripping to speak at the Utah JUG on Thursday. I hope to find some nice powder and singletrack along the way. Wish me luck! #FunEmployment #StoutTheSyncro&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737179534/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737179534_fefec577e8.jpg&quot; width=&quot;500&quot; alt=&quot;Since I have the time, I&apos;m road-tripping to speak at the Utah JUG on Thursday. I hope to find some nice powder and singletrack along the way. Wish me luck! #FunEmployment #StoutTheSyncro&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I was pleasantly surprised when I saw a storm coming the night before my departure on April 16th. I quickly altered
    my plans and fell into an 18&quot; powder day at Copper Mountain on Tuesday morning.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I have many fond memories from speaking at the &lt;a href=&quot;https://ujug.org/&quot;&gt;Utah JUG&lt;/a&gt; over the years. I fell in love
    with Utah when I worked at Overstock in 2011 and experienced the &lt;a href=&quot;https://raibledesigns.com/rd/entry/the_greatest_snow_on_earth&quot;&gt;greatest snow on earth&lt;/a&gt;. It&apos;s wild
    to &lt;a href=&quot;https://raibledesigns.com/rd/entry/farewell_to_the_2017_18&quot;&gt;reminisce about 2018&lt;/a&gt; too. I spoke at the
    Denver JUG on Wednesday, then woke up early on Thursday and drove eight hours (through multiple snow storms) and
    made it 15 minutes before my talk. I lost a windshield wiper in the process and didn&apos;t have time to replace it, so
    it permanently etched a line in the vehicle&apos;s windshield. In &lt;a href=&quot;https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at&quot;&gt;February 2020&lt;/a&gt;, I did a Rocky
    Mountain JUG tour with &lt;a href=&quot;https://saturnism.me/&quot;&gt;Ray Tsang&lt;/a&gt;. That&apos;s when I learned that Ray is &lt;em&gt;really
        good&lt;/em&gt; at pool.
&lt;/p&gt;
&lt;p&gt;Because of these experiences, I always jump at the opportunity when I&apos;m invited back. This year, I decided
    to take my time and do a road trip in my trusty VW Vanagon (Stout) to Utah. I planned to mountain bike in Fruita and
    Moab along the way, then ski at a couple Utah resorts before returning home.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737179534_fefec577e8_c.jpg&quot; title=&quot;Since I have the time, I&apos;m road-tripping to speak at the Utah JUG on Thursday. I hope to find some nice powder and singletrack along the way. Wish me luck! #FunEmployment #StoutTheSyncro&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737179534/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737179534_fefec577e8.jpg&quot; width=&quot;500&quot; alt=&quot;Since I have the time, I&apos;m road-tripping to speak at the Utah JUG on Thursday. I hope to find some nice powder and singletrack along the way. Wish me luck! #FunEmployment #StoutTheSyncro&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I was pleasantly surprised when I saw a storm coming the night before my departure on April 16th. I quickly altered
    my plans and fell into an 18&quot; powder day at Copper Mountain on Tuesday morning.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735916152_ed708809c2_c.jpg&quot; title=&quot;Found 18&amp;quot; (46cm) freshies at Copper this morning! &amp;#x2603;&amp;#xFE0F;&amp;#x1F606;&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735916152/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735916152_ed708809c2_q.jpg&quot; width=&quot;150&quot; alt=&quot;Found 18&amp;quot; (46cm) freshies at Copper this morning! &quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736844836_281321d21a_c.jpg&quot; title=&quot;Found 18&amp;quot; (46cm) freshies at Copper this morning! &amp;#x2603;&amp;#xFE0F;&amp;#x1F606;&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736844836/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736844836_281321d21a_q.jpg&quot; width=&quot;150&quot; alt=&quot;Found 18&amp;quot; (46cm) freshies at Copper this morning! &quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735915657_c7d78dd388_c.jpg&quot; title=&quot;Found 18&amp;quot; (46cm) freshies at Copper this morning! &amp;#x2603;&amp;#xFE0F;&amp;#x1F606;&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735915657/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735915657_c7d78dd388_q.jpg&quot; width=&quot;150&quot; alt=&quot;Found 18&amp;quot; (46cm) freshies at Copper this morning! &quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    That afternoon, I drove to &lt;a href=&quot;https://www.tetongravity.com/story/ski/locals-guide-to-fruita-colorado&quot;&gt;Fruita&lt;/a&gt; and went for a mountain bike ride on 18 Road. There are not many places where it&apos;s possible to have an epic powder
    day &lt;em&gt;and&lt;/em&gt; do an awesome mountain bike ride in the same day. I love Colorado!
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735915677_5d35ab3794_c.jpg&quot; title=&quot;Skiing and mountain biking in the same day? Yes please!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735915677/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735915677_5d35ab3794_m.jpg&quot; width=&quot;240&quot; alt=&quot;Skiing and mountain biking in the same day? Yes please!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735915737_df65eae60f_c.jpg&quot; title=&quot;New Trail at Fruita&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735915737/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735915737_df65eae60f_m.jpg&quot; width=&quot;240&quot; alt=&quot;New Trail at Fruita&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737267230_e0088e393b_c.jpg&quot; title=&quot;Sweet singletrack in Fruita named Joe&apos;s Ridge. You have to work for it, but it&apos;s spectacular on the way down!  #RoadTrip #FunEmployment&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737267230/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737267230_e0088e393b.jpg&quot; width=&quot;500&quot; alt=&quot;Sweet singletrack in Fruita named Joe&apos;s Ridge. You have to work for it, but it&apos;s spectacular on the way down!  #RoadTrip #FunEmployment&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    I camped in Stout that night and woke up to a beautiful desert morning. After some coffee and oatmeal with
    raspberries and walnuts, I headed for Moab.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737041293_20df1cf20c_c.jpg&quot; title=&quot;#StoutTheSyncro and I camped far away from everyone&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737041293/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737041293_20df1cf20c_m.jpg&quot; width=&quot;240&quot; alt=&quot;#StoutTheSyncro and I camped far away from everyone&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735914117_ddc578d146_c.jpg&quot; title=&quot;I love waking up in the desert!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735914117/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735914117_ddc578d146_m.jpg&quot; width=&quot;240&quot; alt=&quot;I love waking up in the desert!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    I stopped at &lt;a href=&quot;https://www.blm.gov/visit/klondike-bluffs-trail-system&quot;&gt;Klondike Bluffs&lt;/a&gt; for a 16.2 mile ride that took me 3&#189; hours. I was gassed at the top but
    thoroughly enjoyed the views.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735913967_625d708ab0_c.jpg&quot; title=&quot;Dino-Flow at Klondike Bluffs&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735913967/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735913967_625d708ab0_q.jpg&quot; width=&quot;150&quot; alt=&quot;Dino-Flow at Klondike Bluffs&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737265470_c7bb3fa589_c.jpg&quot; title=&quot;Top of Alaska trail at Klondike Bluffs&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737265470/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737265470_c7bb3fa589_q.jpg&quot; width=&quot;150&quot; alt=&quot;Top of Alaska trail at Klondike Bluffs&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737040593_7382b9115f_c.jpg&quot; title=&quot;Homer trail at Klondike Bluffs&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737040593/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737040593_7382b9115f_q.jpg&quot; width=&quot;150&quot; alt=&quot;Homer trail at Klondike Bluffs&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737175664_2a6bfdf95e_c.jpg&quot; title=&quot;My Trusty Steed&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737175664/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737175664_2a6bfdf95e_m.jpg&quot; width=&quot;240&quot; alt=&quot;My Trusty Steed&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737039568_1d65bf3e64_c.jpg&quot; title=&quot;Gorgeous view from the top!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737039568/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737039568_1d65bf3e64_m.jpg&quot; width=&quot;240&quot; alt=&quot;Gorgeous view from the top!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    I finished driving to Salt Lake City on Wednesday afternoon. I&apos;m always impressed with how close, and gorgeous, the
    mountains are to the city.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735910637_afacddc510_c.jpg&quot; title=&quot;The mountains driving into Salt Lake City are spectacular!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735910637/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735910637_afacddc510.jpg&quot; width=&quot;500&quot; alt=&quot;The mountains driving into Salt Lake City are spectacular!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    On Thursday morning, I released a new version of the &lt;a href=&quot;https://x.com/mraible/status/1780962784391442783&quot;&gt;Micronaut
    blueprint for JHipster&lt;/a&gt;, then hit the slopes at Snowbird. The weather was fantastic for spring skiing.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737037573_8f5db25ee6_c.jpg&quot; title=&quot;Cruisin&apos; blues &amp;#x26F7;&amp;#xFE0F; at Snowbird the Utah JUG meetup&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737037573/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737037573_8f5db25ee6_m.jpg&quot; width=&quot;240&quot; alt=&quot;Cruisin&apos; blues &amp;#x26F7;&amp;#xFE0F; at Snowbird the Utah JUG meetup&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736838686_f6980ff92f_c.jpg&quot; title=&quot;Cruisin&apos; blues &amp;#x26F7;&amp;#xFE0F; at Snowbird the Utah JUG meetup&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736838686/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736838686_f6980ff92f_m.jpg&quot; width=&quot;240&quot; alt=&quot;Cruisin&apos; blues &amp;#x26F7;&amp;#xFE0F; at Snowbird the Utah JUG meetup&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I made sure to get some runs in at Alta too.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737036168_337172b213_c.jpg&quot; title=&quot;I took a few runs at Alta too!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737036168/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737036168_337172b213_m.jpg&quot; width=&quot;240&quot; alt=&quot;I took a few runs at Alta too!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737172059_4f58f6c2f9_c.jpg&quot; title=&quot;More Alta views&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737172059/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737172059_4f58f6c2f9_m.jpg&quot; width=&quot;240&quot; alt=&quot;More Alta views&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    I dressed up as an old-fashioned Java developer on Thursday evening and headed to the Utah JUG meetup at &lt;a href=&quot;https://lucid.co/&quot;&gt;Lucid&apos;s Global HQ&lt;/a&gt;. I was pleasantly surprised to see a &lt;a href=&quot;https://x.com/UtahJava/status/1781121167207903459&quot;&gt;full room&lt;/a&gt; of Java enthusiasts. Before my talk, Jason Porter announced
    that it was &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7186929266918395905/&quot;&gt;his last meeting as
    President of UJUG&lt;/a&gt;. He served in this role for 11.5 years and was amazing at it. Congratulations on your
    retirement, Jason!
&lt;/p&gt;
&lt;p&gt;I spoke about Micro Frontends for Java Microservices and used &lt;a href=&quot;https://www.jhipster.tech&quot;&gt;JHipster&lt;/a&gt; to
    demonstrate how it all worked.&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Kudos to all the fabulous developers who attended the &lt;a
            href=&quot;https://twitter.com/UtahJava?ref_src=twsrc%5Etfw&quot;&gt;@UtahJava&lt;/a&gt; meetup tonight and listened to me
        ramble on about micro frontends and &lt;a href=&quot;https://twitter.com/jhipster?ref_src=twsrc%5Etfw&quot;&gt;@jhipster&lt;/a&gt;.
        You can find my slides on &lt;a
                href=&quot;https://twitter.com/speakerdeck?ref_src=twsrc%5Etfw&quot;&gt;@speakerdeck&lt;/a&gt;:&lt;br&gt;&lt;br&gt;&amp;#x1F3D4;&amp;#xFE0F;?
        &lt;a href=&quot;https://t.co/Kp19jjOG8E&quot;&gt;https://t.co/Kp19jjOG8E&lt;/a&gt;&lt;a
                href=&quot;https://twitter.com/hashtag/microfrontends?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#microfrontends&lt;/a&gt;
        &lt;a href=&quot;https://twitter.com/hashtag/jhipster?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jhipster&lt;/a&gt; &lt;a
                href=&quot;https://twitter.com/hashtag/react?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#react&lt;/a&gt; &lt;a
                href=&quot;https://twitter.com/hashtag/modulefederation?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#modulefederation&lt;/a&gt;
        &lt;a href=&quot;https://t.co/W7tF7pUxpt&quot;&gt;pic.twitter.com/W7tF7pUxpt&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a
            href=&quot;https://twitter.com/mraible/status/1781157464861192555?ref_src=twsrc%5Etfw&quot;&gt;April 19, 2024&lt;/a&gt;
    &lt;/blockquote&gt;
    &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
    My &lt;a href=&quot;https://speakerdeck.com/mraible/micro-frontends-for-java-microservices-utah-jug-2024&quot;&gt;slide deck&lt;/a&gt; was
    similar to the one I delivered at &lt;a href=&quot;https://raibledesigns.com/rd/entry/a_delightful_trip_to_devnexus&quot;&gt;Devnexus&lt;/a&gt;
    the previous week, with minor enhancements.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
    &lt;iframe class=&quot;speakerdeck-iframe&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/936d59aabe034a12b3e7cbe496c6bfc0&quot; title=&quot;Micro Frontends for Java Microservices - Utah JUG 2024&quot; allowfullscreen=&quot;true&quot; style=&quot;border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;&quot; data-ratio=&quot;1.7777777777777777&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I received a lot of positive feedback on LinkedIn after my talk, particularly from college students that Jason had
    invited from his alma mater. This put a smile of satisfaction on my face well into the evening.&lt;/p&gt;
&lt;p&gt;
    On Friday, I woke up early to get a start on my road trip home. I was originally planning to ski another mountain in
    Utah, but realized I could make it to Steamboat by noon, and chose that route instead. Stout&apos;s red-blinky-light
    alerted me that something was wrong when I stopped at the gas station. Two quarts of oil fixed things and I was on
    my way. The open road with minimal traffic was wonderful.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736836406_e81e4cbee7_c.jpg&quot; title=&quot;I love the open road in Colorado!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736836406/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736836406_e81e4cbee7.jpg&quot; width=&quot;500&quot; alt=&quot;I love the open road in Colorado!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    I arrived at Steamboat around noon, just in time for spring skiing in a t-shirt.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736836766_5c30bba68d_c.jpg&quot; title=&quot;#StoutTheSyncro made it to Steamboat!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736836766/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736836766_5c30bba68d_m.jpg&quot; width=&quot;240&quot; alt=&quot;#StoutTheSyncro made it to Steamboat!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735907937_4681b308f6_c.jpg&quot; title=&quot;Spring skiing at Steamboat&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735907937/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735907937_4681b308f6_m.jpg&quot; width=&quot;240&quot; alt=&quot;Spring skiing at Steamboat&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53735907787_500f72a950_c.jpg&quot; title=&quot;It&apos;s t-shirt weather at #Steamboat today! &amp;#x1F603;&amp;#x26F7;&amp;#xFE0F;&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53735907787/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53735907787_500f72a950_m.jpg&quot; width=&quot;240&quot; alt=&quot;It&apos;s t-shirt weather at #Steamboat today! &amp;#x1F603;&amp;#x26F7;&amp;#xFE0F;&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736835366_439222887d_c.jpg&quot; title=&quot;Mmmmm, beer &amp;#x1F37B;&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736835366/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736835366_439222887d_m.jpg&quot; width=&quot;240&quot; alt=&quot;Mmmmm, beer &amp;#x1F37B;&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    After Steamboat, I headed to our Ski Chalet in Winter Park for the weekend. Friends joined us for an
    end-of-ski-season celebration in Mary Jane&apos;s Challenger lot on Saturday morning.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737170364_7cc4a9a328_c.jpg&quot; title=&quot;Early bird gets a prime parking spot! #SpringSkiing #MaryJane #GoNuggets&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737170364/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737170364_7cc4a9a328_m.jpg&quot; width=&quot;240&quot; alt=&quot;Early bird gets a prime parking spot! #SpringSkiing #MaryJane #GoNuggets&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736835131_a97f7a9ab0_c.jpg&quot; title=&quot;Spring skiing party crew! &amp;#x2764;&amp;#xFE0F;&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736835131/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736835131_a97f7a9ab0_m.jpg&quot; width=&quot;240&quot; alt=&quot;Spring skiing party crew! &amp;#x2764;&amp;#xFE0F;&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53739140223_128b57db93_c.jpg&quot; title=&quot;We ended up with quite the crew!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53739140223/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53739140223_128b57db93_c.jpg&quot; width=&quot;500&quot; alt=&quot;We ended up with quite the crew!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Sunday was a sunny, bluebird day. The kids and I ended our ski season with a final run down Trestle and a stop at
    the treehouse.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53737033543_ffd6a5a15f_c.jpg&quot; title=&quot;Bluebird day on the last day of our ski season!&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53737033543/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53737033543_ffd6a5a15f_m.jpg&quot; width=&quot;240&quot; alt=&quot;Bluebird day on the last day of our ski season!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/53736834656_f04f38463e_c.jpg&quot; title=&quot;Happy Kids at Trestle&quot; rel=&quot;lightbox[utahjug2024]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/53736834656/in/album-72177720317166395/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53736834656_f04f38463e_m.jpg&quot; width=&quot;240&quot; alt=&quot;Happy Kids at Trestle&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; text-align: right; margin-top: -10px; max-width: 500px; font-size: .9em&quot;&gt;
    More photos on Flickr &amp;rarr; &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72177720317166395&quot;&gt;Road Trip to
    Utah JUG 2024&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
    I arrived home late Sunday night. I&apos;m proud of Stout for successfully completing the trip. Now I have even more fond
    memories of speaking at the Utah JUG. Thanks to Jason Porter, Don Bogardus, and Jonathan Bronson for the opportunity! &amp;#x1F60A;
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/a_delightful_trip_to_devnexus</id>
        <title type="html">A Delightful Trip to Devnexus</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_delightful_trip_to_devnexus"/>
        <published>2024-05-11T10:27:21-06:00</published>
        <updated>2024-05-11T16:59:34-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="community" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devnexus" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;&lt;a href=&quot;https://devnexus.com/&quot;&gt;Devnexus&lt;/a&gt; is one of my favorite conferences in the world. I have many fond memories of attending over the years and some awkward ones, too. My first memory is when &lt;a href=&quot;https://afitnerd.com/&quot;&gt;Micah Silverman&lt;/a&gt; and I worked at a Stormpath booth there in February 2017. Okta had just acquihired us and we weren&apos;t allowed to talk about it. We encouraged folks to sign up for our service even though we knew signups would shut down at the end of the week.&lt;/p&gt;
&lt;p&gt;It&apos;s funny how life comes full circle. &lt;a href=&quot;https://raibledesigns.com/rd/entry/funemployment_2024&quot;&gt;My employment with Okta officially ended&lt;/a&gt; the week before this year&apos;s Devnexus. I tried to cancel my talk when I first got the news, but &lt;a href=&quot;https://twitter.com/vincentmayers&quot;&gt;Vincent&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/prpatel&quot;&gt;Pratik&lt;/a&gt; convinced me to go, and I knew it would be good for networking. I&apos;m glad I did because I had a blast! It all started on Monday, April 8th.&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The &lt;a href=&quot;https://twitter.com/devnexus?ref_src=twsrc%5Etfw&quot;&gt;@devnexus&lt;/a&gt; adventure begins! &lt;a href=&quot;https://t.co/J3bfOQrh8k&quot;&gt;pic.twitter.com/J3bfOQrh8k&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1777354136201126385?ref_src=twsrc%5Etfw&quot;&gt;April 8, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;https://devnexus.com/&quot;&gt;Devnexus&lt;/a&gt; is one of my favorite conferences in the world. I have many fond memories of attending over the years and some awkward ones, too. My first memory is when &lt;a href=&quot;https://afitnerd.com/&quot;&gt;Micah Silverman&lt;/a&gt; and I worked at a Stormpath booth there in February 2017. Okta had just acquihired us and we weren&apos;t allowed to talk about it. We encouraged folks to sign up for our service even though we knew signups would shut down at the end of the week.&lt;/p&gt;
&lt;p&gt;It&apos;s funny how life comes full circle. &lt;a href=&quot;https://raibledesigns.com/rd/entry/funemployment_2024&quot;&gt;My employment with Okta officially ended&lt;/a&gt; the week before this year&apos;s Devnexus. I tried to cancel my talk when I first got the news, but &lt;a href=&quot;https://twitter.com/vincentmayers&quot;&gt;Vincent&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/prpatel&quot;&gt;Pratik&lt;/a&gt; convinced me to go, and I knew it would be good for networking. I&apos;m glad I did because I had a blast! It all started on Monday, April 8th.&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The &lt;a href=&quot;https://twitter.com/devnexus?ref_src=twsrc%5Etfw&quot;&gt;@devnexus&lt;/a&gt; adventure begins! &lt;a href=&quot;https://t.co/J3bfOQrh8k&quot;&gt;pic.twitter.com/J3bfOQrh8k&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1777354136201126385?ref_src=twsrc%5Etfw&quot;&gt;April 8, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;I was in a tremendously good mood when I took this photo. I was sporting a new DU hat in anticipation of their &lt;a href=&quot;https://denverpioneers.com/news/2024/4/13/mens-ice-hockey-perfect-10-denver-wins-record-breaking-10th-national-championship.aspx&quot;&gt;NCAA Frozen Four victory&lt;/a&gt; the following weekend. And I was on my way to what seemed like a college reunion. I&apos;ve been a part of the Java community for over 20 years, and many of the speakers are old friends whom I&apos;ve made a lot of memories with.&lt;/p&gt;
&lt;h3&gt;Tuesday, April 9&lt;/h3&gt;
&lt;p&gt;The first day started off with a &lt;a href=&quot;https://jugleaderssummit.com/&quot;&gt;JUG Leaders Summit&lt;/a&gt;. The two presentations I really enjoyed were from &lt;a href=&quot;https://twitter.com/cajasmota&quot;&gt;Jorge Cajas&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/ariwaller&quot;&gt;Ari Waller&lt;/a&gt;. Jorges talked about getting students and younger people involved in JUGs (Java User Groups) and encouraged beginner talks. 
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Advice from &lt;a href=&quot;https://twitter.com/cajasmota?ref_src=twsrc%5Etfw&quot;&gt;@cajasmota&lt;/a&gt; for getting students involved with JUGs:&lt;br&gt;&lt;br&gt;- Offer beginner topics&lt;br&gt;- Organize meetups oriented to students&lt;br&gt;- Keep in touch with professors &lt;br&gt;- Don&amp;#39;t forget that they are kids&lt;a href=&quot;https://twitter.com/hashtag/devnexus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#devnexus&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/jugleaders?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jugleaders&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/java?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#java&lt;/a&gt; &lt;a href=&quot;https://t.co/Bg76D8goGb&quot;&gt;pic.twitter.com/Bg76D8goGb&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1777692344076156988?ref_src=twsrc%5Etfw&quot;&gt;April 9, 2024&lt;/a&gt;&lt;/blockquote&gt; 
&lt;/div&gt;
&lt;p&gt;The Denver JUG used to have two talks at every meeting. The first was a basic concepts talk, and the second was more advanced. Over the years, we did away with the first talk in favor of one main talk and more networking afterward. Jorges pointed out we often expect developers to know Java frameworks when many of the younger developers have never used them.&lt;/p&gt;
&lt;p&gt;Ari talked about an AJUG initiative to support qualified global JUGs by providing a paid Meetup Pro account. This is also part of an effort to bring visibility to the greater Java community and it will be called the Devnexus Java Community Meetup Pro Network.  I&apos;ll update this post when I have more information.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;That afternoon, we had a Java Champions Summit. We discussed many topics, and we&apos;ve since scheduled more time to talk virtually later this month. The photo below from &lt;a href=&quot;https://twitter.com/omniprof&quot;&gt;Ken Fogel&lt;/a&gt; captures that we had a lot of Java leaders in attendance!&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://www.flickr.com/photos/mraible/53692860576/in/album-72177720316633407/&quot; title=&quot;#Java leaders Summit team photo at Devnexus 2024. Credit: Ken Fogel&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53692860576_a3966de850_z.jpg&quot; width=&quot;640&quot; style=&quot;border: 1px solid black&quot; alt=&quot;#Java leaders Summit team photo at Devnexus 2024. Credit: Ken Fogel&quot;/&gt;&lt;/a&gt;&lt;script async src=&quot;//embedr.flickr.com/assets/client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3&gt;Wednesday, April 10&lt;/h3&gt;
&lt;p&gt;Pratik and Vincent kicked off the &amp;lt;dev/&gt;olution on Wednesday morning. Amazingly, they&apos;ve been doing it &lt;a href=&quot;https://www.infoq.com/news/2024/04/devnexus-2024/&quot;&gt;for 20 years&lt;/a&gt;!&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://www.flickr.com/photos/mraible/53693214299/in/album-72177720316633407/&quot; title=&quot;The &amp;lt;dev/&amp;gt;olution begins with Pratik and Vincent!&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/53693214299_bb216e1d27.jpg&quot; width=&quot;500&quot; style=&quot;border: 1px solid black&quot; alt=&quot;The &amp;lt;dev/&amp;gt;olution begins with Pratik and Vincent!&quot;/&gt;&lt;/a&gt;&lt;script async src=&quot;//embedr.flickr.com/assets/client-code.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;I did an interview with &lt;a href=&quot;https://twitter.com/jbaruch&quot;&gt;Baruch Sadogursky&lt;/a&gt; at Gradle&apos;s Build Propulsion Lab after the opening keynote. We talked about developer productivity, open source, &lt;a href=&quot;https://gradle.com/develocity/&quot;&gt;Develocity&lt;/a&gt;, and &lt;a href=&quot;https://www.jhipster.tech/&quot;&gt;JHipster&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/lZVgMpXsQyU?si=YNVV3PG9bb3F3ZUY&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;I also did an interview with Melissa McKay at the DevOps Speakeasy. We talked about my session, Micro Frontends for Java Microservices.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/AXKRe5okdFo?si=6jQigo5X3zhGo5-g&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;That afternoon, &lt;a href=&quot;https://twitter.com/Sharat_Chander&quot;&gt;Sharat Chander&lt;/a&gt;&apos;s keynote about moving Java forward together contained wisdom he learned from his father.&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&amp;quot;Speed, at a certain point, becomes harm. Instead, move thoughtfully and build things.&amp;quot; -- &lt;a href=&quot;https://twitter.com/Sharat_Chander?ref_src=twsrc%5Etfw&quot;&gt;@Sharat_Chander&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/hashtag/Devnexus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Devnexus&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/Java?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Java&lt;/a&gt; &lt;a href=&quot;https://t.co/fYatiUX5cu&quot;&gt;pic.twitter.com/fYatiUX5cu&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1778117887883968895?ref_src=twsrc%5Etfw&quot;&gt;April 10, 2024&lt;/a&gt;&lt;/blockquote&gt; 
&lt;/div&gt;
&lt;p&gt;
&lt;p&gt;I talked with &lt;a href=&quot;https://twitter.com/SeanMiPhillips&quot;&gt;Sean Phillips&lt;/a&gt; the night before. He dazzled me with his enthusiasm for fighting back against bad actors with his &lt;a href=&quot;https://github.com/Birdasaur/Trinity&quot;&gt;Trinity project&lt;/a&gt;. I was not disappointed during his talk and thoroughly enjoyed all my conversations with him and his lovely wife.&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;This was an awesomely energetic talk by &lt;a href=&quot;https://twitter.com/SeanMiPhillips?ref_src=twsrc%5Etfw&quot;&gt;@SeanMiPhillips&lt;/a&gt;! I enjoyed it immensely. Check out his Trinity project which can detect AI-generated audio in minutes. Built with JavaFX.&lt;a href=&quot;https://t.co/X9EuhNEmIg&quot;&gt;https://t.co/X9EuhNEmIg&lt;/a&gt;&lt;br&gt;&lt;br&gt;Release for &lt;a href=&quot;https://twitter.com/devnexus?ref_src=twsrc%5Etfw&quot;&gt;@devnexus&lt;/a&gt;: &lt;a href=&quot;https://t.co/cHnChwLUIY&quot;&gt;https://t.co/cHnChwLUIY&lt;/a&gt; &lt;a href=&quot;https://t.co/yiBEEx06aV&quot;&gt;https://t.co/yiBEEx06aV&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1778156667764408768?ref_src=twsrc%5Etfw&quot;&gt;April 10, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;Seeing so many old friends at the conference before the social activities that evening was awesome.&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;A lot of good friends and &lt;a href=&quot;https://twitter.com/hashtag/usualsuspects?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#usualsuspects&lt;/a&gt; are at &lt;a href=&quot;https://twitter.com/hashtag/Devnexus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Devnexus&lt;/a&gt; this year! &amp;#x2764;&amp;#xFE0F; &lt;a href=&quot;https://t.co/7poa8ARQh2&quot;&gt;pic.twitter.com/7poa8ARQh2&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1778205643817816337?ref_src=twsrc%5Etfw&quot;&gt;April 10, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;h3&gt;Thursday, April 11&lt;/h3&gt;
&lt;p&gt; I prepped for my talk Thursday morning, practiced my demo, and dressed up as an old-fashioned Java developer. My talk had a full room and I finished right on time. The &lt;a href=&quot;https://github.com/mraible/jhipster-micro-frontends/blob/main/demo.adoc&quot;&gt;demo&lt;/a&gt; worked flawlessly, so I was quite pleased. You can &lt;a href=&quot;https://speakerdeck.com/mraible/micro-frontends-for-java-microservices-devnexus-2024&quot;&gt;find my presentation on Speaker Deck&lt;/a&gt;. 
&lt;div style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
&lt;iframe class=&quot;speakerdeck-iframe&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/7cc4d9e318c84037b665a770559964bd&quot; title=&quot;Micro Frontends for Java Microservices - Devnexus 2024&quot; allowfullscreen=&quot;true&quot; style=&quot;border: 0px; background: padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;&quot; data-ratio=&quot;1.7777777777777777&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;That afternoon, I hung out with &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt; and met &lt;a href=&quot;https://www.linkedin.com/in/bonochris&quot;&gt;Chris Bono&lt;/a&gt;. We had cocktails at &lt;a href=&quot;https://www.whiteoakkitchen.com/&quot;&gt;White Oak&lt;/a&gt; and had a fun time talking about Spring, life, and our fantastic children. From there, I reunited with former colleagues &lt;a href=&quot;https://twitter.com/briandemers&quot;&gt;Brian Demers&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rdegges&quot;&gt;Randall Degges&lt;/a&gt;, Micah Silverman, and others at &lt;a href=&quot;https://www.cutsatlanta.com/downtown&quot;&gt;Cuts Steakhouse&lt;/a&gt;. I sat next to &lt;a href=&quot;https://www.linkedin.com/in/jonkschneider&quot;&gt;Jonathan Schneider&lt;/a&gt; from &lt;a href=&quot;https://github.com/openrewrite&quot;&gt;OpenRewrite&lt;/a&gt; and learned a lot. I was impressed to learn that OpenRewrite is used to upgrade applications between major releases, and some folks have used it to migrate from one Java framework to another. 
&lt;/p&gt;
&lt;h3&gt;Friday, April 12&lt;/h3&gt;
&lt;p&gt;The conference ended on Thursday, and Friday was a designated Speaker Day. We gathered at Cabbagetown Park for a few hours of volleyball, reminiscing, and recovering from the week of intense social activities. That evening, we headed to &lt;a href=&quot;https://www.thepaintedduckatl.com/&quot;&gt;The Painted Duck&lt;/a&gt; for some duckpin bowling. It was a lot harder than regular bowling, yet fun was had by all.&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Fun times duckpin bowling with &lt;a href=&quot;https://twitter.com/devnexus?ref_src=twsrc%5Etfw&quot;&gt;@devnexus&lt;/a&gt; speakers! &amp;#x1F986;&lt;a href=&quot;https://t.co/JMz2zChMST&quot;&gt;pic.twitter.com/JMz2zChMST&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1778928398397489350?ref_src=twsrc%5Etfw&quot;&gt;April 12, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;If you ever get a chance to attend or speak at Devnexus, I highly recommend it. It&apos;s a well-run show, and the community vibe is wonderful. Thank you, Pratik, Vincent, and the Atlanta JUG team!</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_angular_mini_book_3</id>
        <title type="html">The Angular Mini-Book 3.0 is now available!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_angular_mini_book_3"/>
        <published>2023-06-23T05:44:05-06:00</published>
        <updated>2023-06-23T12:46:13-06:00</updated> 
        <category term="/Open Source" label="Open Source" />
        <category term="typescript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="minibook" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;I&apos;m excited to announce that the Angular Mini-Book 3.0 is now available! You can &lt;a href=&quot;https://www.infoq.com/minibooks/angular-mini-book-v3/&quot;&gt;download it in PDF and EPUB formats from InfoQ&lt;/a&gt;.
&lt;p&gt;
&lt;a href=&quot;https://www.infoq.com/minibooks/angular-mini-book-v3/&quot; data-href=&quot;https://www.flickr.com/photos/mraible/51687063929/&quot; title=&quot;Angular Mini-Book Cover&quot;&gt;&lt;img srcset=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 480w, https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 800w&quot; sizes=&quot;(max-width: 600px) 480px, 800px&quot; src=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg&quot; class=&quot;picture&quot; alt=&quot;Angular Mini-Book Cover&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;h3&gt;About this book&lt;/h3&gt;
&lt;p&gt;The Angular Mini-Book is a guide to getting started with Angular. You&apos;ll learn how to develop a bare-bones application, test it, and deploy it. Then you&apos;ll move on to adding Bootstrap, Angular Material, continuous integration, authentication, and end-to-end testing with Cypress. &lt;/p&gt;
&lt;p&gt;
Spring Boot is a popular framework for building REST APIs. You&apos;ll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy. What about deploying your Angular app to the cloud? Yep, it covers that too! 
&lt;/p&gt;
&lt;h3&gt;What&apos;s new?&lt;/h3&gt;
&lt;p&gt;This new edition uses Angular 15 and Spring Boot 3.0. Some other fun facts:&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;Tech reviewed by Angular expert &lt;a href=&quot;https://alisaduncan.dev/&quot;&gt;Alisa Duncan&lt;/a&gt;. She improved many of the code samples, and I&apos;m grateful for her help. You should &lt;a href=&quot;https://twitter.com/AlisaDuncan&quot;&gt;follow her on Twitter&lt;/a&gt;!
&lt;li&gt;First commit on 3.0 version: Feb 16, 2023 &lt;/li&gt;
&lt;li&gt;Files changed since 2.0: 558&lt;/li&gt;
&lt;li&gt;Build date: June 9, 2023&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You might say this book is outdated on launch. However, I &lt;a href=&quot;https://github.com/mraible/angular-book/pull/587&quot;&gt;created a GitHub Action&lt;/a&gt; to upgrade all the examples to use Angular 16 and Spring Boot 3.1. This action proves all the code should work if you create apps with the latest Angular and Spring Boot versions. &amp;#x1F60A;&lt;/p&gt;
&lt;p&gt;To send us feedback or issues, e-mail InfoQ at feedback@infoq.com, email me at matt@raibledesigns.com, or hit me up on Twitter &lt;a href=&quot;https://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt;.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_angular_mini_book_2</id>
        <title type="html">The Angular Mini-Book 2.0 is now available!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_angular_mini_book_2"/>
        <published>2022-02-18T08:24:39-07:00</published>
        <updated>2022-02-18T14:24:39-07:00</updated> 
        <category term="/Open Source" label="Open Source" />
        <category term="minibook" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="typescript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;I&apos;m pumped to announce that the Angular Mini-Book 2.0 has been released! You can &lt;a href=&quot;https://www.infoq.com/minibooks/angular-mini-book-v2/&quot;&gt;download it in PDF and EPUB formats from InfoQ&lt;/a&gt;.
&lt;p&gt;
&lt;a href=&quot;https://www.infoq.com/minibooks/angular-mini-book-v2/&quot; data-href=&quot;https://www.flickr.com/photos/mraible/51687063929/&quot; title=&quot;Angular Mini-Book Cover&quot;&gt;&lt;img srcset=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 480w, https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 800w&quot; sizes=&quot;(max-width: 600px) 480px, 800px&quot; src=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg&quot; class=&quot;picture&quot; alt=&quot;Angular Mini-Book Cover&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;h3&gt;About this book&lt;/h3&gt;
&lt;p&gt;The Angular Mini-Book is a guide to getting started with Angular. You&apos;ll learn how to develop a bare-bones application, test it, and deploy it. Then you&apos;ll move on to adding Bootstrap, Angular Material, continuous integration, and authentication. &lt;/p&gt;
&lt;p&gt;
Spring Boot is a popular framework for building REST APIs. You&apos;ll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy. What about deploying your Angular app to the cloud? Yep, it covers that too!
&lt;/p&gt;
&lt;h3&gt;What&apos;s new?&lt;/h3&gt;
&lt;p&gt;This new edition (2.0) uses Angular 13 and Spring Boot 2.6. Some other fun facts:&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;First commit on 2.0 version: Nov 19, 2021 { &lt;em&gt;Thanks to &lt;a href=&quot;https://jamesward.com/&quot;&gt;James Ward&lt;/a&gt; for his help upgrading to Knative 1.0!&lt;/em&gt; }&lt;/li&gt;
&lt;li&gt;Upgraded the book&apos;s project to use Gradle 7: Dec 2, 2021 { &lt;em&gt;I appreciate you &lt;a href=&quot;https://twitter.com/Mogztter&quot;&gt;Guillaume Grossetie&lt;/a&gt;!&lt;/em&gt; }&lt;/a&gt;
&lt;li&gt;Upgraded to Angular 13 and Spring Boot 2.6.1: Jan 7, 2022&lt;/li&gt;
&lt;li&gt;Detailed QA of all the code: Jan 27 - &lt;a href=&quot;https://twitter.com/mraible/status/1491856038085251082&quot;&gt;Feb 10, 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Files changed since 1.0: 244&lt;/li&gt;
&lt;li&gt;Build date: Feb 17, 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information about this book, please read &lt;a href=&quot;https://raibledesigns.com/rd/entry/the_angular_mini_book_1&quot;&gt;my post about its 1.0 release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;To send us feedback or issues, e-mail InfoQ at feedback@infoq.com, email me at matt@raibledesigns.com, or hit me up on Twitter &lt;a href=&quot;https://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt;.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_angular_mini_book_1</id>
        <title type="html">The Angular Mini-Book 1.0 is now available!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_angular_mini_book_1"/>
        <published>2021-11-17T14:48:40-07:00</published>
        <updated>2021-11-19T14:09:46-07:00</updated> 
        <category term="/Open Source" label="Open Source" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="minibook" scheme="http://roller.apache.org/ns/tags/" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular" scheme="http://roller.apache.org/ns/tags/" />
        <category term="typescript" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">I&apos;m pleased to announce that the Angular Mini-Book has been released! You can &lt;a href=&quot;http://www.infoq.com/minibooks/angular-mini-book&quot;&gt;download it in PDF and EPUB formats from InfoQ&lt;/a&gt;.
&lt;p&gt;
&lt;a href=&quot;http://www.infoq.com/minibooks/angular-mini-book&quot; data-href=&quot;https://www.flickr.com/photos/mraible/51687063929/&quot; title=&quot;Angular Mini-Book Cover&quot;&gt;&lt;img srcset=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 480w, https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 800w&quot; sizes=&quot;(max-width: 600px) 480px, 800px&quot; src=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg&quot; class=&quot;picture&quot; alt=&quot;Angular Mini-Book Cover&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;h3&gt;About this book&lt;/h3&gt;
&lt;p&gt;The Angular Mini-Book is a guide to getting started with Angular. You&apos;ll learn how to develop a bare-bones application, test it, and deploy it. Then you&apos;ll move on to adding Bootstrap, Angular Material, continuous integration, and authentication. Spring Boot is a popular framework for building REST APIs. You&apos;ll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy.
&lt;/p&gt;
&lt;p&gt;
This initial edition (v1.0) uses Angular 12 and Spring Boot 2.5. I do plan on updating it for Angular 13 and Spring Boot 2.6. If you have any tips for upgrading, please let me know!&lt;/p&gt;
&lt;h3&gt;Purpose of the book&lt;/h3&gt;
&lt;p&gt;I think building web and mobile applications with Angular, Bootstrap, and Spring Boot is a great experience. I&apos;d like to encourage more developers to try it.&lt;/p&gt;
&lt;h3&gt;Thanks!&lt;/h3&gt;
&lt;p&gt;I&apos;m incredibly grateful to Trish, Abbie, and Jack. They put up with my late nights and extended screen time while I worked on this book.
&lt;/p&gt;</summary>
        <content type="html">I&apos;m pleased to announce that the Angular Mini-Book has been released! You can &lt;a href=&quot;http://www.infoq.com/minibooks/angular-mini-book&quot;&gt;download it in PDF and EPUB formats from InfoQ&lt;/a&gt;.
&lt;p&gt;
&lt;a href=&quot;http://www.infoq.com/minibooks/angular-mini-book&quot; data-href=&quot;https://www.flickr.com/photos/mraible/51687063929/&quot; title=&quot;Angular Mini-Book Cover&quot;&gt;&lt;img srcset=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 480w, https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg 800w&quot; sizes=&quot;(max-width: 600px) 480px, 800px&quot; src=&quot;https://live.staticflickr.com/65535/51687063929_f89f0e0f71_n.jpg&quot; class=&quot;picture&quot; alt=&quot;Angular Mini-Book Cover&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;h3&gt;About this book&lt;/h3&gt;
&lt;p&gt;The Angular Mini-Book is a guide to getting started with Angular. You&apos;ll learn how to develop a bare-bones application, test it, and deploy it. Then you&apos;ll move on to adding Bootstrap, Angular Material, continuous integration, and authentication. Spring Boot is a popular framework for building REST APIs. You&apos;ll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy.
&lt;/p&gt;
&lt;p&gt;
This initial edition (v1.0) uses Angular 12 and Spring Boot 2.5. I do plan on updating it for Angular 13 and Spring Boot 2.6. If you have any tips for upgrading, please let me know!&lt;/p&gt;
&lt;h3&gt;Purpose of the book&lt;/h3&gt;
&lt;p&gt;I think building web and mobile applications with Angular, Bootstrap, and Spring Boot is a great experience. I&apos;d like to encourage more developers to try it.&lt;/p&gt;
&lt;h3&gt;Thanks!&lt;/h3&gt;
&lt;p&gt;I&apos;m incredibly grateful to Trish, Abbie, and Jack. They put up with my late nights and extended screen time while I worked on this book.
&lt;/p&gt;
&lt;p&gt;
To &lt;a href=&quot;https://twitter.com/mhevery&quot;&gt;Mi&#353;ko Hevery&lt;/a&gt;, thank you for inventing Angular and changing the lives of frontend developers. To the whole Angular team, I appreciate you and all you do for the community. Kudos for making our apps faster with every release!
&lt;/p&gt;
&lt;p&gt;
To &lt;a href=&quot;https://twitter.com/phillip_webb&quot;&gt;Phil Webb&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/david_syer&quot;&gt;Dave Syer&lt;/a&gt;, thanks for creating Spring Boot and simplifying Java for everyone. Hats off to the whole Spring team for their tireless dedication to quality open source projects.
&lt;/p&gt;
&lt;p&gt;
I want to thank this book&apos;s tech editor, &lt;a href=&quot;https://twitter.com/deepu105&quot;&gt;Deepu K Sasidharan&lt;/a&gt;. I looked to him for his deep experience with both TypeScript and JavaScript. Many sections are more streamlined because of his advice.
&lt;/p&gt;
&lt;p&gt;
This book&apos;s copy editor, Maureen Spencer, helped correct my grammar and make this book easier on the eyes. I&apos;m thankful for your help, Maureen.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/reverentgeek&quot;&gt;David Neal&lt;/a&gt; created the cover image and all of the illustrations. He&apos;s awesome! You should consider &lt;a href=&quot;https://reverentgeek.com/shop/&quot;&gt;buying his stuff&lt;/a&gt; and follow him for his dad jokes.
&lt;p&gt;
Finally, my compliments to you, potential reader. It&apos;s a heckuva time to be writing code. Enjoy your learning adventures! &amp;#x1F603;
&lt;/p&gt;
&lt;h3&gt;Fun facts&lt;/h3&gt;
&lt;p&gt;Creating this book was more difficult than I imagined. As you can see from the timeline below, I didn&apos;t do a whole lot in 2020. I ramped things up this spring and tried to get &apos;er done before Angular 13 and Spring Boot 2.6 were released. At the very least, I succeeded on the second goal, even if only by a couple days.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First commit: June 25, 2020&lt;/li&gt;
&lt;li&gt;Outline created: September 15, 2020&lt;/li&gt;
&lt;li&gt;Started writing: October 3, 2020&lt;/li&gt;
&lt;li&gt;Upgraded to Angular 12 and Spring Boot 2.4.1: May 4, 2021&lt;/li&gt;
&lt;li&gt;Finished first draft: June 30, 2021&lt;/li&gt;
&lt;li&gt;Build date: November 16, 2021&lt;/li&gt;
&lt;li&gt;Total commits: 108&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This book was authored with &lt;a href=&quot;https://asciidoctor.org/&quot;&gt;Asciidoctor&lt;/a&gt; and I appreciate the assistance I received from &lt;a href=&quot;https://twitter.com/Mogztter&quot;&gt;Guillaume Grossetie&lt;/a&gt;.
&lt;p&gt;The source code repo contains all the demos in addition to the book&apos;s code. The &lt;a href=&quot;https://github.com/AlDanial/cloc&quot;&gt;Count Lines of Code&lt;/a&gt; report (excluding generated files and directories) shows that it&apos;s mostly words, followed by example code:&lt;/p&gt;
&lt;pre&gt;
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
AsciiDoc                         14           1651             20           5312
HTML                             38            211              0           2349
TypeScript                       86            322            299           2057
JSON                             27              0              0           1346
CSS                              11            265            250           1288
YAML                             10              8             89            654
Kotlin                           18             87              4            499
JavaScript                       12             35             48            355
Gradle                            6             43              4            227
Bourne Shell                      2             50            144            225
&lt;/pre&gt;
&lt;p&gt;I&apos;m proud to have built the v1.0 version of the book on my parent&apos;s 49th anniversary. Happy Anniversary Mom and Dad!! &amp;#x1F973;&lt;/p&gt;
&lt;p&gt;To send us feedback or issues, e-mail InfoQ at feedback@infoq.com, email me at matt@raibledesigns.com, or hit me up on Twitter &lt;a href=&quot;https://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/secure_by_design_book_review</id>
        <title type="html">Secure by Design Book Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/secure_by_design_book_review"/>
        <published>2020-05-25T20:11:22-06:00</published>
        <updated>2020-05-26T02:32:16-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="architecture" scheme="http://roller.apache.org/ns/tags/" />
        <category term="securebydesign" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bookreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I recently finished reading &lt;a href=&quot;https://www.manning.com/books/secure-by-design&quot;&gt;Secure by Design&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/danbjson&quot;&gt;Dan Bergh Johnsson&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/danieldeogun&quot;&gt;Daniel Deogun&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/danielsawano&quot;&gt;Daniel Sawano&lt;/a&gt;. I started reading it shortly after I received it as a gift from Dan Bergh Johnsson at Jfokus 2020.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; text-align: center; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I scored a signed copy of &lt;a href=&quot;https://twitter.com/hashtag/SecureByDesign?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#SecureByDesign&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/danbjson?ref_src=twsrc%5Etfw&quot;&gt;@danbjson&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/hashtag/Jfokus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Jfokus&lt;/a&gt;. Excited to read the wisdom in this one! &amp;#x1F917; &lt;a href=&quot;https://twitter.com/hashtag/security?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#security&lt;/a&gt; &lt;a href=&quot;https://t.co/q0bxIvIwXF&quot;&gt;pic.twitter.com/q0bxIvIwXF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1225422117841272833?ref_src=twsrc%5Etfw&quot;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Secure by Design hooked me from the beginning. Chapter 1 dives right in and shows why design matters for security and how security shouldn&apos;t be an afterthought. The authors show how developers will have a difficult time grokking security if you make them remember security-related API calls. However, if you bake security into your design and codify your security practices, developers will be more secure by default. 
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I recently finished reading &lt;a href=&quot;https://www.manning.com/books/secure-by-design&quot;&gt;Secure by Design&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/danbjson&quot;&gt;Dan Bergh Johnsson&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/danieldeogun&quot;&gt;Daniel Deogun&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/danielsawano&quot;&gt;Daniel Sawano&lt;/a&gt;. I started reading it shortly after I received it as a gift from Dan Bergh Johnsson at Jfokus 2020.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; text-align: center; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I scored a signed copy of &lt;a href=&quot;https://twitter.com/hashtag/SecureByDesign?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#SecureByDesign&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/danbjson?ref_src=twsrc%5Etfw&quot;&gt;@danbjson&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/hashtag/Jfokus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Jfokus&lt;/a&gt;. Excited to read the wisdom in this one! &amp;#x1F917; &lt;a href=&quot;https://twitter.com/hashtag/security?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#security&lt;/a&gt; &lt;a href=&quot;https://t.co/q0bxIvIwXF&quot;&gt;pic.twitter.com/q0bxIvIwXF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1225422117841272833?ref_src=twsrc%5Etfw&quot;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Secure by Design hooked me from the beginning. Chapter 1 dives right in and shows why design matters for security and how security shouldn&apos;t be an afterthought. The authors show how developers will have a difficult time grokking security if you make them remember security-related API calls. However, if you bake security into your design and codify your security practices, developers will be more secure by default. 
&lt;/p&gt;
&lt;p&gt;I liked their Java example with domain primitives so much that I used it in my &lt;a href=&quot;https://developer.okta.com/blog/2020/03/23/microservice-security-patterns#1-be-secure-by-design&quot;&gt;Security Patterns for Microservice Architectures&lt;/a&gt; blog post.
&lt;/p&gt;
&lt;p&gt;Chapter 1 ends with encouragement to view security as a concern to be met rather than a set of features. Design is the guiding principle for how a system is built and is applicable on all levels, from code to architecture. Well-known security threats should drive design decisions in security architectures.
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;One thing I appreciate about this book is they summarized each chapter&apos;s main points at the end. Writing reviews like this one are much easier with summaries. &amp;#x1F44D;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In Part 2, there&apos;s enough domain-driven design to make you knowledgeable, but not dangerous. In Chapter 4, they cover code constructs that promote security, like immutability and validation. Domain primitives are the smallest building blocks of a secure architecture. They can contain many checks above and beyond validation that will keep your developers cranking out secure code. The next two chapters discuss maintaining the integrity of the state and reducing state complexity.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Yeah, there&apos;s a lot to digest in this book. I read it over a few months.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chapter 8 gets into leveraging your delivery pipeline for security and testing. I love that all the code examples in this section used JUnit 5 and were up-to-date with current Java testing practices. I felt like the book was just released last week!
&lt;/p&gt;
&lt;p&gt;Chapter 9 is an excellent tour of how exceptions can be used in your architecture to indicate failures. Or better yet, design for availability with resilience, responsiveness, and graceful failure handling. The availability of your data and system should be an important security goal and is part of the CIA acronym (confidentiality, integrity, and availability).&lt;/p&gt;
&lt;p&gt;Chapter 10 gets into cloud-native thinking and the twelve-factor app. Once you have your apps running with twelve-factor concepts, you can adopt the three R&apos;s of enterprise security: Rotate, Repave, and Repair. In short, having an architecture where everything runs in the cloud allows you to take security to the next level, and:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Rotate secrets every few minutes or hours.&lt;/li&gt;
  &lt;li&gt;Repave servers and applications every few hours.&lt;/li&gt;
  &lt;li&gt;Repair vulnerable software as soon as possible (within a few hours), and a patch is available.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Part 3 is all about applying what you learned. How do you adopt domain primitives with legacy code? The authors suggest a few different options. Chapter 13 is all about microservices. I found it especially interesting to learn how logs can leak sensitive data and how logging data can be used after-the-fact to be a 2nd-level attack. The final chapter suggests guidelines for security in code reviews, challenging your design with penetration tests, and making security a source of inspiration.&lt;/p&gt;
&lt;h3&gt;Recommendation: A Strong Buy&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;I give Secure by Design 5 stars!&lt;/strong&gt; &amp;#x2B50;&amp;#xFE0F;&amp;#x2B50;&amp;#xFE0F;&amp;#x2B50;&amp;#xFE0F;&amp;#x2B50;&amp;#xFE0F;&amp;#x2B50;&amp;#xFE0F;&lt;/p&gt;
&lt;p&gt;I learned a lot of new information about designing secure systems and look forward to using this knowledge in my projects. Cheers to the book&apos;s authors: Dan, Daniel, and Daniel. I think you created an excellent security reference book that will help many developers and companies be more secure by design.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at</id>
        <title type="html">A Fantastically Fun February at Jfokus 2020 and the Rocky Mountain JUGs</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at"/>
        <published>2020-03-15T14:24:25-06:00</published>
        <updated>2020-03-16T18:20:47-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="utahjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jfokus2020" scheme="http://roller.apache.org/ns/tags/" />
        <category term="denverjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bouderjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="skiing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jfokus" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;Jfokus is one of my favorite conferences in the world. It takes place in Stockholm, Sweden, during one of the coldest months of the year. As a native Montanan, I love the winter season and skiing. It was with great pleasure that I returned to Jfokus as a speaker this year, after skipping the last couple of years.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4_c.jpg&quot; title=&quot;Made it to Stockholm!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662000118/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4.jpg&quot; width=&quot;500&quot; alt=&quot;Made it to Stockholm!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;True story: the last time I was at Jfokus was 2017, and Okta had just acquired Stormpath. I negotiated my Okta employment terms in the Radisson Blu lobby!&lt;/p&gt;

&lt;p&gt;I gave three talks this year: two on the main stage during Jfokus and one at Jforum Stockholm on Tuesday evening.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Jfokus is one of my favorite conferences in the world. It takes place in Stockholm, Sweden, during one of the coldest months of the year. As a native Montanan, I love the winter season and skiing. It was with great pleasure that I returned to Jfokus as a speaker this year, after skipping the last couple of years.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4_c.jpg&quot; title=&quot;Made it to Stockholm!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662000118/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4.jpg&quot; width=&quot;500&quot; alt=&quot;Made it to Stockholm!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;True story: the last time I was at Jfokus was 2017, and Okta had just acquired Stormpath. I negotiated my Okta employment terms in the Radisson Blu lobby!&lt;/p&gt;

&lt;p&gt;I gave three talks this year: two on the main stage during Jfokus and one at Jforum Stockholm on Tuesday evening.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662828892_27e1eed875_c.jpg&quot; title=&quot;The Main Stage&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662828892/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662828892_27e1eed875_m.jpg&quot; width=&quot;240&quot; alt=&quot;The Main Stage&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662550446_2a6a6d2fbf_c.jpg&quot; title=&quot;Crowd at JForum (Stockholm JUG)&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662550446/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662550446_2a6a6d2fbf_m.jpg&quot; width=&quot;240&quot; alt=&quot;Crowd at JForum (Stockholm JUG)&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  You can find my presentations below.&lt;/p&gt;
&lt;table style=&quot;margin: 0 auto&quot;&gt;
  &lt;tr&gt;
    &lt;td&gt;
      &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;0b32783ee80c4ad69075affe48551383&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
    &lt;/td&gt;
    &lt;td&gt;
      &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;1f40e53acdf7441895e526dc19468ae1&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td colspan=&quot;2&quot;&gt;
      &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;7bed076e8b6e46c1950decd07fcba13c&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  Jfokus also published recordings of my main-stage sessions on YouTube.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; style=&quot;max-width: 100%&quot; src=&quot;https://www.youtube.com/embed/DLQqJg393wM&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; style=&quot;max-width: 100%&quot; src=&quot;https://www.youtube.com/embed/CCf0224_XBI&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;After Jfokus, the organizers planned a speaker&apos;s conference at &lt;a href=&quot;https://www.skistar.com/en/ski-destinations/trysil/ski-area/&quot;&gt;Trysil Ski Area&lt;/a&gt;. There wasn&apos;t a ton of snow, but the groomers were fast, and they had a 45&#176; double black!&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662014628_42965e5213_c.jpg&quot; title=&quot;Trysil Ski Resort&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662014628/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662014628_42965e5213_q.jpg&quot; width=&quot;150&quot; alt=&quot;Trysil Ski Resort&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662835872_9a9a41638f_c.jpg&quot; title=&quot;The Jfokus 2020 Ski Team!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662835872/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662835872_9a9a41638f_q.jpg&quot; width=&quot;150&quot; alt=&quot;The Jfokus 2020 Ski Team!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662836782_1f3aec2f11_c.jpg&quot; title=&quot;The 45&#176; ??&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662836782/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662836782_1f3aec2f11_q.jpg&quot; width=&quot;150&quot; alt=&quot;The 45&#176; ??&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I had my GoPro and shot some footage of the fun. &lt;/p&gt;

&lt;div style=&quot;text-align: center&quot;&gt;
  &lt;iframe src=&quot;https://player.vimeo.com/video/397652628&quot; width=&quot;640&quot; height=&quot;360&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; fullscreen&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;The beer tasting and dinner that evening at Kveik Restaurant &amp;amp; Brewpub was excellent!&lt;/p&gt;

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;no&quot; dir=&quot;ltr&quot;&gt;Beer tasting at Kveik Restaurant &amp;amp; Brewpub in Trysil, Norway. ?? &lt;a href=&quot;https://twitter.com/hashtag/jfokus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jfokus&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/speakerconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#speakerconf&lt;/a&gt; &lt;a href=&quot;https://t.co/CR8t2fjmR6&quot;&gt;pic.twitter.com/CR8t2fjmR6&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1225507738677063680?ref_src=twsrc%5Etfw&quot;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
  Friday was a gorgeous day on the slopes, and Saturday was the opposite.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Yesterday versus today. &lt;a href=&quot;https://twitter.com/hashtag/whiteout?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#whiteout&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/skiing?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#skiing&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/jfokus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jfokus&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/speakerconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#speakerconf&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/day15?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#day15&lt;/a&gt; &lt;a href=&quot;https://t.co/L7ynGv0Umt&quot;&gt;pic.twitter.com/L7ynGv0Umt&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1226062130316599296?ref_src=twsrc%5Etfw&quot;&gt;February 8, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
  I had a marvelous time at &lt;a href=&quot;https://jfokus.se&quot;&gt;Jfokus&lt;/a&gt; 2020! Thanks to
  &lt;a href=&quot;https://twitter.com/matkar&quot;&gt;Mattias Karlsson&lt;/a&gt; and crew for a exquisite experience! &amp;#x1F44C;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662551551_9cf7cae2fa_c.jpg&quot; title=&quot;Dressed up with Mattias for the Jfokus party!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662551551/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662551551_9cf7cae2fa.jpg&quot; width=&quot;500&quot; alt=&quot;Dressed up with Mattias for the Jfokus party!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;font-size: .9em;font-style: italic;text-align: right;margin-top: -15px !important;width: 500px;margin: 0 auto;&quot;&gt;For more photos see my &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157713496655132&quot;&gt;Jfokus 2020 album&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;rocky-mountain-jug-tour&quot;&gt;Rocky Mountain JUG Tour with Ray Tsang&lt;/h3&gt;
&lt;p&gt;
  I flew back to Denver on Sunday, February 9th. The next day, I woke up early for a &lt;a href=&quot;https://www.meetup.com/dev-ski-days/events/267834183/&quot;&gt;Developer Ski Day at Eldora&lt;/a&gt;. Stout the Syncro was not a big supporter of the event.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Doh! Just when I thought my Syncro Westy was doing great, something breaks. Loud thump like I&amp;#39;d run over something, then a knocking while driving. I&amp;#39;m guessing it&amp;#39;s a ball joint in the front.&lt;br&gt;&lt;br&gt;Currently waiting for a tow from AAA.&lt;br&gt;&lt;br&gt;Heckuva start to &lt;a href=&quot;https://twitter.com/hashtag/DevSkiDay?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#DevSkiDay&lt;/a&gt;! &lt;a href=&quot;https://twitter.com/hashtag/VanLife?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#VanLife&lt;/a&gt; &lt;a href=&quot;https://t.co/2KMUZSTdtX&quot;&gt;pic.twitter.com/2KMUZSTdtX&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1226878533714292738?ref_src=twsrc%5Etfw&quot;&gt;February 10, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
  Once I made it on the slopes, we had a ball with Christina, Ben, Robert, and Joel.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49521529932_d9623d5318_c.jpg&quot; title=&quot;The inaugural crew!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49521529932/in/album-72157713068403413/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49521529932_d9623d5318_m.jpg&quot; width=&quot;240&quot; alt=&quot;The inaugural crew!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49526258492_1697766cf4_c.jpg&quot; title=&quot;Ray, Christina, and Ben&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49526258492/in/album-72157713068403413/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49526258492_1697766cf4_m.jpg&quot; width=&quot;240&quot; alt=&quot;Ray, Christina, and Ben&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;font-size: .9em;font-style: italic;text-align: right;margin-top: -15px !important;width: 500px;margin: 0 auto;&quot;&gt;&lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157713068403413&quot;&gt;More photos &amp;#x2192;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
  On Tuesday, Ray and I prepared for our Rocky Mountain JUG Tour consisting of stops in Boulder, Denver, and Salt Lake City. I met him at a Google Boulder office and delighted in the VW decorations.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662120773_4d38d18c2d_c.jpg&quot; title=&quot;Lunch at Google in Boulder with Ray Tsang. I dig the VW Bus in the lobby!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662120773/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662120773_4d38d18c2d.jpg&quot; width=&quot;500&quot; alt=&quot;Lunch at Google in Boulder with Ray Tsang. I dig the VW Bus in the lobby!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662941707_4f3fedf91e_c.jpg&quot; title=&quot;A great quote with VW parts on the wall at Google  Boulder.&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662941707/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662941707_4f3fedf91e.jpg&quot; width=&quot;500&quot; alt=&quot;A great quote with VW parts on the wall at Google  Boulder.&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Our talk was titled &lt;b&gt;Choose Your Own Adventure with JHipster and Kubernetes&lt;/b&gt;. We used JHipster to build and deploy whatever technologies the audience chose. We let them choose the database, the build tool, the JVM language, the web framework, and the architecture (monolith vs microservices). After we created the apps, I showed them running, and made them work with Okta. Ray took it from there and used JHipster&apos;s Kubernetes generator to add (or exclude) Istio and deploy everything to Google Cloud. When all worked on the first try at the Denver JUG, &lt;a href=&quot;https://youtu.be/SolTvAXhaVc?t=4337&quot;&gt;we were pretty pumped&lt;/a&gt;! &amp;#x1F64C;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662122783_135d871c02_c.jpg&quot; title=&quot;Stop 1: Boulder JUG&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662122783/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662122783_135d871c02_q.jpg&quot; width=&quot;150&quot; alt=&quot;Stop 1: Boulder JUG&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662944032_f06872ba97_c.jpg&quot; title=&quot;Stop 2: Denver JUG&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662944032/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662944032_f06872ba97_q.jpg&quot; width=&quot;150&quot; alt=&quot;Stop 2: Denver JUG&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662664076_e174fa7882_c.jpg&quot; title=&quot;Stop 3: Utah JUG&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662664076/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662664076_e174fa7882_q.jpg&quot; width=&quot;150&quot; alt=&quot;Stop 3: Utah JUG&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  Interesting trends: we had a lot of enthusiasm for Grails in Colorado and all audiences chose microservices. You can skim through our presentation below.&lt;/p&gt;
&lt;p style=&quot;text-align: center; padding: 20px&quot;&gt;
  &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;e19bd9dc6911471a9bdaf2d2c6654987&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
  On Friday, we hit the slopes for &lt;a href=&quot;https://www.meetup.com/dev-ski-days/events/267834234/&quot;&gt;another developer ski day&lt;/a&gt;.
&lt;/p&gt;

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/B8jsREGF3PZ/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; data-instgrm-version=&quot;12&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/B8jsREGF3PZ/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; height=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns&lt;img src=&quot;https://raibledesigns.com/images/smileys/love.gif&quot; class=&quot;smiley&quot; alt=&quot;:x&quot; title=&quot;:x&quot; /&gt;link=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt; View this post on Instagram&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/B8jsREGF3PZ/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot;&gt;?It&amp;#39;s a #HappyFriday at @snowbird with @saturnism2 and @brettgpalmer! ?#DevSkiDay&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;A post shared by &lt;a href=&quot;https://www.instagram.com/vwsforlife/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot;&gt; Matt Raible&lt;/a&gt; (@vwsforlife) on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2020-02-14T18:40:07+00:00&quot;&gt;Feb 14, 2020 at 10:40am PST&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Thanks to all the fine folks who joined our ski days and came to the JUG meetups! We loved the energy and community vibe from each location. &amp;#x2764;&amp;#xFE0F;&amp;#x1F603;&lt;/p&gt;

&lt;p&gt;Ray and I had a Rocky Mountain adventure with JHipster, and you can too! From the comfort of your own home, you can install &lt;a href=&quot;https://jhipster.tech&quot;&gt;JHipster&lt;/a&gt; and choose your own adventure. Good luck, and please let us know if you have any questions. &lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/a_beautiful_adventure_to_jbcnconf</id>
        <title type="html">A Beautiful Adventure to JBCNConf, Barcelona, and Boston</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_beautiful_adventure_to_jbcnconf"/>
        <published>2019-06-29T09:33:15-06:00</published>
        <updated>2019-06-29T18:20:25-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="barcelona" scheme="http://roller.apache.org/ns/tags/" />
        <category term="abbie" scheme="http://roller.apache.org/ns/tags/" />
        <category term="boston" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="trish" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jbcnconf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jack" scheme="http://roller.apache.org/ns/tags/" />
        <category term="family" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vacation" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I love it when school&apos;s out for summer. The feeling you on the last day of school as a kid is like no other. It&apos;s a terrific feeling. The feeling of freedom. Our kids graduated from 10th and 8th grade at the end of May. We didn&apos;t give them much time to rejoice and whisked them off to Barcelona for a few days at JBCNConf and a bit of family vacation.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142493491_e668dd83d0_c.jpg&quot; title=&quot;Sunrise in Lisbon&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142493491/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142493491_e668dd83d0_m.jpg&quot; width=&quot;240&quot; alt=&quot;Sunrise in Lisbon&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142493311_3d1fdb7752_c.jpg&quot; title=&quot;Yeehaw!&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142493311/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142493311_3d1fdb7752_m.jpg&quot; width=&quot;240&quot; alt=&quot;Yeehaw!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
  Oh my, it was so much fun! First of all, there&apos;s nothing like traveling to a foreign land, bringing some of your favorite people with you, and getting to experience it with old and new friends. We arrived on Sunday and experienced a wonderful evening at a conservatory for the speaker&apos;s dinner.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142492421_c7a7298644_c.jpg&quot; title=&quot;JBCNConf Speakers Dinner View&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142492421/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142492421_c7a7298644.jpg&quot; width=&quot;500&quot; alt=&quot;JBCNConf Speakers Dinner View&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142578782_44cd1239af_c.jpg&quot; title=&quot;Speakers Dinner&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142578782/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142578782_44cd1239af.jpg&quot; width=&quot;500&quot; alt=&quot;Speakers Dinner&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I love it when school&apos;s out for summer. The feeling you have on the last day of school as a kid is like no other. It&apos;s a terrific feeling. The feeling of freedom. Our kids graduated from 10th and 8th grade at the end of May. We didn&apos;t give them much time to rejoice and whisked them off to Barcelona for a few days at JBCNConf and a bit of family vacation.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142493491_e668dd83d0_c.jpg&quot; title=&quot;Sunrise in Lisbon&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142493491/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142493491_e668dd83d0_m.jpg&quot; width=&quot;240&quot; alt=&quot;Sunrise in Lisbon&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142493311_3d1fdb7752_c.jpg&quot; title=&quot;Yeehaw!&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142493311/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142493311_3d1fdb7752_m.jpg&quot; width=&quot;240&quot; alt=&quot;Yeehaw!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
  Oh my, it was so much fun! First of all, there&apos;s nothing like traveling to a foreign land, bringing some of your favorite people with you, and getting to experience it with old and new friends. We arrived on Sunday and experienced a wonderful evening at a conservatory for the JBCNConf speaker&apos;s dinner.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142492421_c7a7298644_c.jpg&quot; title=&quot;JBCNConf Speakers Dinner View&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142492421/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142492421_c7a7298644.jpg&quot; width=&quot;500&quot; alt=&quot;JBCNConf Speakers Dinner View&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142578782_44cd1239af_c.jpg&quot; title=&quot;Speakers Dinner&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142578782/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142578782_44cd1239af.jpg&quot; width=&quot;500&quot; alt=&quot;Speakers Dinner&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Monday was Memorial Day in the US, so we took advantage of our day off and booked a trip with &lt;a href=&quot;https://spanish-trails.com/&quot;&gt;Spanish Trails&lt;/a&gt; to explore &lt;a href=&quot;https://www.earthtrekkers.com/day-trip-montserrat-barcelona-spain/&quot;&gt;Montserrat&lt;/a&gt;. Montserrat is a rocky mountain range in Catalonia, Spain. &quot;Montserrat&quot; translates to &quot;saw mountain&quot; in Catalan, owing to its jagged, sawtooth appearance.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142577087_c0a9c03576_c.jpg&quot; title=&quot;En route to Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142577087/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142577087_c0a9c03576_q.jpg&quot; width=&quot;150&quot; alt=&quot;En route to Montserrat&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142489306_6a1d9aaf43_c.jpg&quot; title=&quot;Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142489306/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142489306_6a1d9aaf43_q.jpg&quot; width=&quot;150&quot; alt=&quot;Montserrat&quot; style=&quot;border: 1px solid black; margin-left: 20px;&quot;&gt;&lt;/a&gt;

  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142488716_55ca185d18_c.jpg&quot; title=&quot;Trish and Abbie at Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142488716/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142488716_55ca185d18_q.jpg&quot; width=&quot;150&quot; alt=&quot;Trish and Abbie at Montserrat&quot; style=&quot;border: 1px solid black; margin-left: 20px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142575657_57d74ecfdb_c.jpg&quot; title=&quot;Gorgeous day at Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142575657/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142575657_57d74ecfdb.jpg&quot; width=&quot;500&quot; alt=&quot;Gorgeous day at Montserrat&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142486506_10bbc05019_c.jpg&quot; title=&quot;Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142486506/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142486506_10bbc05019.jpg&quot; width=&quot;500&quot; alt=&quot;Montserrat&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142573857_f6e033d132_c.jpg&quot; title=&quot;Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142573857/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142573857_f6e033d132_m.jpg&quot; width=&quot;180&quot; alt=&quot;Montserrat&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142573667_1a25b5ccb7_c.jpg&quot; title=&quot;Montserrat&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142573667/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142573667_1a25b5ccb7_m.jpg&quot; width=&quot;180&quot; alt=&quot;Montserrat&quot; style=&quot;border: 1px solid black; margin-left: 40px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142484081_6245cc636a_c.jpg&quot; title=&quot;Wine Tasting with Spanish Trails&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142484081/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142484081_6245cc636a.jpg&quot; width=&quot;500&quot; alt=&quot;Wine Tasting with Spanish Trails&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  On Tuesday morning, I took Abbie and Jack to &lt;a href=&quot;https://www.jbcnconf.com/2019/jbcn4kids.html&quot;&gt;JBCN4Kids&lt;/a&gt; and they learned all about game programming in Spanish. Their Spanish skills were tested, and there was an excellent keynote by &lt;a href=&quot;https://twitter.com/BrianGoetz&quot;&gt;Brian Goetz&lt;/a&gt; in the middle of it all.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142483551_abd23d6ee2_c.jpg&quot; title=&quot;JBCN Kids Day&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142483551/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142483551_abd23d6ee2.jpg&quot; width=&quot;500&quot; alt=&quot;JBCN Kids Day&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142483346_51340282e9_c.jpg&quot; title=&quot;Brian Goetz at JBCNConf&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142483346/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142483346_51340282e9.jpg&quot; width=&quot;500&quot; alt=&quot;Brian Goetz at JBCNConf&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  That afternoon, Josh Long and I planned and practiced our &lt;a href=&quot;https://www.jbcnconf.com/2019/infoTalk.html?id=5c3b3b1938da16698cf41b09&quot;&gt;Full Stack Reactive workshop&lt;/a&gt;. We had a nice lunch with my family and &lt;a href=&quot;https://twitter.com/mariogray&quot;&gt;Mario&lt;/a&gt; that day too. Josh and I delivered our workshop on Wednesday morning.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142483196_4627730f8f_c.jpg&quot; title=&quot;Josh Long and my Full Stack Reactive Workshop&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142483196/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142483196_4627730f8f.jpg&quot; width=&quot;500&quot; alt=&quot;Josh Long and my Full Stack Reactive Workshop&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;If you&amp;#39;d like to see the slides &lt;a href=&quot;https://twitter.com/starbuxman?ref_src=twsrc%5Etfw&quot;&gt;@starbuxman&lt;/a&gt; and I never used during our Full Stack Reactive Workshop at &lt;a href=&quot;https://twitter.com/jbcnconf?ref_src=twsrc%5Etfw&quot;&gt;@jbcnconf&lt;/a&gt;, we published them on &lt;a href=&quot;https://twitter.com/speakerdeck?ref_src=twsrc%5Etfw&quot;&gt;@speakerdeck&lt;/a&gt;:&lt;a href=&quot;https://t.co/LPyJvCxod6&quot;&gt;https://t.co/LPyJvCxod6&lt;/a&gt;&lt;br&gt;&lt;br&gt;Thanks to everyone who attended. We had a wonderful time! ??&lt;a href=&quot;https://twitter.com/hashtag/reactive?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#reactive&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/java?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#java&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/springwebflux?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#springwebflux&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/reactjs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#reactjs&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1133697333273792512?ref_src=twsrc%5Etfw&quot;&gt;May 29, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The legendary &lt;a href=&quot;https://twitter.com/mraible?ref_src=twsrc%5Etfw&quot;&gt;@mraible&lt;/a&gt; and I got to close down &lt;a href=&quot;https://twitter.com/jbcnconf?ref_src=twsrc%5Etfw&quot;&gt;@jbcnconf&lt;/a&gt; with a 2h workshop. Thanks to all those who joined! Couldn&#8217;t ask for a better co-presenter, audience, or way to spend the day. I love my life. &lt;a href=&quot;https://t.co/EbuqdblSsJ&quot;&gt;pic.twitter.com/EbuqdblSsJ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Josh Long (???, ???, ???? ????, ??? ????) (@starbuxman) &lt;a href=&quot;https://twitter.com/starbuxman/status/1133728950100910086?ref_src=twsrc%5Etfw&quot;&gt;May 29, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;
  Our family vacation in El Vendrell began shortly after that.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142482456_de06e85c7e_c.jpg&quot; title=&quot;Vacation time!&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142482456/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142482456_de06e85c7e.jpg&quot; width=&quot;500&quot; alt=&quot;Vacation time!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142482186_4a7498c13b_c.jpg&quot; title=&quot;Make it fun&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142482186/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142482186_4a7498c13b.jpg&quot; width=&quot;500&quot; alt=&quot;Make it fun&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
  &lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/ByFtjp3Ffpp/&quot; data-instgrm-version=&quot;12&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/ByFtjp3Ffpp/&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns&lt;img src=&quot;https://raibledesigns.com/images/smileys/love.gif&quot; class=&quot;smiley&quot; alt=&quot;:x&quot; title=&quot;:x&quot; /&gt;link=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt; View this post on Instagram&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/ByFtjp3Ffpp/&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot;&gt;@1trishphoto in her happy place &amp;#x1F495;&amp;#x1F970;&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;A post shared by &lt;a href=&quot;https://www.instagram.com/vwsforlife/&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot;&gt; Matt Raible&lt;/a&gt; (@vwsforlife) on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2019-05-30T14:00:14+00:00&quot;&gt;May 30, 2019 at 7:00am PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
We enjoyed the experience so much, Trish and I are thinking about spending even more time in Spain next year.&lt;/p&gt;
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Goodbye, Barcelona! ?? ???? &lt;br&gt;&lt;br&gt;We had a splendid adventure touring your mountains, city, and beaches. ??&lt;a href=&quot;https://twitter.com/TrishPhoto?ref_src=twsrc%5Etfw&quot;&gt;@TrishPhoto&lt;/a&gt; is intrigued by the notion of visiting again next year.&lt;a href=&quot;https://twitter.com/spring_io?ref_src=twsrc%5Etfw&quot;&gt;@spring_io&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/jbcnconf?ref_src=twsrc%5Etfw&quot;&gt;@jbcnconf&lt;/a&gt; 2020 with remote work in between? Sounds fun! ???? &lt;a href=&quot;https://t.co/340myZ1wai&quot;&gt;pic.twitter.com/340myZ1wai&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1134746622078869506?ref_src=twsrc%5Etfw&quot;&gt;June 1, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;For more photos, see our album&apos;s on Flickr: my &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157709287954566&quot;&gt;Barcelona, JBCNConf, and Boston 2019&lt;/a&gt; or Trish&apos;s &lt;a href=&quot;https://www.flickr.com/photos/mcginityphoto/albums/72157709226541221&quot;&gt;Barcelona 2019&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;On the way home, we stopped in Boston and hung out with Trish&apos;s brother&apos;s family. Our niece, Morgan, graduated high school. We are very proud of her and had a blast celebrating the event.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48142566012_1890aec9a9_c.jpg&quot; title=&quot;Congratulations Morgan!&quot; rel=&quot;lightbox[jbcnconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48142566012/in/album-72157709287954566/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48142566012_1890aec9a9.jpg&quot; width=&quot;500&quot; alt=&quot;Congratulations Morgan!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We started off summer pretty well so far. We&apos;ve been to Barcelona, Boston, and even had a weekend of whitewater rafting on Fathers Day weekend. Life is good in the Raible Hood! &amp;#x1F60A;&lt;/p&gt;

</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/gids_2019_adventures_in_india</id>
        <title type="html">GIDS 2019: Adventures in India</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/gids_2019_adventures_in_india"/>
        <published>2019-05-02T09:54:15-06:00</published>
        <updated>2019-05-03T00:40:48-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="india" scheme="http://roller.apache.org/ns/tags/" />
        <category term="kalin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bangalore" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gids19" scheme="http://roller.apache.org/ns/tags/" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bengaluru" scheme="http://roller.apache.org/ns/tags/" />
        <category term="family" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    I had the pleasure of traveling to Bangalore, India last week for the 2019 edition of the &lt;a href=&quot;https://www.developermarch.com/developersummit/&quot;&gt;Great International Developer Summit&lt;/a&gt;. GIDS is a conference that spans five days and has around 5000 developers each year. The conference charges on a per-day basis, and adds the attendees from each day to its total, so it&apos;s not &lt;em&gt;huge&lt;/em&gt;, but it&apos;s pretty big with 1000+ developers each day.
&lt;/p&gt;
&lt;p&gt;
    A week before I left Denver, I solicited the advice of my good friend, Scott Davis. I asked him about the weather, the conference, and India in general. He advised me to wear lightweight clothing, no shorts when speaking and be wary of the wi-fi at the conference. He also mentioned the burgeoning microbrewery scene in &quot;the Silicon Valley of India.&quot;
&lt;/p&gt;
&lt;p&gt;I&apos;ve always been interested in traveling to India. My sister, Kalin, went there as part of her university studies 20 years ago. She studied Buddhism for four months on that journey and even got to meet the Dalai Lama. I thought it&apos;d be fun to bring her along for my first trip to India. We rendezvoused in Seattle on the way, taking the picture below on Friday afternoon, April 19.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/47753007051_a6acb06bdb_c.jpg&quot; title=&quot;I picked up a travel buddy in Seattle. My awesome sister, Kalin, is coming with me!&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/47753007051/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/47753007051_a6acb06bdb.jpg&quot; width=&quot;500&quot; alt=&quot;I picked up a travel buddy in Seattle. My awesome sister, Kalin, is coming with me!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    I had the pleasure of traveling to Bangalore, India last week for the 2019 edition of the &lt;a href=&quot;https://www.developermarch.com/developersummit/&quot;&gt;Great International Developer Summit&lt;/a&gt;. GIDS is a conference that spans five days and has around 5000 developers each year. The conference charges on a per-day basis, and adds the attendees from each day to its total, so it&apos;s not &lt;em&gt;huge&lt;/em&gt;, but it&apos;s pretty big with 1000+ developers each day.
&lt;/p&gt;
&lt;p&gt;
    A week before I left Denver, I solicited the advice of my good friend, Scott Davis. I asked him about the weather, the conference, and India in general. He advised me to wear lightweight clothing, no shorts when speaking and be wary of the wi-fi at the conference. He also mentioned the burgeoning microbrewery scene in &quot;the Silicon Valley of India.&quot;
&lt;/p&gt;
&lt;p&gt;I&apos;ve always been interested in traveling to India. My sister, Kalin, went there as part of her university studies 20 years ago. She studied Buddhism for four months on that journey and even got to meet the Dalai Lama. I thought it&apos;d be fun to bring her along for my first trip to India. We rendezvoused in Seattle on the way, taking the picture below on Friday afternoon, April 19.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/47753007051_a6acb06bdb_c.jpg&quot; title=&quot;I picked up a travel buddy in Seattle. My awesome sister, Kalin, is coming with me!&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/47753007051/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/47753007051_a6acb06bdb.jpg&quot; width=&quot;500&quot; alt=&quot;I picked up a travel buddy in Seattle. My awesome sister, Kalin, is coming with me!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We had a long 14-hour flight from Seattle to Dubai. We flew Emirates and enjoyed the service, great seats (for economy), and wi-fi as we cruised over the North Pole. We had dinner at the Hard Rock Cafe in Dubai, then hopped on a four-hour flight to India. When we finally arrived at 3:00 am on Sunday, we were greeted with gifts in our room and a fresh slice of cake! Thanks to Dilip and Indu from &lt;a href=&quot;http://saltmarch.com/&quot;&gt;Saltmarch&lt;/a&gt; for making us feel so welcome on our arrival.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/40786465613_b684e30a84_c.jpg&quot; title=&quot;Cake waiting for us when we arrived in Bengaluru!&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/40786465613/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/40786465613_b684e30a84.jpg&quot; width=&quot;500&quot; alt=&quot;Cake waiting for us when we arrived in Bengaluru!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    We slept for a few hours after arriving, then met several of the GIDS speakers for a late breakfast. It was like a No Fluff reunion! If the names Venkat, Brian, Raju, Davis, Carducci, Stine, and Pratik sound familiar, you know what I mean. I quickly learned that Bangalore&apos;s name is actually Bengaluru, the &lt;a href=&quot;https://m.rediff.com/news/2007/aug/22bang.htm&quot;&gt;British changed it to Bangalore&lt;/a&gt; during their rule.
  &lt;/p&gt;&lt;p&gt;After breakfast, Kalin and I took a car from the hotel and visited the Bangaluru Palace, followed by a stroll in the Lalbagh Botanical Gardens.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/47752998981_ce10f34df9_c.jpg&quot; title=&quot;Bangalore Palace&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/47752998981/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/47752998981_ce10f34df9_q.jpg&quot; width=&quot;150&quot; alt=&quot;Bangalore Palace&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/47700272222_6b4303f8e4_c.jpg&quot; title=&quot;Bangalore Palace&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/47700272222/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/47700272222_6b4303f8e4_q.jpg&quot; width=&quot;150&quot; alt=&quot;Bangalore Palace&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/46836499485_5f9a2721e4_c.jpg&quot; title=&quot;Beware of Snakes at Lalbagh Botanical Gardens&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/46836499485/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/46836499485_5f9a2721e4_q.jpg&quot; width=&quot;150&quot; alt=&quot;Beware of Snakes at Lalbagh Botanical Gardens&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    That evening, we joined some wonderful friends for dinner at &lt;a href=&quot;http://www.bangalorebrewworks.com/&quot;&gt;Bangalore Brew Works&lt;/a&gt;. Bangalore Brew Works was my favorite restaurant on the trip. It was an open-air roof-top patio with cold, delicious beer, and spicy bites.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/47752978591_f5da67740c_c.jpg&quot; title=&quot;Mmmmm, local beer with old friends. #gids19 #beer&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/47752978591/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/47752978591_f5da67740c.jpg&quot; width=&quot;500&quot; alt=&quot;Mmmmm, local beer with old friends. #gids19 #beer&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    On Monday, it was time to go to work. I had four talks at GIDS; two on Monday. The conference started with &lt;a href=&quot;https://twitter.com/scottdavis99&quot;&gt;Scott Davis&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/johnwbruce&quot;&gt;John Bruce&lt;/a&gt; having a fireside chat about the web. I&apos;d just seen Sir Tim Berners Lee (John&apos;s co-founder at Inrupt) speak at &lt;a href=&quot;https://www.okta.com/oktane19/&quot;&gt;Oktane 19&lt;/a&gt;, so I was delighted to hear from them both in the same month. &lt;a href=&quot;https://solid.inrupt.com/&quot;&gt;Solid&lt;/a&gt; sounds like a very interesting concept, but I have not tried to &lt;a href=&quot;https://solid.inrupt.com/docs/getting-started&quot;&gt;build my own app with it&lt;/a&gt;, yet.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/40786446373_22ce933c80_c.jpg&quot; title=&quot;#gids19 begins with @scottdavis99 and @johnwbruce having a fireside chat about the web.&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/40786446373/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/40786446373_22ce933c80.jpg&quot; width=&quot;500&quot; alt=&quot;#gids19 begins with @scottdavis99 and @johnwbruce having a fireside chat about the web.&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    From there, it was kind of a blur. I&apos;m not the kind of speaker that talks several times at a conference; I&apos;m used to just one or two slots. I tend to do a lot of talks about Java and JavaScript. Since both have been innovating rapidly lately, I like to update my talks just before so they&apos;re up-to-date. For three days, I was updating presentations, practicing demos, and delivering talks. It was exhausting, but nothing like the other speakers. Several speakers had 10+ sessions and did a full-day workshop on Friday! &amp;#x1F633; 
&lt;/p&gt;
&lt;h3&gt;My Presentations at GIDS&lt;/h3&gt;
&lt;p&gt;
    My first talk was &quot;Front End Development for Back End Developers&quot;. I enjoy giving this talk because it doesn&apos;t have any live coding, but it packs a lot of information into 60 minutes. I &lt;a href=&quot;https://speakerdeck.com/mraible/front-end-development-for-backend-developers-gids-2019&quot;&gt;published my slides&lt;/a&gt; on Speaker Deck and I believe it was recorded.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
    &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;ef82796b30194b39989f8e02573d0f24&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;Monday afternoon, I spoke about &lt;a href=&quot;https://www.jhipster.tech&quot;&gt;JHipster&lt;/a&gt; and showed how to build a simple monolith from scratch. Since the wi-fi was spotty to non-existent, I had to do my demo with no internet connection. If you&apos;ve used JHipster in the past, you know this can be a challenge. In the end, it seemed to go well, and I got lots of laughs as I progressively donned hipster clothing attire. You can &lt;a href=&quot;https://speakerdeck.com/mraible/get-hip-with-jhipster-gids-2019&quot;&gt;find my presentation on Speaker Deck&lt;/a&gt; or view it below.&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
    &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;31c475ffae0b4fb6ac1338f67cd67957&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;
    Monday evening, we gathered with conference friends at JetLag Bar and Grill and enjoyed the rooftop ambiance with the pulsating sound of house music.
&lt;/p&gt;

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Dinner at Jetlag Bar for the jetlagged peeps &lt;a href=&quot;https://twitter.com/CGuntur?ref_src=twsrc%5Etfw&quot;&gt;@CGuntur&lt;/a&gt; &lt;a href=&quot;https://twitter.com/mraible?ref_src=twsrc%5Etfw&quot;&gt;@mraible&lt;/a&gt; Kalin &lt;a href=&quot;https://twitter.com/scottdavis99?ref_src=twsrc%5Etfw&quot;&gt;@scottdavis99&lt;/a&gt; &lt;a href=&quot;https://twitter.com/MichaelCarducci?ref_src=twsrc%5Etfw&quot;&gt;@MichaelCarducci&lt;/a&gt; Mrs. Carducci &lt;a href=&quot;https://twitter.com/BillyKorando?ref_src=twsrc%5Etfw&quot;&gt;@BillyKorando&lt;/a&gt; &lt;a href=&quot;https://twitter.com/prpatel?ref_src=twsrc%5Etfw&quot;&gt;@prpatel&lt;/a&gt; &lt;a href=&quot;https://t.co/hj6w7jEpmF&quot;&gt;pic.twitter.com/hj6w7jEpmF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Mary Grygleski (@mgrygles) &lt;a href=&quot;https://twitter.com/mgrygles/status/1120391698180390913?ref_src=twsrc%5Etfw&quot;&gt;April 22, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;
    On Tuesday afternoon, I spoke about &lt;a href=&quot;https://developer.okta.com/blog/2017/12/06/bootiful-development-with-spring-boot-and-react&quot;&gt;bootiful development with Spring Boot and React&lt;/a&gt;. A couple of hours before the talk, I went to practice my demo and realized that I hadn&apos;t updated it in quite some time. I scrambled to update my &lt;a href=&quot;https://github.com/oktadeveloper/spring-boot-react-example/blob/master/demo.adoc&quot;&gt;demo script&lt;/a&gt; for the latest versions of Spring Boot, Create React App, and Okta. After updating and practicing, I prepared my laptop to do the demo without an internet connection.
&lt;/p&gt;
&lt;p&gt;When I started my demo, I planned on the internet failing, but I figured I&apos;d show the audience first. In the midst of failure, one of the room hosts told me there was a backup wi-fi, got me on it, and away we went! You can see my &lt;a href=&quot;https://speakerdeck.com/mraible/bootiful-development-with-spring-boot-and-react-gids-2019&quot;&gt;slides on Speaker Deck&lt;/a&gt; or peruse them below.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
    &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;142344f5b03a456287fca7be642e5680&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;
    Tuesday evening we gathered with folks from Oracle, Red Hat, IBM, and BNY Mellon at the Biere Club. They served excellent craft beer, yummy appetizers, and we laughed our way into the night. We particularly enjoyed our selfie at the end of the night.
&lt;/p&gt;

&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Monday closing crew at &lt;a href=&quot;https://twitter.com/hashtag/gids19?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#gids19&lt;/a&gt;! ???? &lt;a href=&quot;https://t.co/Axp5uRYqql&quot;&gt;pic.twitter.com/Axp5uRYqql&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1120397254416846852?ref_src=twsrc%5Etfw&quot;&gt;April 22, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Explanation: when my sister and I were strolling around the botanical gardens, we noticed a strange phenomenon we hadn&apos;t seen before: there were more men taking selfies than women. We also noticed that while the women were smiling, all the men were very serious in their photos. When in Rome!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
    I had my final talk about microservices with JHipster and OAuth on Wednesday morning. I&apos;d just finished &lt;a href=&quot;https://developer.okta.com/blog/2019/04/15/testing-spring-security-oauth-with-junit&quot;&gt;upgrading JHipster to use Spring Security 5.1&lt;/a&gt; a couple of weeks prior, so I was eager to show it off. I used JHipster Registry and its Spring Cloud Config support to show how you can switch from Keycloak to Okta (or any IdP) by configuring just three Spring Security properties. Since your gateway and microservices are all configured to read from the registry on startup, you can configure your OIDC provider in a single location! You can &lt;a href=&quot;https://speakerdeck.com/mraible/microservices-for-the-masses-with-spring-boot-jhipster-and-oauth-gids-2019&quot;&gt;download my presentation&lt;/a&gt; or view it below.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
    &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;aa781ce052404101a89952df649e0131&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
    We retreated to our hotel on Wednesday afternoon, enjoyed massages gifted by Saltmarch, and I savored a cold beer at the patio bar.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/33875884248_3156e4bcc7_c.jpg&quot; title=&quot;Talks finished!&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/33875884248/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/33875884248_3156e4bcc7.jpg&quot; width=&quot;375&quot; alt=&quot;Talks finished!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    This picture above is the last picture I took with my phone. When I was at the gym on Thursday morning, the screen started flickering on and off with hints of green. The screen was borked. I was hoping to use it for photos but decided it might be nice to have a break from having a phone.&lt;/p&gt;
&lt;p&gt;Thursday afternoon, we toured the Bannerghatta National Park (aka the Bengaluru Zoo) with &lt;a href=&quot;https://twitter.com/saturnism&quot;&gt;Ray Tsang&lt;/a&gt;. It was hot, the animals were exotic, and the safari tour was fast and furious. We had a fabulous time.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/33875919318_06f27b93ca_c.jpg&quot; title=&quot;Anthill?&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/33875919318/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/33875919318_06f27b93ca_m.jpg&quot; width=&quot;179&quot; alt=&quot;Anthill?&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/46836517025_0ed8c83091_c.jpg&quot; title=&quot;Ray and I at the Bannerghatta National Park&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/46836517025/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/46836517025_0ed8c83091_m.jpg&quot; width=&quot;179&quot; alt=&quot;Ray and I at the Bannerghatta National Park&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/33875920298_839525471a_c.jpg&quot; title=&quot;Kalin with Butterfly&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/33875920298/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/33875920298_839525471a_m.jpg&quot; width=&quot;180&quot; alt=&quot;Kalin with Butterfly&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/46836519035_abc71d8a02_c.jpg&quot; title=&quot;Butterflies on my face!&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/46836519035/in/album-72157708216675255/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/46836519035_abc71d8a02_m.jpg&quot; width=&quot;179&quot; alt=&quot;Butterflies on my face!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    On Friday, Kalin and I headed to Mysuru (formerly Mysore) to see the sights. We hired a driver from our hotel for the three-hour drive. We visited a summer home of the rulers from the late 1700s, toured the Sri Chamundeshwari Temple, strolled through the Mysuru zoo, and took a quick tour around Mysore Palace. Unfortunately, I don&apos;t have any good pictures of our adventure.
&lt;/p&gt;
&lt;p&gt;
    You can find all the pictures in this post, and a few more, in &lt;a href=&quot;https://www.flickr.com/photos/mraible/sets/72157708216675255&quot;&gt;my GIDS 2019 album on Flickr&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;My first time speaking at GIDS was a lot of fun. Traveling to India with my sister was a special experience. Networking with developers, speakers, and old friends was fantastic. I told Kalin at one point, &quot;the days are hard and rewarding, but the nights are spectacular.&quot; It&apos;s true. GIDS 2019 was a fantastic adventure with wonderful people.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://live.staticflickr.com/65535/46968490364_b66ec367dc_c.jpg&quot; title=&quot;Boom Town&quot; rel=&quot;lightbox[gids19]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/46968490364/in/dateposted-public/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/46968490364_b66ec367dc.jpg&quot; width=&quot;500&quot; alt=&quot;Boom Town&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/life_as_an_open_source1</id>
        <title type="html">Life as an Open Source Developer, One Year Later</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/life_as_an_open_source1"/>
        <published>2017-11-06T08:33:17-07:00</published>
        <updated>2017-11-06T14:35:06-07:00</updated> 
        <category term="/Open Source" label="Open Source" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="opensource" scheme="http://roller.apache.org/ns/tags/" />
        <category term="github" scheme="http://roller.apache.org/ns/tags/" />
        <category term="okta" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;It&apos;s been a little over a year since I wrote about &lt;a href=&quot;//raibledesigns.com/rd/entry/life_as_an_open_source&quot;&gt;life as an open source developer&lt;/a&gt;. I&apos;m happy to say I &lt;em&gt;still&lt;/em&gt; haven&apos;t written a single line of proprietary code. Of course, things have changed a lot in the last year. I thought going full-time would bring stability to my career. Instead, six months into it &lt;a href=&quot;https://www.okta.com/blog/2017/03/stormpath-welcome-to-Okta/&quot;&gt;we joined forces with Okta&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;The transition was rough at first. At Stormpath, we had full-featured SDKs and a great relationship with developers that used our service. We were able to port many of our SDKs to work with Okta, but we discovered that Okta didn&apos;t have a great relationship with developers. In fact, their developer blog hadn&apos;t been updated in over a year when we arrived.
&lt;/p&gt;
&lt;p&gt;On the upside, Okta&apos;s API supported standards like SAML, OAuth, and OpenID Connect. Open standards made it possible to use other frameworks and not have to rely on our own. I was pumped to find that &lt;a href=&quot;https://github.com/spring-projects/spring-security&quot;&gt;Spring Security&lt;/a&gt; made it easy to integrate with &lt;a href=&quot;https://developer.okta.com/blog/2017/03/16/spring-boot-saml&quot;&gt;SAML&lt;/a&gt; and &lt;a href=&quot;https://developer.okta.com/blog/2017/03/21/spring-boot-oauth&quot;&gt;OAuth&lt;/a&gt;. In fact, I was able to leverage these standards to &lt;a href=&quot;https://developer.okta.com/blog/2017/10/20/oidc-with-jhipster&quot;&gt;add OIDC support to JHipster&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Okta&apos;s &lt;a href=&quot;https://developer.okta.com/blog/2017/09/25/all-new-developer-console&quot;&gt;new developer console&lt;/a&gt; and &lt;a href=&quot;https://developer.okta.com/pricing/&quot;&gt;open pricing&lt;/a&gt; are just a couple examples of improved happenings since we arrived. The &lt;a href=&quot;https://github.com/okta/okta-spring-boot&quot;&gt;Okta Spring Boot Starter&lt;/a&gt; and &lt;a href=&quot;https://github.com/okta/okta-oidc-js&quot;&gt;JavaScript libraries for Node.js, Angular, and React&lt;/a&gt; are also pretty awesome.
&lt;/p&gt;
&lt;p&gt;I&apos;m happy to say my contributions on GitHub almost doubled in the last year!
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://github.com/mraible&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4509/24348308388_fc2c35d111_z.jpg&quot; width=&quot;640&quot; alt=&quot;GitHub Contributions 2017&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As far as stress is concerned, that hasn&apos;t changed much. I&apos;ve learned that the stress I feel from work is still causing me to have high blood pressure. When I measure it in the mornings, or at night, it&apos;s fine. When I measure it during the day, it&apos;s elevated. I believe my high blood pressure is caused by doing too much. Sure, it&apos;s great to be productive and accomplish a lot for my company, but it&apos;s killing me.
&lt;/p&gt;
&lt;p&gt;Therein lies the rub. I get to create my job. All I&apos;m asked to do is write a blog post per week and speak at a conference (or meetup) once a month. Yet I&apos;m doing &lt;em&gt;way&lt;/em&gt; more than that. Since this time last year, I&apos;ve delivered 33 presentations, in 13 different cities. I keep a page on this blog updated with &lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;all my presentations&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;  
Next year, I still plan to speak a lot, but I plan on toning things down a bit. I&apos;ll be concentrating on US cities, with large Java user groups, and I&apos;ll be limiting my travel overseas. &lt;/p&gt;
&lt;p&gt;
  &lt;a data-href=&quot;https://www.flickr.com/photos/mraible/37491517464/&quot; rel=&quot;lightbox[ossdev1year]&quot; href=&quot;https://farm5.staticflickr.com/4547/37491517464_14d37e8eda_c.jpg&quot; title=&quot;Matt the Hipster&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4547/37491517464_14d37e8eda_q.jpg&quot; width=&quot;150&quot; class=&quot;picture&quot; alt=&quot;Matt the Hipster&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
  Outside of my health concerns, I&apos;m still loving my job. The fact that I get paid to speak at great conferences, write example applications, and discover new ways to do things is awesome. It&apos;s also pretty sweet that I was able to &lt;a href=&quot;//raibledesigns.com/rd/entry/the_jhipster_mini_book_v4&quot;&gt;update the JHipster Mini-Book&lt;/a&gt; and &lt;a href=&quot;http://www.jhipster-book.com/#!/news/entry/upgrading-21-points-health-from-v1-to-v4&quot;&gt;upgrade 21-Points Health&lt;/a&gt; during work hours. The fact that I got &lt;a href=&quot;https://www.okta.com/blog/2017/09/developer-dna-a-day-in-the-life-of-matt-raible/&quot;&gt;featured on the main Okta blog&lt;/a&gt; was pretty cool too.
&lt;/p&gt;
&lt;p&gt;The good news is my overseas travel isn&apos;t done this year. Today, I leave for &lt;a href=&quot;http://devoxx.be/&quot;&gt;Devoxx Belgium&lt;/a&gt;, one of my favorite conferences. It&apos;ll be my first time in Antwerp without Trish. However, I&apos;m speaking with friends &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/deepu105&quot;&gt;Deepu Sasidharan&lt;/a&gt;, so it&apos;s sure to be a good time. Traveling to &lt;a href=&quot;https://devoxx.ma/&quot;&gt;Devoxx Morocco&lt;/a&gt; should be fun too. I&apos;ve never been to Casablanca before.&lt;/p&gt;
&lt;p&gt;In December, you can catch me at &lt;a href=&quot;https://springoneplatform.io/speakers/matt-raible&quot;&gt;SpringOne&lt;/a&gt; and &lt;a href=&quot;https://therichwebexperience.com/conference/clearwater/2017/12/speakers/matt_raible&quot;&gt;The Rich Web Experience&lt;/a&gt;. Next year, I&apos;ll be speaking at &lt;a href=&quot;https://www.meetup.com/DenverMicroservices/events/244459192/&quot;&gt;Denver Microservices meetup&lt;/a&gt;, &lt;a href=&quot;http://ujug.org/event/matt-raible/&quot;&gt;Utah JUG&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/seajug/&quot;&gt;Seattle JUG&lt;/a&gt;, and &lt;a href=&quot;http://jazzcon.tech/&quot;&gt;JazzCon&lt;/a&gt;. I plan to do a JUG tour in the northeast US too.
&lt;/p&gt;
&lt;p&gt;You might&apos;ve noticed I don&apos;t write a lot of technical content here anymore. That&apos;s because I&apos;m doing most of my writing on &lt;a href=&quot;https://developer.okta.com/blog/&quot;&gt;developer.okta.com/blog&lt;/a&gt;. I&apos;m still writing for &lt;a href=&quot;https://www.infoq.com&quot;&gt;InfoQ&lt;/a&gt; as well. I really enjoyed attending the JavaOne keynotes and writing up what I saw.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2017/10/javaone-opening&quot;&gt;Oracle Announced Plans to Open Source All Features of Their JDK and Address Shortcomings in Java EE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2017/10/javaone-keynote&quot;&gt;JavaOne Keynote: Oracle Talks Blockchain, Bots and Serverless&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2017/10/javaone-community-keynote&quot;&gt;JavaOne Keynote: IBM on OpenJ9 and Open Liberty; Java Community in The Matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ll leave you with this, a project I&apos;m working on actively and plan to finish before Devoxx Morocco.&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Had a good hacking session today w/ &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://twitter.com/Ionicframework?ref_src=twsrc%5Etfw&quot;&gt;@Ionicframework&lt;/a&gt;. Creating a JHipster-enabled Ionic client works! &lt;a href=&quot;https://t.co/5biHQDO941&quot;&gt;https://t.co/5biHQDO941&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/926251064843583488?ref_src=twsrc%5Etfw&quot;&gt;November 3, 2017&lt;/a&gt;&lt;/blockquote&gt;
  &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Viva la Open Source!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/speaking_adventures_at_j_spring</id>
        <title type="html">Speaking Adventures at J-Spring, Devoxx UK, GeeCON, and Spring I/O</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/speaking_adventures_at_j_spring"/>
        <published>2017-05-24T09:50:55-06:00</published>
        <updated>2017-05-24T15:56:09-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="geecon" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springio17" scheme="http://roller.apache.org/ns/tags/" />
        <category term="okta" scheme="http://roller.apache.org/ns/tags/" />
        <category term="microservices" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jspring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxxuk" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;As a Developer Advocate at &lt;a href=&quot;https://okta.com&quot;&gt;Okta&lt;/a&gt;, I&apos;m expected to travel up to 25% per month
    to speak at conferences and meetups. This May was more like 50%! I had opportunities to contribute to a
    number of cool conferences in exotic cities that I was eager to accept.
&lt;/p&gt;
&lt;p&gt;
    My adventure began on Monday, May 8 when I flew to Amsterdam to speak at the
    &lt;a href=&quot;http://jspring.nl/&quot;&gt;J-Spring conference&lt;/a&gt;.
    It was the first time the &lt;a href=&quot;http://www.nljug.org/&quot;&gt;NLJUG&lt;/a&gt; hosted this conference in several years.
    I marveled at the venue and especially liked the outdoor area it offered during breaks. The walk from/to
    the train station was pretty nice too.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4272/34023195124_ceb14fe282_c.jpg&quot;
       title=&quot;J-Spring Outdoor Area&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34023195124/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4272/34023195124_ceb14fe282_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;J-Spring Outdoor Area&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4200/34735030581_65ab0797b0_c.jpg&quot;
       title=&quot;Amsterdam Bike Paths&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34735030581/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4200/34735030581_65ab0797b0_m.jpg&quot; width=&quot;240&quot; alt=&quot;Amsterdam Bike Paths&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I spoke about Microservices for
    the Masses with Spring Boot, JHipster, and JWT. Feedback I received mentioned it was a bit too fast
    and I crammed too much into the 50-minute time slot. I do tend to mention everything I know about
    topics when I speak, so I apologize for trying to cram too much in.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;As a Developer Advocate at &lt;a href=&quot;https://okta.com&quot;&gt;Okta&lt;/a&gt;, I&apos;m expected to travel up to 25% per month
    to speak at conferences and meetups. This May was more like 50%! I had opportunities to contribute to a
    number of cool conferences in exotic cities that I was eager to accept.
&lt;/p&gt;
&lt;p&gt;
    My adventure began on Monday, May 8 when I flew to Amsterdam to speak at the
    &lt;a href=&quot;http://jspring.nl/&quot;&gt;J-Spring conference&lt;/a&gt;.
    It was the first time the &lt;a href=&quot;http://www.nljug.org/&quot;&gt;NLJUG&lt;/a&gt; hosted this conference in several years.
    I marveled at the venue and especially liked the outdoor area it offered during breaks. The walk from/to
    the train station was pretty nice too.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4272/34023195124_ceb14fe282_c.jpg&quot;
       title=&quot;J-Spring Outdoor Area&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34023195124/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4272/34023195124_ceb14fe282_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;J-Spring Outdoor Area&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4200/34735030581_65ab0797b0_c.jpg&quot;
       title=&quot;Amsterdam Bike Paths&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34735030581/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4200/34735030581_65ab0797b0_m.jpg&quot; width=&quot;240&quot; alt=&quot;Amsterdam Bike Paths&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I spoke about Microservices for
    the Masses with Spring Boot, JHipster, and JWT. Feedback I received mentioned it was a bit too fast
    and I crammed too much into the 50-minute time slot. I do tend to mention everything I know about
    topics when I speak, so I apologize for trying to cram too much in.
&lt;/p&gt;
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;018d1c36fb8c468e91c93d178296f80e&quot; data-ratio=&quot;1.77469670710572&quot;
        src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
    After J-Spring, I flew to London to speak at &lt;a href=&quot;https://www.devoxx.co.uk/&quot;&gt;Devoxx UK&lt;/a&gt;. I arrived just in
    time to catch the speaker&apos;s dinner and had
    fun seeing and catching up with old friends from the conference circuit.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4226/34023199904_d8764ea9f4_c.jpg&quot;
       title=&quot;View from Room 404 in London&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34023199904/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4226/34023199904_d8764ea9f4_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;View from Room 404 in London&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4270/34735034351_9bfe4be80c_c.jpg&quot;
       title=&quot;Devoxx UK Venue&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34735034351/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4270/34735034351_9bfe4be80c_m.jpg&quot; width=&quot;240&quot; alt=&quot;Devoxx UK Venue&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    Thursday morning, I had an Angular workshop
    and did my microservices presentation in the afternoon. Friday, I had an early morning talk on Front End Development
    for Back End Developers. You can find all my presentations below.
&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td width=&quot;50%&quot;&gt;
            &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;dcd38052340b4f91b5d454d6da7bcb63&quot;
                    data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
        &lt;/td&gt;
        &lt;td width=&quot;50%&quot;&gt;
            &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;e013a60aaf2b495da36746feb28bc224&quot;
                    data-ratio=&quot;1.77469670710572&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;3ba7973631ef4603a4f4df5bd2a6b888&quot;
                    data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
    I rushed straight from my last talk on Friday to the airport to catch a flight to Boston for the weekend. In Boston,
    we celebrated Trish&apos;s brother&apos;s 50th birthday, Mother&apos;s Day, and had a blast with friends and family.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4220/34023204014_5600993dc0_c.jpg&quot;
       title=&quot;Happy Mother&apos;s Day!&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34023204014/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4220/34023204014_5600993dc0.jpg&quot; width=&quot;500&quot; alt=&quot;Happy Mother&apos;s Day!&quot;
            style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    The following Monday, I hopped on a plane to return to Europe with Krakow (for &lt;a
        href=&quot;https://geecon.org/&quot;&gt;GeeCON&lt;/a&gt;) as my destination. Three
    flights later and I arrived in time to take a nice stroll around the city, enjoying the greenery.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4275/34056217043_a76d037fd7_c.jpg&quot; title=&quot;Krakow&quot;
       rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34056217043/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4275/34056217043_a76d037fd7_q.jpg&quot; width=&quot;150&quot; alt=&quot;Krakow&quot;
            style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4201/34023205364_6bbac55966_c.jpg&quot; title=&quot;Krakow&quot;
       rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34023205364/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4201/34023205364_6bbac55966_q.jpg&quot; width=&quot;150&quot; alt=&quot;Krakow&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4202/34702783102_49973cd47f_c.jpg&quot; title=&quot;Krakow&quot;
       rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34702783102/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4202/34702783102_49973cd47f_q.jpg&quot; width=&quot;150&quot; alt=&quot;Krakow&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    At GeeCON, I spoke about how to build a progressive web app with Ionic, Angular, and Spring Boot. Half of my talk
    was live coding and I
    &lt;em&gt;almost&lt;/em&gt; got all my demos working. Deploying to Cloud Foundry and my phone was the final step, and due to
    Xcode updating, that demo failed. I wrote a
    &lt;a href=&quot;http://developer.okta.com/blog/2017/05/17/develop-a-mobile-app-with-ionic-and-spring-boot&quot;&gt;tutorial about
        Ionic&lt;/a&gt; for the Okta developer blog that has everything (and more!) that I showed in my demo.
&lt;/p&gt;
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;8cf85e4d8acc4627b29a2ee42533fa74&quot; data-ratio=&quot;1.77777777777778&quot;
        src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
    I had to head straight to the airport after finishing my talk, this time heading for &lt;a
        href=&quot;http://2017.springio.net/&quot;&gt;Spring I/O&lt;/a&gt; in Barcelona.
    Barcelona has always been on Trish&apos;s bucket list, so I easily talked her into joining me. At Spring I/O, I did a
    workshop on developing with Spring Boot and Angular, followed by my Front End Development for Back End Developers
    talk. There weren&apos;t that many talks on front-end development, so I felt privileged to be one of the few talking
    about UI development.
&lt;/p&gt;
&lt;table width=&quot;100%&quot;&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td width=&quot;50%&quot;&gt;
            &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;96b8761b8bcf430683e289c75c3cfc98&quot;
                    data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
        &lt;/td&gt;
        &lt;td width=&quot;50%&quot;&gt;
            &lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;7f4814b375cb4e3c9e3d7d4467793dfc&quot;
                    data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
    I also enjoyed &lt;a href=&quot;https://twitter.com/deepu105&quot;&gt;Deepu&apos;s&lt;/a&gt; talk on JHipster and &lt;a
        href=&quot;https://twitter.com/sebi2706&quot;&gt;Sebastien&apos;s&lt;/a&gt; talk on &lt;a href=&quot;http://www.keycloak.org/&quot;&gt;Keycloak&lt;/a&gt;.
    It was the first time I&apos;d met these great guys in person, so that was a lot of fun.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;At &lt;a href=&quot;https://twitter.com/spring_io&quot;&gt;@spring_io&lt;/a&gt;
        where &lt;a href=&quot;https://twitter.com/java_hipster&quot;&gt;@java_hipster&lt;/a&gt;&apos;s meet &lt;a href=&quot;https://t.co/I9OPErVWeF&quot;&gt;pic.twitter.com/I9OPErVWeF&lt;/a&gt;
    &lt;/p&gt;&#8212; Deepu K Sasidharan (@deepu105) &lt;a href=&quot;https://twitter.com/deepu105/status/865163186479263744&quot;&gt;May 18,
        2017&lt;/a&gt;&lt;/blockquote&gt;
    &lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
    On Friday, Trish and I hit some of the sites in Barcelona and had a wonderful time. The weather was beautiful, the
    architecture was amazing, and the experience was awesome.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4204/34056220883_3b09f9692f_c.jpg&quot;
       title=&quot;Amazing Architecture in Barcelona&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34056220883/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4204/34056220883_3b09f9692f_n.jpg&quot; width=&quot;240&quot;
            alt=&quot;Amazing Architecture in Barcelona&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4195/34826706046_ef7ecf690e_c.jpg&quot; title=&quot;Barcelona&quot;
       rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34826706046/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4195/34826706046_ef7ecf690e_n.jpg&quot; width=&quot;240&quot; alt=&quot;Barcelona&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4196/34826704476_40e475dce8_c.jpg&quot;
       title=&quot;Barcelona Fountains&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34826704476/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4196/34826704476_40e475dce8.jpg&quot; width=&quot;500&quot; alt=&quot;Barcelona Fountains&quot;
            style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4249/34056228583_138e7d92d8_c.jpg&quot; title=&quot;Happiness&quot;
       rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34056228583/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4249/34056228583_138e7d92d8_m.jpg&quot; width=&quot;240&quot; alt=&quot;Happiness&quot;
            style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4275/34023214754_b9cab3fcd1_c.jpg&quot;
       title=&quot;Sagrada Familia&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34023214754/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4275/34023214754_b9cab3fcd1_m.jpg&quot; width=&quot;240&quot; alt=&quot;Sagrada Familia&quot;
            style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://c1.staticflickr.com/5/4223/34056230883_2889fc6891_c.jpg&quot;
       title=&quot;Sagrada Familia&quot; rel=&quot;lightbox[may2017speakingtour]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/34056230883/in/album-72157682270620100/&quot;&gt;&lt;img
            src=&quot;https://c1.staticflickr.com/5/4223/34056230883_2889fc6891.jpg&quot; width=&quot;500&quot; alt=&quot;Sagrada Familia&quot;
            style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; text-align: right; margin-top: -10px; max-width: 500px; font-size: .9em&quot;&gt;
    More photos on Flickr &amp;#8594; &lt;a href=&quot;https://www.flickr.com/photos/mraible/sets/72157682270620100/&quot;&gt;European Speaking Tour - May 2017&lt;/a&gt;
&lt;/div&gt;
&lt;!--Below are some of our favorite photos from the trip.--&gt;
&lt;p&gt;
    Thanks to the organizers of each conference for allowing me to speak and for covering my travel expenses. My company
    doesn&apos;t pay for overseas conferences (yet!), but they do pay me while I&apos;m there, so that&apos;s nice. To everyone that
    attended my sessions - thank you! I really appreciate the feedback and will do my best to improve future talks. If
    you have additional feedback, feel free to
    &lt;a href=&quot;//raibledesigns.com/contact.jsp&quot;&gt;contact me&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    In the meantime, keep an eye on the &lt;a href=&quot;http://developer.okta.com&quot;&gt;Okta developer
    blog&lt;/a&gt;. I&apos;ve been writing a lot of articles lately and there&apos;s more to come in the pipeline! Here&apos;s a few that&apos;ve
    been published in the last month.
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://developer.okta.com/blog/2017/04/17/angular-authentication-with-oidc&quot;&gt;Angular Authentication with
        OpenID Connect and Okta in 20 Minutes&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://developer.okta.com/blog/2017/04/26/bootiful-development-with-spring-boot-and-angular&quot;&gt;Bootiful
        Development with Spring Boot and Angular&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://developer.okta.com/blog/2017/05/09/progressive-web-applications-with-angular-and-spring-boot&quot;&gt;Build
        Your First Progressive Web Application with Angular and Spring Boot&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://developer.okta.com/blog/2017/05/17/develop-a-mobile-app-with-ionic-and-spring-boot&quot;&gt;Tutorial:
        Develop a Mobile App With Ionic and Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/angular_and_cloud_native_pwas</id>
        <title type="html">Angular and Cloud Native PWAs at Devoxx France</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/angular_and_cloud_native_pwas"/>
        <published>2017-04-10T11:53:42-06:00</published>
        <updated>2017-05-02T02:17:23-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular" scheme="http://roller.apache.org/ns/tags/" />
        <category term="pwa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-cloud" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;&lt;a href=&quot;https://devoxx.fr&quot;&gt;Devoxx France&lt;/a&gt; is one of my favorite conferences. As you might know from my &lt;a href=&quot;//raibledesigns.com/rd/entry/a_jolly_good_time_at&quot;&gt;post about Jfokus&lt;/a&gt;, I thrive on a sense of community and the memories created by conferences. Last week in Paris, I experienced a passionate community and created several memories, with many good people and friends. &lt;/p&gt;
&lt;p&gt;I had two speaking events at the conference:
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://cfp.devoxx.fr/2017/talk/MFG-0249/The_Ultimate_Getting_Started_with_Angular_Workshop&quot;&gt;The Ultimate Getting Started with Angular Workshop&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://cfp.devoxx.fr/2017/talk/PJA-6878/Building_Cloud_Native_Progressive_Web_Apps_-_Part_2&quot;&gt;Building Cloud Native PWAs with Spring Boot, Spring Cloud, and Angular - Part Deux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the workshop, I intro&apos;d Angular, had the class &lt;a href=&quot;https://bit.ly/ng-create&quot;&gt;create an Angular application&lt;/a&gt;, then talked about testing Angular. In additional, I showed them a number of demos:
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fangular-material%2F%2FREADME.adoc#_bonus_angular_material&quot;&gt;Integrate Angular Material&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fbootstrap4%2F%2FREADME.adoc#_bonus_bootstrap&quot;&gt;Integrate Bootstrap 4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2F%2FREADME.adoc#_cloud_foundry&quot;&gt;Deploy to Cloud Foundry&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2F%2FREADME.adoc#_heroku&quot;&gt;Deploy to Heroku&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fangular-material%2F%2FREADME.adoc#_jenkins&quot;&gt;Continuous Integration with Jenkins&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fokta%2F%2FREADME.adoc#_bonus_okta&quot;&gt;Authentication with OpenID Connect and Okta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;alert alert-info&quot;&gt;
 &lt;strong&gt;NOTE:&lt;/strong&gt; Videos of my past performances about Angular can be found on YouTube:
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Jq3szz2KOOs&quot;&gt;Getting Started with Angular&lt;/a&gt; - Stormpath Webinar, January 2017&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TksyjxipM4M&quot;&gt;Testing Angular Applications&lt;/a&gt; - Jfokus, February 2017&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Videos of Josh and my Cloud Native PWAs talks have been published to YouTube. Hope you enjoy!&lt;/p&gt;
&lt;div style=&quot;max-width: 520px; margin: 0 auto&quot;&gt;
&lt;iframe width=&quot;250&quot; height=&quot;141&quot; src=&quot;https://www.youtube.com/embed/0MBsfdQiS64&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;250&quot; height=&quot;141&quot; style=&quot;margin-left: 15px&quot; src=&quot;https://www.youtube.com/embed/xo7djiUBMpU&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; </summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;https://devoxx.fr&quot;&gt;Devoxx France&lt;/a&gt; is one of my favorite conferences. As you might know from my &lt;a href=&quot;//raibledesigns.com/rd/entry/a_jolly_good_time_at&quot;&gt;post about Jfokus&lt;/a&gt;, I thrive on a sense of community and the memories created by conferences. Last week in Paris, I experienced a passionate community and created several memories, with many good people and friends. &lt;/p&gt;
&lt;p&gt;I had two speaking events at the conference:
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://cfp.devoxx.fr/2017/talk/MFG-0249/The_Ultimate_Getting_Started_with_Angular_Workshop&quot;&gt;The Ultimate Getting Started with Angular Workshop&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://cfp.devoxx.fr/2017/talk/PJA-6878/Building_Cloud_Native_Progressive_Web_Apps_-_Part_2&quot;&gt;Building Cloud Native PWAs with Spring Boot, Spring Cloud, and Angular - Part Deux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the workshop, I intro&apos;d Angular, had the class &lt;a href=&quot;https://bit.ly/ng-create&quot;&gt;create an Angular application&lt;/a&gt;, then talked about testing Angular. In additional, I showed them a number of demos:
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fangular-material%2F%2FREADME.adoc#_bonus_angular_material&quot;&gt;Integrate Angular Material&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fbootstrap4%2F%2FREADME.adoc#_bonus_bootstrap&quot;&gt;Integrate Bootstrap 4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2F%2FREADME.adoc#_cloud_foundry&quot;&gt;Deploy to Cloud Foundry&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2F%2FREADME.adoc#_heroku&quot;&gt;Deploy to Heroku&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fangular-material%2F%2FREADME.adoc#_jenkins&quot;&gt;Continuous Integration with Jenkins&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible%2Fng-demo%2Fokta%2F%2FREADME.adoc#_bonus_okta&quot;&gt;Authentication with OpenID Connect and Okta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;alert alert-info&quot;&gt;
 &lt;strong&gt;NOTE:&lt;/strong&gt; Videos of my past performances about Angular can be found on YouTube:
  &lt;ul style=&quot;margin-bottom: 5px&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Jq3szz2KOOs&quot;&gt;Getting Started with Angular&lt;/a&gt; - Stormpath Webinar, January 2017&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TksyjxipM4M&quot;&gt;Testing Angular Applications&lt;/a&gt; - Jfokus, February 2017&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Unfortunately, we ran out of time before folks could complete the &lt;a href=&quot;https://bit.ly/ng-test&quot;&gt;testing Angular&lt;/a&gt; exercise, but it was a fun session nevertheless. I hope the students enjoyed it as much as I did!&lt;/p&gt;

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I had a great time teaching these fun folks at my &lt;a href=&quot;https://twitter.com/angular&quot;&gt;@angular&lt;/a&gt; workshop today!&lt;br&gt;&lt;br&gt;Slides: &lt;a href=&quot;https://t.co/pxqawNAaF2&quot;&gt;https://t.co/pxqawNAaF2&lt;/a&gt;&lt;a href=&quot;https://twitter.com/hashtag/DevoxxFR?src=hash&quot;&gt;#DevoxxFR&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/speakerselfie?src=hash&quot;&gt;#speakerselfie&lt;/a&gt; &lt;a href=&quot;https://t.co/6zeWGtnq0a&quot;&gt;pic.twitter.com/6zeWGtnq0a&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/849636357018439682&quot;&gt;April 5, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Speaking about Cloud Native PWAs was a fantastic experience, mostly because of my good friend &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt;. For those of you that have watched a @starbuxman talk, you know it&apos;s a great experience. Josh&apos;s well-timed jokes and stage presence is a source of envy for me. Sharing the stage with him was truly an honor.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;We&amp;#39;re about to kick off the part deux of our Cloud Native Apps series with &lt;a href=&quot;https://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt; &lt;a href=&quot;https://twitter.com/DevoxxFR&quot;&gt;@DevoxxFR&lt;/a&gt; &lt;a href=&quot;https://t.co/0GCSAiUgs4&quot;&gt;pic.twitter.com/0GCSAiUgs4&lt;/a&gt;&lt;/p&gt;&amp;mdash; Josh Long (???, ???) (@starbuxman) &lt;a href=&quot;https://twitter.com/starbuxman/status/850002466783584257&quot;&gt;April 6, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;We had a fine time creating a resilient beer craft service that was consumable by an Angular UI that works offline. The fancy name for this type of UI is a &lt;b&gt;progressive web app&lt;/b&gt;, but I like to call it an &lt;em&gt;installable&lt;/em&gt; webapp. It&apos;s a cool concept that leverages services workers to allow webapps to work offline. Besides service workers, all you need is TLS (HTTPS) and a bunch of icons (referenced in a linked manifest) to give an app installability. Unfortunately, &lt;a href=&quot;http://caniuse.com/#feat=serviceworkers&quot;&gt;service workers&lt;/a&gt; are not present in all browsers, so this works best for Firefox/Chrome users.
&lt;/p&gt;
&lt;p&gt;You can find the code we developed (from scratch!) in our talks &lt;a href=&quot;https://github.com/mraible/cloud-native-pwas&quot;&gt;on GitHub&lt;/a&gt;. The slide deck we used can be found &lt;a href=&quot;https://speakerdeck.com/mraible/building-cloud-native-progressive-web-apps-with-angular-and-spring-boot-devoxx-france-2017&quot;&gt;on Speaker Deck&lt;/a&gt;.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;e83e8f5e22524ae6a0fea09c4a258510&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Thanks to the organizers of Devoxx France for creating such a wonderful conference experience! I sure had a great time.

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Thanks to &lt;a href=&quot;https://twitter.com/DevoxxFR&quot;&gt;@DevoxxFR&lt;/a&gt; and friends for a fantastic experience this week! Lots of fun memories created. ?? &lt;a href=&quot;https://twitter.com/hashtag/DevoxxFR?src=hash&quot;&gt;#DevoxxFR&lt;/a&gt; ?? &lt;a href=&quot;https://t.co/kCNZGVJyTB&quot;&gt;pic.twitter.com/kCNZGVJyTB&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/850293357037408256&quot;&gt;April 7, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Videos of Josh and my Cloud Native PWAs talks have been published to YouTube. Hope you enjoy!&lt;/p&gt;
&lt;div style=&quot;max-width: 520px; margin: 0 auto&quot;&gt;
&lt;iframe width=&quot;250&quot; height=&quot;141&quot; src=&quot;https://www.youtube.com/embed/0MBsfdQiS64&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;250&quot; height=&quot;141&quot; style=&quot;margin-left: 15px&quot; src=&quot;https://www.youtube.com/embed/xo7djiUBMpU&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/life_as_an_open_source</id>
        <title type="html">Life as an Open Source Developer</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/life_as_an_open_source"/>
        <published>2016-11-03T16:29:01-06:00</published>
        <updated>2016-11-03T22:30:05-06:00</updated> 
        <category term="/Open Source" label="Open Source" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="opensource" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stormpath" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="github" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
It&apos;s been a little over a month since I started my &lt;a href=&quot;https://raibledesigns.com/rd/entry/life_update_a_summer_to&quot;&gt;
new gig at Stormpath&lt;/a&gt;. I gotta say, life is great as an open source developer! Yes, I did start working for them as a consultant in April, so it&apos;s not a huge change for me.
However, I only recently realized I haven&apos;t written a &lt;em&gt;single line&lt;/em&gt; of proprietary code the entire time.
My &lt;a href=&quot;https://github.com/mraible&quot;&gt;GitHub contributions&lt;/a&gt; look pretty good this year. They&apos;re nothing like &lt;a href=&quot;https://github.com/mojavelinux&quot;&gt;@mojavelinux&lt;/a&gt;, 
or &lt;a href=&quot;https://github.com/dsyer&quot;&gt;@dsyer&lt;/a&gt;, but I&apos;ll get there. &lt;img src=&quot;//raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot;&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://github.com/mraible&quot; title=&quot;GitHub Profile - November 3, 2016&quot;&gt;
    &lt;img src=&quot;https://c7.staticflickr.com/6/5703/30128917414_8e7c7a8e57_z.jpg&quot; width=&quot;640&quot; alt=&quot;GitHub Profile - November 3, 2016&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It&apos;s also been a bit more stress than I&apos;m used to. I think this comes from a couple things: 1) turning my hobby into my job and 2)
    I&apos;ve set a lot of high expectations for myself. As a developer evangelist, I get to create my own job. That means I can
    speak at the conferences I want to, write the code I want to, create the blog posts I want to, and everything else in between.
&lt;/p&gt;
&lt;p&gt;At the end of September, I finished &lt;a href=&quot;http://www.jhipster-book.com/#!/news/entry/book-updated-for-jhipster-3-and-jhipster-gets-dirty&quot;&gt;updating the 
JHipster Mini-Book for JHipster 3.x&lt;/a&gt;. It&apos;s gone through tech editing and it&apos;s being copy-edited right now. I hope to release it within a week. 
&lt;/p&gt;
&lt;p&gt;In early October, I said I&apos;d commit to writing one blog post per week, develop a JHipster module for Stormpath, and help get their 
    Angular 2 support good enough for an alpha release. I&apos;m happy to report I&apos;ve been able to accomplish most of these and I hope to show off
    our Angular 2 support soon.&lt;/p&gt;
&lt;p&gt;
I then channeled my efforts into integrating Stormpath&apos;s Java SDK with their AngularJS directives. You can read about how I did that in
&lt;a href=&quot;https://stormpath.com/blog/angularjs-spring-boot-tutorial&quot;&gt;Get Started with AngularJS, Spring Boot, and Stormpath&lt;/a&gt;.
Unlike &lt;a href=&quot;https://raibledesigns.com/rd/entry/getting_started_with_angularjs&quot;&gt;my previous AngularJS tutorial&lt;/a&gt;, this one connects to a 
backend and shows how to communicate with Spring Boot cross-domain.
&lt;/p&gt;
&lt;p&gt;If you like to read code more than words, you can look at the &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example&quot;&gt;example project&apos;s commits
on GitHub&lt;/a&gt;.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an AngularJS UI: &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example/commit/652ee29d9a002f5d437d356481809fe74114fe7e&quot;&gt;search&lt;/a&gt; and &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example/commit/9a06e9071d5db9710c3a8555c0dfe81c752f2242&quot;&gt;edit&lt;/a&gt; features&lt;/li&gt;
&lt;li&gt;Create a Spring Boot app with Stormpath: &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example/commit/740ed84ccb16c94bfb6451c453c325b7f86fa870&quot;&gt;app from start.stormpath.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Develop an API to CRUD people with Spring Data REST: &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example/commit/f223f26dba108e864cec271b32b856423bc12d74&quot;&gt;/api/people&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Integrate AngularJS and Spring Boot apps: &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example/commit/88f43da9fc14bb59e6d1b7f36f658730029b4bd7&quot;&gt;cross-domain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Integrate Stormpath into AngularJS for login, registration and forgot password: &lt;a href=&quot;https://github.com/stormpath/angularjs-spring-boot-stormpath-example/commit/2eee2b677237f793bf4ff25b6705d9c72efc984d&quot;&gt;Stormpath Angular SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Last week, I released a &lt;a href=&quot;https://jhipster.github.io/modules/marketplace/#/details/generator-jhipster-stormpath&quot;&gt;JHipster module
 that integrates Stormpath&lt;/a&gt;. This exercise was good because I was able to identify some gaps in Stormpath&apos;s SDKs &lt;em&gt;and&lt;/em&gt; fix them.
Getting something to work made me feel good; having the ability to improve the developer experience
was even better! Of course, &lt;a href=&quot;https://stormpath.com/blog/stormpath-jhipster-application&quot;&gt;I blogged about what I learned&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
This week, I edited and code reviewed some posts from Karl Penzhorn on &lt;a href=&quot;https://stormpath.com/blog/crud-application-react-spring-boot-user-authentication&quot;&gt;
React with Spring Boot&lt;/a&gt; and using &lt;a href=&quot;https://stormpath.com/blog/optimize-react-webpack&quot;&gt;webpack with React&lt;/a&gt;. I also got to &lt;a href=&quot;https://github.com/mattlewis92/generator-angular-library/issues/14&quot;&gt;
bang my head against the wall&lt;/a&gt; writing Angular 2 tests. If you&apos;re writing a module for Angular 2, &lt;a href=&quot;https://www.npmjs.com/package/generator-angular2-module&quot;&gt;
generator-angular2-module&lt;/a&gt; provides a nice starting point.&lt;/p&gt;
&lt;p&gt;Last, but certainly not least, I&apos;ll be speaking at a few events about Microservices, JHipster, Angular 2 and Stormpath in the near feature. &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://nofluffjuststuff.com/conference/denver/2016/11/session?id=38028&quot;&gt;Rocky Mountain Software Symposium&lt;/a&gt;, November 19&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://therichwebexperience.com/conference/clearwater/2016/12/speakers/matt_raible&quot;&gt;The Rich Web Experience&lt;/a&gt;, December 9&lt;/li&gt;
    &lt;li&gt;A joint talk at &lt;a href=&quot;http://www.meetup.com/DenverJavaUsersGroup/events/231602438/&quot;&gt;Denver JUG&lt;/a&gt; with the infamous &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt;, December 14&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any questions about developer evangelism, the technologies I mentioned in this post, or Stormpath, please let me know. Otherwise, I hope to see you on the road soon!
    &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/moving_appfuse_into_the_attic</id>
        <title type="html">Moving AppFuse into the Attic</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/moving_appfuse_into_the_attic"/>
        <published>2016-04-28T15:40:16-06:00</published>
        <updated>2016-04-29T13:12:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="opensource" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="attic" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;&lt;img src=&quot;http://static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0; margin-top: -25px&quot;&gt;
In mid-February, I decided to stop working on &lt;a href=&quot;https://github.com/appfuse/appfuse&quot;&gt;AppFuse&lt;/a&gt;. My reason was simple: I was no longer getting any value from my contributions to the project. I sent &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/New-version-of-AppFuse-td4657900.html&quot;&gt;a message&lt;/a&gt; to the developers mailing list the next day:&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot; style=&quot;margin-left: 20px&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;Hello everyone, &lt;/p&gt;
&lt;p&gt;
Last night, I started working on AppFuse 4.0, with the following features from the roadmap: &lt;/p&gt;
&lt;ul&gt;
       &lt;li&gt;Remove XML wherever possible&lt;/li&gt;
       &lt;li&gt;Java 8&lt;/li&gt;
       &lt;li&gt;Spring Boot&lt;/li&gt;
       &lt;li&gt;Spring Data&lt;/li&gt;
       &lt;li&gt;JSR 303 (might require removing or developing client-side support)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
As I started removing XML and integrating Spring Boot and Spring Data, it quickly became apparent that it&#8217;d be a lot of work to make all of these changes. My guess is it&#8217;d take over 100 hours of my time to do everything. This is time I&#8217;d be taking away from my family and personal time. 
&lt;/p&gt;
&lt;p&gt;
At the end of last year, I wanted to make AppFuse 4.0 happen because I thought it&#8217;d help me stay up-to-date with Java technologies and learn some things along the way. As I dug into the codebase last night, I realized it&#8217;d be more of a headache than a learning experience. It seems there would be little reward for all the work. 
&lt;/p&gt;
&lt;p&gt;
Because there&#8217;s little-to-no activity on the mailing list these days, it seems like it&#8217;s the right time to shutdown the project and dedicate my free time to other open source endeavors. As you might know, I&#8217;m a big fan of JHipster (&lt;a href=&quot;http://jhipster.github.io/&quot;&gt;http://jhipster.github.io/&lt;/a&gt;). It combines AngularJS and Spring Boot and has all the features that AppFuse has - but with a more modern technology stack. 
&lt;/p&gt;
&lt;p&gt;
If we had everything hosted on GitHub, I think it&#8217;d make sense to add a line to the README that says &#8220;This project is no longer maintained&#8221;. However, since there&#8217;s a lot hosted on appfuse.org (with Confluence), it might not be that easy. Maybe it&#8217;s possible to export everything from Confluence to static HTML pages and host them somewhere with the same URLs so there&#8217;s not a bunch of 404s from shutting down the project. 
&lt;/p&gt;
&lt;p&gt;
Thank you for your contributions over the years. AppFuse was pretty cool back in the day, but now there&#8217;s better solutions. 
&lt;/p&gt;
&lt;p&gt;
Cheers, 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
Matt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
The good news is I&apos;ve worked out a deal with &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt; to keep appfuse.org up and running for the next year. The &lt;a href=&quot;http://demo.appfuse.org&quot;&gt;demos&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org&quot;&gt;documentation&lt;/a&gt; and &lt;a href=&quot;http://issues.appfuse.org&quot;&gt;bug tracker&lt;/a&gt; will be available until April 30, 2017. Bamboo and FishEye will be discontinued in the next week since they&apos;re too memory intensive for a smaller server. I&apos;d love to figure out a way to export all the documentation from Confluence to Asciidoctor so everything can be on GitHub for years to come. However, there&apos;s something to be said for just letting a project fade away rather than holding onto nostalgic artifacts.&lt;/p&gt;
&lt;p&gt;On a related note, &lt;a href=&quot;https://community.oracle.com/community/java/javanet-forge-sunset&quot;&gt;Java.net will be closing in a year from today&lt;/a&gt;. AppFuse started &lt;a href=&quot;https://sourceforge.net/projects/struts/files/appfuse/&quot;&gt;on SourceForge&lt;/a&gt;, but moved to &lt;a href=&quot;http://appfuse.java.net&quot;&gt;appfuse.java.net&lt;/a&gt; shortly after. Today, the only thing left on java.net are AppFuse&apos;s mailing lists. I suppose it makes sense that both projects will cease to exist around the same time. &lt;/p&gt;
&lt;p&gt;AppFuse&apos;s &lt;a href=&quot;https://github.com/appfuse&quot;&gt;source code will remain on GitHub&lt;/a&gt;. I have no plans to delete it.&lt;/p&gt;
&lt;p&gt;Thanks to everyone that used and contributed to AppFuse over the years. It was a pretty wild and crazy ride from 2003-2007! &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/devoxx_france_2016_springtime_in</id>
        <title type="html">Devoxx France 2016: Springtime in Paris</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/devoxx_france_2016_springtime_in"/>
        <published>2016-04-26T07:13:18-06:00</published>
        <updated>2016-04-26T13:13:18-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxxfr" scheme="http://roller.apache.org/ns/tags/" />
        <category term="paris" scheme="http://roller.apache.org/ns/tags/" />
        <category term="asciidoctor" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="france" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I had the good fortune to visit Paris last week for &lt;a href=&quot;http://www.devoxx.fr/&quot;&gt;Devoxx France&lt;/a&gt;. When traveling
    to conferences in exotic locations,
    I like to bring a travel partner. This time, I asked my daughter, Abbie, to join me. She gladly accepted. Springtime
    in Paris can be a beautiful event. The grass is green, the flowers are blooming and the sun&apos;s rays blanket the city.
&lt;/p&gt;
&lt;p&gt;We arrived in Paris on Tuesday, April 19 and quickly found our way to our &lt;a href=&quot;http://www.lemeridienetoile.com/&quot;&gt;hotel&lt;/a&gt;.
    Its location was ideal: across the street from Le Palais des Congr&#232;s de Paris convention center and mall. Since the
    conference
    was at the convention center, it made logistics for my talks very convenient. We grabbed a quick bite after settling
    in,
    then took a 15-minute stroll to the Arc de Triomphe.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1650/26377054130_d1d6561024_c.jpg&quot; title=&quot;Obligatory Arc de Triomphe selfie&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26377054130/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1650/26377054130_d1d6561024_m.jpg&quot; width=&quot;240&quot;
        alt=&quot;Obligatory Arc de Triomphe selfie&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1548/26377063160_2cc22299cf_c.jpg&quot; title=&quot;Abbie and Eiffel Tower&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26377063160/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1548/26377063160_2cc22299cf_m.jpg&quot; width=&quot;240&quot; alt=&quot;Abbie and Eiffel Tower&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    That evening, we joined Ippon developers and friends at a
    &lt;a href=&quot;http://blog.ippon.fr/2016/04/07/le-before-du-devoxx-avec-matt-raible/&quot;&gt;special event for Java Hipsters&lt;/a&gt;.
    Their
    &lt;a href=&quot;http://rooftop-work.paris/&quot;&gt;rooftop location&lt;/a&gt; had great views, cold &quot;Java&quot; beer and I met a lot of
    enthusiastic
    developers. I especially enjoyed talking with the original Java Hipster and founder of
    &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt;, &lt;a href=&quot;http://www.julien-dubois.com/&quot;&gt;Julien Dubois&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1697/26046785153_7fdd931724_c.jpg&quot; title=&quot;Java Beer!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046785153/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1697/26046785153_7fdd931724_q.jpg&quot; width=&quot;150&quot; alt=&quot;Java Beer!&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1718/26046789653_ac527f73ec_c.jpg&quot;
       title=&quot;The original Java Hipster, Julien Dubious&quot; rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046789653/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1718/26046789653_ac527f73ec_q.jpg&quot; width=&quot;150&quot;
        alt=&quot;The original Java Hipster, Julien Dubious&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1588/26046794363_3a057b8e6e_c.jpg&quot; title=&quot;Fun event!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046794363/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1588/26046794363_3a057b8e6e_q.jpg&quot; width=&quot;150&quot; alt=&quot;Fun event!&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The sunset over Paris provided a splendid backdrop for the festivities.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1591/26046797633_60beba62be_c.jpg&quot; title=&quot;Sunset over Paris&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046797633/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1591/26046797633_60beba62be.jpg&quot; width=&quot;500&quot; alt=&quot;Sunset over Paris&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I had the good fortune to visit Paris last week for &lt;a href=&quot;http://www.devoxx.fr/&quot;&gt;Devoxx France&lt;/a&gt;. When traveling
    to conferences in exotic locations,
    I like to bring a travel partner. This time, I asked my daughter, Abbie, to join me. She gladly accepted. Springtime
    in Paris can be a beautiful event. The grass is green, the flowers are blooming and the sun&apos;s rays blanket the city.
&lt;/p&gt;
&lt;p&gt;We arrived in Paris on Tuesday, April 19 and quickly found our way to our &lt;a href=&quot;http://www.lemeridienetoile.com/&quot;&gt;hotel&lt;/a&gt;.
    Its location was ideal: across the street from Le Palais des Congr&#232;s de Paris convention center and mall. Since the
    conference
    was at the convention center, it made logistics for my talks very convenient. We grabbed a quick bite after settling
    in,
    then took a 15-minute stroll to the Arc de Triomphe.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1650/26377054130_d1d6561024_c.jpg&quot; title=&quot;Obligatory Arc de Triomphe selfie&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26377054130/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1650/26377054130_d1d6561024_m.jpg&quot; width=&quot;240&quot;
        alt=&quot;Obligatory Arc de Triomphe selfie&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1548/26377063160_2cc22299cf_c.jpg&quot; title=&quot;Abbie and Eiffel Tower&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26377063160/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1548/26377063160_2cc22299cf_m.jpg&quot; width=&quot;240&quot; alt=&quot;Abbie and Eiffel Tower&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1634/26046780663_83b2de9696_c.jpg&quot; title=&quot;The Arc is massive!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046780663/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1634/26046780663_83b2de9696.jpg&quot; width=&quot;500&quot; alt=&quot;The Arc is massive!&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    That evening, we joined Ippon developers and friends at a
    &lt;a href=&quot;http://blog.ippon.fr/2016/04/07/le-before-du-devoxx-avec-matt-raible/&quot;&gt;special event for Java Hipsters&lt;/a&gt;.
    Their
    &lt;a href=&quot;http://rooftop-work.paris/&quot;&gt;rooftop location&lt;/a&gt; had great views, cold &quot;Java&quot; beer and I met a lot of
    enthusiastic
    developers. I especially enjoyed talking with the original Java Hipster and founder of
    &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt;, &lt;a href=&quot;http://www.julien-dubois.com/&quot;&gt;Julien Dubois&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1697/26046785153_7fdd931724_c.jpg&quot; title=&quot;Java Beer!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046785153/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1697/26046785153_7fdd931724_q.jpg&quot; width=&quot;150&quot; alt=&quot;Java Beer!&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1718/26046789653_ac527f73ec_c.jpg&quot;
       title=&quot;The original Java Hipster, Julien Dubious&quot; rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046789653/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1718/26046789653_ac527f73ec_q.jpg&quot; width=&quot;150&quot;
        alt=&quot;The original Java Hipster, Julien Dubious&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1588/26046794363_3a057b8e6e_c.jpg&quot; title=&quot;Fun event!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046794363/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1588/26046794363_3a057b8e6e_q.jpg&quot; width=&quot;150&quot; alt=&quot;Fun event!&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The sunset over Paris provided a splendid backdrop for the festivities.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1591/26046797633_60beba62be_c.jpg&quot; title=&quot;Sunset over Paris&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046797633/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1591/26046797633_60beba62be.jpg&quot; width=&quot;500&quot; alt=&quot;Sunset over Paris&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;On Wednesday, Abbie and I got up early and headed to Versailles. We toured Ch&#226;teau de Versailles, the Gardens and
    &lt;a href=&quot;http://en.chateauversailles.fr/marie-antoinettes-estate&quot;&gt;Marie-Antoinette&apos;s estate&lt;/a&gt;. I&apos;d never visited
    this
    area of Versailles and never realized what I was missing. We rented a boat and practiced rowing on the Grand Canal
    to get
    ready for rafting season.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1592/26046801963_95dafdd5b7_c.jpg&quot; title=&quot;Abbie and Louis&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26046801963/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1592/26046801963_95dafdd5b7_n.jpg&quot; width=&quot;240&quot; alt=&quot;Abbie and Louis&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1717/26584955241_4b69591dea_c.jpg&quot; title=&quot;Lots of gold at Versailles!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26584955241/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1717/26584955241_4b69591dea_n.jpg&quot; width=&quot;240&quot;
        alt=&quot;Lots of gold at Versailles!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1583/26584961021_29d12506dd_c.jpg&quot; title=&quot;The Gardens&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26584961021/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1583/26584961021_29d12506dd.jpg&quot; width=&quot;500&quot; alt=&quot;The Gardens&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1490/26044647774_97f6749313_c.jpg&quot; title=&quot;Spring in Paris is beautiful!&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26044647774/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1490/26044647774_97f6749313.jpg&quot; width=&quot;500&quot;
        alt=&quot;Spring in Paris is beautiful!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1531/26377129570_b72406b68e_c.jpg&quot; title=&quot;Hameau de la Reine&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26377129570/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1531/26377129570_b72406b68e_q.jpg&quot; width=&quot;150&quot; alt=&quot;Hameau de la Reine&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1441/26377132120_90c70026c8_c.jpg&quot;
       title=&quot;The Queen&apos;s house and billiard room&quot; rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26377132120/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1441/26377132120_90c70026c8_q.jpg&quot; width=&quot;150&quot;
        alt=&quot;The Queen&apos;s house and billiard room&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1644/26624011386_06b02e4cee_c.jpg&quot; title=&quot;The Apollo Fountain&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26624011386/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1644/26624011386_06b02e4cee_q.jpg&quot; width=&quot;150&quot; alt=&quot;The Apollo Fountain&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    That evening, we stopped by the &lt;a href=&quot;http://uk.le-sud-restaurant.com/&quot;&gt;Restaurant Le Sud&lt;/a&gt; for the speaker&apos;s
    dinner. It was
    fun seeing familiar faces and meeting new folks.
&lt;/p&gt;
&lt;p&gt;Thursday was my first talk, but we had the morning free to explore. We headed for the Eiffel Tower and rode its north
    elevator
    straight to the top. The views where spectacular and Abbie got goosebumps from the gentle sway.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1445/26650599775_547452b330_c.jpg&quot; title=&quot;Great view from the top&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26650599775/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1445/26650599775_547452b330_m.jpg&quot; width=&quot;240&quot; alt=&quot;Great view from the top&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1588/26650603845_9df85f8e47_c.jpg&quot; title=&quot;It&apos;s a long way down&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26650603845/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1588/26650603845_9df85f8e47_m.jpg&quot; width=&quot;240&quot; alt=&quot;It&apos;s a long way down&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1441/26650605665_a3a0a2e5a9_c.jpg&quot; title=&quot;Happiness in Paris&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26650605665/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1441/26650605665_a3a0a2e5a9_m.jpg&quot; width=&quot;240&quot; alt=&quot;Happiness in Paris&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1710/26624042686_d3004caf1d_c.jpg&quot; title=&quot;Tour Eiffel&quot;
       rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26624042686/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1710/26624042686_d3004caf1d_m.jpg&quot; width=&quot;240&quot; alt=&quot;Tour Eiffel&quot;
        style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I transformed from an old-fashioned, whiskey-drinking Java developer to a Java Hipster
    &lt;a href=&quot;https://cfp.devoxx.fr/2016/talk/OJD-3590/Get_Hip_with_JHipster:_Spring_Boot_+_AngularJS_+_Bootstrap&quot;&gt;a few
        hours later&lt;/a&gt;. You can see
    the slides from my &quot;Get Hip with JHipster&quot; presentation below, or &lt;a
    href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster-spring-boot-angularjs-bootstrap-devoxx-france-2016&quot;&gt;on
    SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/DICuqemFX1Sjx7&quot; width=&quot;595&quot; height=&quot;373&quot; frameborder=&quot;0&quot;
        marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;
        style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;We wanted to see the &lt;a href=&quot;https://en.wikipedia.org/wiki/Catacombs_of_Paris&quot;&gt;Catacombs of Paris&lt;/a&gt; that night,
    and made it just minutes before it closed. Seeing the remains of millions of people&apos;s bones stacked on top of each other
    frightened Abbie more than standing on the glass floor in the Eiffel Tower. I experienced more heebie jeebies from
    the floor.
    We popped out of the Catacombs near the excellent
    &lt;a href=&quot;https://www.tripadvisor.com/Restaurant_Review-g187147-d5562763-Reviews-Thai_paragon-Paris_Ile_de_France.html&quot;&gt;Thai
        Paragon&lt;/a&gt; and stopped for a delicious meal.
    Abbie tried duck for the first time and loved it.
&lt;/p&gt;
&lt;p&gt;
    I had two talks on Friday, a quickie on &lt;a
    href=&quot;https://cfp.devoxx.fr/2016/talk/PGF-2414/Writing_an_InfoQ_Mini_Book_with_Asciidoctor&quot;&gt;how to write an InfoQ
    Mini-Book with Asciidoctor&lt;/a&gt;
    and a 45-minute session on &lt;a href=&quot;https://cfp.devoxx.fr/2016/talk/LUI-4351/The_Art_of_Angular_in_2016&quot;&gt;The Art of
    Angular in 2016&lt;/a&gt;.
    I wrote the InfoQ Mini-Book presentation using &lt;a href=&quot;https://github.com/opendevise/bespoke-emulating-shower&quot;&gt;Asciidoctor&apos;s
    Bespoke support&lt;/a&gt; and really enjoyed
    the experience. Thanks to &lt;a href=&quot;https://twitter.com/mojavelinux&quot;&gt;Dan Allen&lt;/a&gt; for assembling this easy to use
    starter template!
    Dan was also a great help in getting the JHipster Book printed for the first time and I was pumped to have a copy
    with me to show off.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1485/26046771893_34ea82fccc_c.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26046771893/in/album-72157667022214770/&quot; title=&quot;JHipster Book in print!&quot; rel=&quot;lightbox[devoxxfr2016]&quot;&gt;
        &lt;img src=&quot;https://farm2.staticflickr.com/1485/26046771893_34ea82fccc_n.jpg&quot; width=&quot;240&quot; alt=&quot;JHipster Book in print!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1584/26046773243_b3c3a8f4b2_c.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26046773243/in/album-72157667022214770/&quot; title=&quot;heroku deploy:jar&quot; rel=&quot;lightbox[devoxxfr2016]&quot;&gt;
        &lt;img src=&quot;https://farm2.staticflickr.com/1584/26046773243_b3c3a8f4b2_n.jpg&quot; width=&quot;240&quot; alt=&quot;heroku deploy:jar&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    You can &lt;a href=&quot;http://mraible.github.io/infoq-mini-book-presentation/&quot;&gt;view the presentation online&lt;/a&gt; and
    checkout
    &lt;a href=&quot;https://github.com/mraible/infoq-mini-book-presentation&quot;&gt;its repository on GitHub&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;For my Angular presentation, I invited Abbie to kick things off, so she could experience what it&apos;s like to speak at a
    conference.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1619/26044723184_ee99bd81d9_c.jpg&quot;
       title=&quot;Moments before Abbie and I spoke about the Art of #Angular in 2016.&quot; rel=&quot;lightbox[devoxxfr2016]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/26044723184/in/album-72157667022214770/&quot;&gt;&lt;img
        src=&quot;https://farm2.staticflickr.com/1619/26044723184_ee99bd81d9.jpg&quot; width=&quot;500&quot;
        alt=&quot;Moments before Abbie and I spoke about the Art of #Angular in 2016.&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;She did great and I followed her intro with my presentation on working with Angular 2. You can see my presentation
    below or &lt;a href=&quot;http://www.slideshare.net/mraible/the-art-of-angular-in-2016-devoxx-france-2016&quot;&gt;check it out on
        SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/f4qsdZ0gkbnbKN&quot; width=&quot;595&quot; height=&quot;373&quot; frameborder=&quot;0&quot;
        marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;
        style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;
    At the end of the conference, we attended the &lt;a href=&quot;https://lescastcodeurs.com/&quot;&gt;Les Cast Codeurs Podcast&lt;/a&gt;. It
    was all in French, but you
    could tell everyone was having a good time from the smiles and laughter in the audience. During the session, the
    Devoxx Crew surprised me
    with a &lt;a href=&quot;https://java-champions.java.net/&quot;&gt;Java Champion&lt;/a&gt; award. I was very &lt;a href=&quot;https://twitter.com/mraible/status/723565855821443072&quot;&gt;surprised and humbled to
    receive this recognition&lt;/a&gt;. It
    was pretty cool having Abbie with me for such an honor.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1495/26044726404_91272a2bae_c.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26044726404/in/album-72157667022214770/&quot; title=&quot;Les Cast Codeurs&quot; rel=&quot;lightbox[devoxxfr2016]&quot;&gt;
        &lt;img src=&quot;https://farm2.staticflickr.com/1495/26044726404_91272a2bae_m.jpg&quot; width=&quot;240&quot; alt=&quot;Les Cast Codeurs&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm2.staticflickr.com/1465/26044729304_080e658df0_c.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26044729304/in/album-72157667022214770/&quot; title=&quot;I&amp;#x27;m a Java Champion! :)&quot; rel=&quot;lightbox[devoxxfr2016]&quot;&gt;
        &lt;img src=&quot;https://farm2.staticflickr.com/1465/26044729304_080e658df0_m.jpg&quot; width=&quot;240&quot; alt=&quot;I&amp;#x27;m a Java Champion! :)&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; text-align: right; margin-top: -10px; max-width: 500px; font-size: .9em&quot;&gt;
    More on Flickr &amp;rarr; &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157667022214770&quot;&gt;Devoxx France 2016&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
    Thanks to Devoxx France and Ippon Technologies for providing us with the opportunity for such a fun adventure. We
    had a blast!&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/devoxx_2015_a_java_hipster</id>
        <title type="html">Devoxx 2015: A Java Hipster Visits Belgium</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/devoxx_2015_a_java_hipster"/>
        <published>2015-11-17T00:09:43-07:00</published>
        <updated>2015-11-17T06:21:03-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="mcginityphoto" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="beer" scheme="http://roller.apache.org/ns/tags/" />
        <category term="belgium" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    I&apos;ve been excited to show people &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; and what it can do ever since I
    &lt;a href=&quot;//raibledesigns.com/rd/entry/getting_started_with_jhipster_on&quot;&gt;started
        using it in September 2014&lt;/a&gt;. I&apos;ve been using its core frameworks (AngularJS,
    Bootstrap and Spring Boot) for a few years and believe they do a great job to
    simplify web development. Especially for Java developers.
&lt;/p&gt;
&lt;p&gt;
    When my JHipster talk was accepted for &lt;a href=&quot;http://www.devoxx.be/&quot;&gt;Devoxx Belgium&lt;/a&gt;, I told Trish we were
    headed back to Belgium. She smiled from ear-to-ear. Belgium is one of our favorite countries
    to visit. In an effort to live healthier prior to Devoxx, I stopped drinking beer a month beforehand. I mentioned
    this to friends the week prior.
&lt;/p&gt;

&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;One month ago, I stopped drinking beer. I hoped it&apos;d help me with &lt;a href=&quot;http://www.21-points.com&quot;&gt;www.21-points.com&lt;/a&gt;
        and weight loss. Unfortunately, it did not.&lt;/p&gt;

    &lt;p style=&quot;margin-bottom: 0&quot;&gt;
        I told myself I&apos;d start drinking beer again when 1) The Bus was finished or 2) Trish and I arrived in Belgium
        for Devoxx. Looks like #2 will win (we land on Tuesday).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We arrived in Brussels late Tuesday morning and hopped aboard a train to Antwerp. After
    arriving, we were hungry so we stopped at &lt;a href=&quot;http://www.biercentral.eu/&quot;&gt;Bier Central&lt;/a&gt; for lunch. The
    mussels and
    beer were splendid.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5814/23079344391_a2c964d0df_c.jpg&quot; title=&quot;First beer in over a month, so good!&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/23079344391/&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5814/23079344391_a2c964d0df.jpg&quot; width=&quot;500&quot; alt=&quot;First beer in over a month, so good!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    I&apos;ve been excited to show people &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; and what it can do ever since I
    &lt;a href=&quot;//raibledesigns.com/rd/entry/getting_started_with_jhipster_on&quot;&gt;started
        using it in September 2014&lt;/a&gt;. I&apos;ve been using its core frameworks (AngularJS,
    Bootstrap and Spring Boot) for a few years and believe they do a great job to
    simplify web development. Especially for Java developers.
&lt;/p&gt;
&lt;p&gt;
    When my JHipster talk was accepted for &lt;a href=&quot;http://www.devoxx.be/&quot;&gt;Devoxx Belgium&lt;/a&gt;, I told Trish we were
    headed back to Belgium. She smiled from ear-to-ear. Belgium is one of our favorite countries
    to visit. In an effort to live healthier prior to Devoxx, I stopped drinking beer a month beforehand. I mentioned
    this to friends the week prior.
&lt;/p&gt;

&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;One month ago, I stopped drinking beer. I hoped it&apos;d help me with &lt;a href=&quot;http://www.21-points.com&quot;&gt;www.21-points.com&lt;/a&gt;
        and weight loss. Unfortunately, it did not.&lt;/p&gt;

    &lt;p style=&quot;margin-bottom: 0&quot;&gt;
        I told myself I&apos;d start drinking beer again when 1) The Bus was finished or 2) Trish and I arrived in Belgium
        for Devoxx. Looks like #2 will win (we land on Tuesday).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We arrived in Brussels late Tuesday morning and hopped aboard a train to Antwerp. After
    arriving, we were hungry so we stopped at &lt;a href=&quot;http://www.biercentral.eu/&quot;&gt;Bier Central&lt;/a&gt; for lunch. The
    mussels and
    beer were splendid.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5814/23079344391_a2c964d0df_c.jpg&quot; title=&quot;First beer in over a month, so good!&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/23079344391/&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5814/23079344391_a2c964d0df.jpg&quot; width=&quot;500&quot; alt=&quot;First beer in over a month, so good!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5809/22446966053_48f252f787_c.jpg&quot; title=&quot;Breakfast at Bernardin&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/22446966053/in/dateposted-public/&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5809/22446966053_48f252f787_t.jpg&quot; width=&quot;100&quot; class=&quot;picture&quot; alt=&quot;Breakfast at Bernardin&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    We walked to our accommodations afterward, the &lt;a href=&quot;http://www.bernardin-antwerpen.be/&quot;&gt;Gernardin Guesthouse&lt;/a&gt;.
    We loved the small space, steep stairs and the nice use of space for the restroom in the upstairs closet. The
    breakfast was delightful too.
&lt;/p&gt;

&lt;p&gt;Wednesday afternoon we found ourselves strolling on a city walk around Antwerp. It was overcast, but not chilly
    and we had a fabulous lunch at &lt;a href=&quot;http://www.monantwerp.com/&quot;&gt;M&#243;n&lt;/a&gt; after taking some pictures from the top
    of the &lt;a href=&quot;http://www.mas.be/&quot; title=&quot;Museum aan de Stroom&quot;&gt;MAS&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5720/23054582742_393f044782_c.jpg&quot; title=&quot;Groenplaats, Anterp, Belgium&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/23054582742&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5720/23054582742_393f044782_q.jpg&quot; width=&quot;150&quot; alt=&quot;Groenplaats, Anterp, Belgium&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/681/22446999753_d096a6c46e_c.jpg&quot; title=&quot;From the top of Mas Museum Aan De Stroom&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/22446999753&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/681/22446999753_d096a6c46e_q.jpg&quot; width=&quot;150&quot; alt=&quot;From the top of Mas Museum Aan De Stroom&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/742/22447021683_d2e0c2a5dc_c.jpg&quot; title=&quot;Lunch at M&#243;n&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/22447021683&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/742/22447021683_d2e0c2a5dc_q.jpg&quot; width=&quot;150&quot; alt=&quot;Lunch at M&#243;n&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Wednesday evening, we journeyed to the Devoxx venue to deliver my presentation. The performance went well and I heard
    lots of positive feedback almost immediately. This is one of the things I love about Devoxx: the audience tweets
    like mad and
    feedback is immediate. I also like that the presentation displays are like developers monitors; &lt;em&gt;huge!&lt;/em&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/580/23056246016_087f330f4f_c.jpg&quot; title=&quot;Scotch&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/23056246016&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/580/23056246016_087f330f4f_m.jpg&quot; width=&quot;240&quot; alt=&quot;Scotch&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;https://farm1.staticflickr.com/589/23082331485_995b0a29de_c.jpg&quot; title=&quot;An Old Fashioned Java Developer&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/23082331485&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/589/23082331485_995b0a29de_m.jpg&quot; width=&quot;240&quot; alt=&quot;DSC_7788.jpg&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/679/22663956718_a82441bd93_c.jpg&quot; title=&quot;JHipster!&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/22663956718&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/679/22663956718_a82441bd93_m.jpg&quot; width=&quot;240&quot; alt=&quot;JHipster!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/744/23093573791_07d2e3a9ac_c.jpg&quot; title=&quot;Immediate Feedback&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/23093573791&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/744/23093573791_07d2e3a9ac_m.jpg&quot; width=&quot;240&quot; alt=&quot;Immediate Feedback&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Devoxx made an excellent move this year: they uploaded recordings of talks to the &lt;a href=&quot;https://www.youtube.com/channel/UCCBVCTuk6uJrN3iFV_3vurg&quot;&gt;Devoxx 2015 channel on YouTube&lt;/a&gt;. Amazingly, they
    did it
    within hours for each talk! Because of this modern miracle, you can see &lt;a href=&quot;https://www.youtube.com/watch?v=baVOGuFIe9M&quot;&gt;Get Hip with
        JHipster on YouTube&lt;/a&gt; or watch it below.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/baVOGuFIe9M&quot; frameborder=&quot;0&quot; style=&quot;border: 1px solid black&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster-spring-boot-angularjs-bootstrap-devoxx-2015&quot;&gt;SlideShare&lt;/a&gt;
    |
    &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Get_Hip_with_JHipster_Devoxx2015.pdf&quot;&gt;Download
        PDF&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    Near the end of my presentation, I announced &lt;a href=&quot;https://twitter.com/mraible/status/664498478920388608&quot;&gt;
    the source code for 21-Points Health is available on GitHub&lt;/a&gt;. I&apos;ve had quite a few people ask for it as part of
    the &lt;a href=&quot;http://www.infoq.com/minibooks/jhipster-mini-book&quot;&gt;JHipster Mini-Book&lt;/a&gt; and it seemed like the right
    thing to do. We celebrated that night with &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt; and other new friends at Bier Central.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://farm1.staticflickr.com/595/22445469834_21210403fb_c.jpg&quot; title=&quot;Java Hipsters!&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/22445469834&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/595/22445469834_21210403fb_t.jpg&quot; width=&quot;100&quot; alt=&quot;Java Hipsters!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://farm1.staticflickr.com/579/23042227126_7e05081502_c.jpg&quot; title=&quot;More Cowbell!&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/23042227126&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/579/23042227126_7e05081502_t.jpg&quot; width=&quot;100&quot; alt=&quot;More Cowbell!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://farm6.staticflickr.com/5748/22445489504_d700abc8a8_c.jpg&quot; title=&quot;New Friends at Bier Central&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/22445489504&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5748/22445489504_d700abc8a8_t.jpg&quot; width=&quot;100&quot; alt=&quot;New Friends at Bier Central&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

    &lt;a data-flickr-embed=&quot;true&quot; href=&quot;https://farm1.staticflickr.com/757/22675994129_aa9b7cfb79_c.jpg&quot; title=&quot;Cheers!&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/22675994129&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/757/22675994129_aa9b7cfb79_t.jpg&quot; width=&quot;100&quot; alt=&quot;Cheers!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    Thursday we visited Bruges and had a wonderful time strolling around &lt;a href=&quot;https://bezoekers.Bruges.be/en/minnewaterpark&quot;&gt;Minnewater&lt;/a&gt;,
    marveling at the buildings near the main square and taking a clip-clop tour through
    town. We barely made it to the &lt;a href=&quot;http://www.brugesbeermuseum.com/&quot;&gt;Bruges Beer Museum&lt;/a&gt; before it
    closed and had a delicious
    meal at &lt;a href=&quot;http://www.cambrinus.eu/&quot;&gt;Cambrinus&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/730/22461168593_40d5063088_c.jpg&quot; title=&quot;Minnewater Brugge Belgium&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/22461168593&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/730/22461168593_40d5063088.jpg&quot; width=&quot;500&quot; alt=&quot;Minnewater Brugge Belgium&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5725/22459600664_cf3df2638f_c.jpg&quot; title=&quot;Sint-Janshospitaal Brugge West-Vlaanderen&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/22459600664&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5725/22459600664_cf3df2638f_m.jpg&quot; width=&quot;240&quot; alt=&quot;Sint-Janshospitaal Brugge West-Vlaanderen&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;https://farm1.staticflickr.com/688/22690129029_e3da2e47a0_c.jpg&quot; title=&quot;View from Mariastraat Brugge Belgium&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/22690129029&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/688/22690129029_e3da2e47a0_m.jpg&quot; width=&quot;240&quot; alt=&quot;View from Mariastraat Brugge Belgium&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5752/22690142739_24b443fc6a_c.jpg&quot; title=&quot;Stadhuis Brugge Belgium&quot; rel=&quot;lightbox[devoxx2015]&quot; data-href=&quot;https://www.flickr.com/photos/mcginityphoto/22690142739&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5752/22690142739_24b443fc6a.jpg&quot; width=&quot;500&quot; alt=&quot;Stadhuis Brugge Belgium&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; text-align: right; margin-top: -10px; max-width: 500px; font-size: .9em&quot;&gt;
    More on Flickr &amp;rarr; My &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157660511719478&quot;&gt;Devoxx 2015
    Album&lt;/a&gt; and Trish&apos;s &lt;a href=&quot;https://www.flickr.com/photos/mcginityphoto/albums/72157661317992265&quot;&gt;Belgium
    November 2015 Album&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
    Thanks to the Devoxx crew for a fun conference and great venue. Thanks to Belgium:
    for being so beautiful, for making savory chocolate, brewing delicious beer and
    for your wonderful people. And to the Java community: thanks
    for being so enthusiastic and fun to talk to. We love creating lasting memories
    with you! &amp;#127867;&amp;#128522;
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/angular_summit_2015</id>
        <title type="html">Angular Summit 2015</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/angular_summit_2015"/>
        <published>2015-10-01T10:29:31-06:00</published>
        <updated>2015-10-08T21:32:22-06:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="aurelia" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angular2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="meteor" scheme="http://roller.apache.org/ns/tags/" />
        <category term="es6" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
  I was in Boston this week, speaking and attending the very first &lt;a href=&quot;http://angularsummit.com&quot;&gt;Angular Summit&lt;/a&gt;. I had the privilege of delivering the opening keynote on Monday. I spoke about the Art of Angular
  and used a slide deck similar to &lt;a href=&quot;//raibledesigns.com/rd/entry/the_art_of_angularjs_in&quot;&gt;last time&lt;/a&gt;. I did
  update the presentation to show the astronomical growth of AngularJS in terms of candidate skills (on LinkedIn) and job opportunities (on Dice.com)&lt;sup&gt;1&lt;/sup&gt;.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://farm1.staticflickr.com/691/21198424124_e9b9b37afb_c.jpg&quot; title=&quot;LinkedIn Skills Growth for JavaScript MVC Frameworks&quot; rel=&quot;lightbox[angularsummit2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/21198424124/in/dateposted-public/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/691/21198424124_e9b9b37afb_c.jpg&quot; width=&quot;300&quot; alt=&quot;LinkedIn Skills Growth for JavaScript MVC Frameworks&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://farm6.staticflickr.com/5808/21633143850_9aef93d361_c.jpg&quot; title=&quot;Dice.com Job Growth for JavaScript MVC Frameworks&quot; rel=&quot;lightbox[angularsummit2015]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/21633143850/in/dateposted-public/&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5808/21633143850_9aef93d361_c.jpg&quot; width=&quot;300&quot; alt=&quot;Dice.com Job Growth for JavaScript MVC Frameworks&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I mentioned the recently announced &lt;a href=&quot;http://angularjs.blogspot.com/2015/08/angular-1-and-angular-2-coexistence.html&quot;&gt;good news for Angular 2&lt;/a&gt;:
  &lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;We&apos;re enabling mixing of Angular 1 and Angular 2 in the same application.&lt;/li&gt;
  &lt;li&gt;You can mix Angular 1 and Angular 2 components in the same view.&lt;/li&gt;
  &lt;li&gt;Angular 1 and Angular 2 can inject services across frameworks.&lt;/li&gt;
  &lt;li&gt;Data binding works across frameworks.&lt;/li&gt;
  &lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In related news, &lt;a href=&quot;https://twitter.com/cdoremus&quot;&gt;Craig Doremus&lt;/a&gt; recently posted a &lt;a href=&quot;https://github.com/cdoremus/state-geo-angular&quot;&gt;state-geo-angular&lt;/a&gt; project
  that shows how you can develop an Angular 1.x application that will be easy to upgrade to Angular 2.x.
  Thanks Craig!
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/vaTKWLA8oVDr8z&quot; width=&quot;600&quot; height=&quot;377&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;/p&gt;

&lt;div style=&quot;text-align: right; max-width: 600px; margin: -20px auto 10px auto&quot;&gt;
    &lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;Download&lt;/a&gt; | &lt;a href=&quot;//www.slideshare.net/mraible/the-art-of-angularjs-in-2015-angular-summit-2015&quot;&gt;SlideShare&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;After my keynote, I attended &lt;a href=&quot;https://twitter.com/prpatel&quot;&gt;Pratik Patel&lt;/a&gt;&apos;s session on &lt;a href=&quot;https://angularsummit.com/conference/boston/2015/09/session?id=34208&quot;&gt;High Performance JavaScript Web Apps&lt;/a&gt;.
  Pratik pointed out &lt;a href=&quot;http://mobitest.akamai.com&quot;&gt;mobitest.akamai.com&lt;/a&gt; for testing an app&apos;s performance and seeing its blocking resources. He also mentioned
  &lt;a href=&quot;http://speedgun.io/&quot;&gt;speedgun.io&lt;/a&gt; (currently unavailable) for capturing performance numbers as part of a continuous integration process. Finally,
  he recommended &lt;a href=&quot;http://addyosmani.com/blog/video-javascript-memory-management-masterclass/&quot;&gt;Addy Somani&apos;s JavaScript Memory Management Masterclass&lt;/a&gt;.
&lt;p&gt;
My second presentation was about &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt;. Near the end of the presentation,
I mentioned that I hope to finish the &lt;a href=&quot;http://www.jhipster-book.com/&quot;&gt;JHipster Book&lt;/a&gt; this month. Writing presentations for
&lt;a href=&quot;//raibledesigns.com/rd/entry/springone_2gx_2015_my_presentations&quot;&gt;SpringOne 2GX&lt;/a&gt; and the Angular Summit occupied a lot of my free time in September. Now that it&apos;s October, I&apos;ll be dedicating my free time to finishing the book. In fact, I think I can finish the rough draft this week!
&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/769Ne9avDiEeWl&quot; width=&quot;600&quot; height=&quot;377&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;/p&gt;

&lt;div style=&quot;text-align: right; max-width: 600px; margin: -20px auto 10px auto&quot;&gt;
&lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;Download&lt;/a&gt; | &lt;a href=&quot;//www.slideshare.net/mraible/get-hip-with-jhipster-spring-boot-angularjs-bootstrap-angular-summit-2015&quot;&gt;SlideShare&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
  For the last session of the day, I attended &lt;a href=&quot;https://twitter.com/johnlindquist&quot;&gt;John Lindquist&apos;s&lt;/a&gt; session on &lt;a href=&quot;http://angularsummit.com/conference/boston/2015/09/session?id=34230&quot;&gt;Angular 2 Components&lt;/a&gt;. John showed us
  how &lt;em&gt;everything is a component in Angular 2&lt;/em&gt;. He also said &quot;now is the time to learn ES6&quot; and built an
  &lt;a href=&quot;https://github.com/johnlindquist/angular-2-quickstart&quot;&gt;Angular 2 ToDo App&lt;/a&gt; using ES6 and a bit of TypeScript. You might recognize John&apos;s name; he&apos;s the founder of &lt;a href=&quot;http://egghead.io/&quot;&gt;egghead.io&lt;/a&gt;, an excellent
  site for &lt;a href=&quot;https://egghead.io/playlists/new-to-angular-start-here&quot;&gt;learning Angular&lt;/a&gt; with bite-sized videos.
&lt;/p&gt;
&lt;p&gt;Tuesday morning started with a &lt;a href=&quot;http://angularsummit.com/conference/boston/2015/09/session?id=34187&quot;&gt;
  Angular 2.0 keynote&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/ppavlovich&quot;&gt;Peter Pavlovich&lt;/a&gt;. I really enjoyed
  this session and received lots of good tips about getting ready for Angular 2. The tweet below from
  Ksenia Dmitrieva shows his advice.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Best Practices for &lt;a href=&quot;https://twitter.com/hashtag/angularjs?src=hash&quot;&gt;#angularjs&lt;/a&gt; 1.X if you plan to switch to 2.0 by &lt;a href=&quot;https://twitter.com/ppavlovich&quot;&gt;@ppavlovich&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/AngularSummit?src=hash&quot;&gt;#AngularSummit&lt;/a&gt; &lt;a href=&quot;http://t.co/9nobqDc9G9&quot;&gt;pic.twitter.com/9nobqDc9G9&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ksenia Dmitrieva (@KseniaDmitrieva) &lt;a href=&quot;https://twitter.com/KseniaDmitrieva/status/648865784152915968&quot;&gt;September 29, 2015&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;My biggest takeaway was to start following &lt;a href=&quot;https://github.com/johnpapa/angular-styleguide&quot;&gt;John Papa&apos;s Angular Style Guide&lt;/a&gt; &lt;abbr title=&quot;As Soon As Possible&quot;&gt;ASAP&lt;/abbr&gt;.
&lt;p&gt;The first session I attended on Tuesday was &lt;a href=&quot;https://twitter.com/JuddFlamm&quot;&gt;Judd Flamm&lt;/a&gt;&apos;s &lt;a href=&quot;https://angularsummit.com/conference/boston/2015/09/session?id=34298&quot;&gt;Google Material Design &amp;amp; Angular&lt;/a&gt;.
  I&apos;m using &lt;a href=&quot;https://fezvrasta.github.io/bootstrap-material-design/&quot;&gt;Material Design for Bootstrap&lt;/a&gt; on a side project, so I was interested in learning more about its inspiration.
  We learned that &lt;a href=&quot;https://design.google.com/&quot;&gt;Google Design&lt;/a&gt; has everything you need to know about why Material Design exists. We also
  learned about &lt;a href=&quot;https://material.angularjs.org&quot;&gt;Angular Material&lt;/a&gt; and spent most of the session looking at its components. Judd
  recommended &lt;a href=&quot;https://github.com/angular/material-start&quot;&gt;Angular Material-Start&lt;/a&gt; for those looking to get started quickly with both frameworks.
  Judd was a very entertaining speaker; I highly recommend you attend one of his talks if you get the opportunity.
&lt;/p&gt;
&lt;p&gt;After being dazzled by Peter&apos;s knowledge of Angular 2 in Tuesday&apos;s keynote, I attended two more of his talks: one on &lt;a href=&quot;https://www.meteor.com/&quot;&gt;Meteor&lt;/a&gt; and
  another on &lt;a href=&quot;http://aurelia.io/&quot;&gt;Aurelia&lt;/a&gt;. I&apos;ve known about Meteor for a while, but have become more intrigued by it lately with its
  &lt;a href=&quot;http://www.infoq.com/news/2015/09/meteor-12-ecmascript&quot;&gt;1.2 release&lt;/a&gt; and &lt;a href=&quot;http://info.meteor.com/blog/official-angular-support-with-angular-meteor-1.0.0&quot;&gt;Angular support&lt;/a&gt;. Meteor&apos;s
  command line tools that auto-inject CSS and JS demoed very well, as did it&apos;s installable features like a LESS support and Facebook authentication.
&lt;/p&gt;
&lt;p&gt;After hearing all the good things about Angular 2 from Peter, it was interesting to hear him downplay it in his Aurelia talk later that day. When he started showing code,
  it was pretty obvious that Aurelia is doing a great job of simplifying JavaScript MVC syntax for developers. You can develop components with almost half the
    code that Angular 2 requires, and it uses ES6, &lt;a href=&quot;http://jspm.io/&quot;&gt;jspm&lt;/a&gt; and &lt;a href=&quot;https://github.com/systemjs/systemjs&quot;&gt;SystemJS&lt;/a&gt;.
    If you&apos;re developing JavaScript, learning these tools will help prepare you for the future. It&apos;s cool that Aurelia encourages learning things you should learn anyway.
  &lt;/p&gt;
  &lt;p&gt;Aurelia and Angular 2 are both still in Alpha, so I&apos;m not sure it makes sense to use them on a project this year. However, I do think it&apos;s important to track
    them both. I especially think it&apos;s interesting that the founder of Aurelia, &lt;a href=&quot;http://twitter.com/EisenbergEffect&quot;&gt;Rob Eisenberg&lt;/a&gt;,
    &lt;a href=&quot;http://eisenbergeffect.bluespire.com/leaving-angular/&quot;&gt;left the Angular Team&lt;/a&gt; in November 2014 and &lt;a href=&quot;http://blog.durandal.io/2015/01/26/introducing-aurelia/&quot;&gt;
      announced Aurelia&lt;/a&gt; in January 2015 (&lt;a href=&quot;https://news.ycombinator.com/item?id=8948665&quot;&gt;Hacker News thread&lt;/a&gt;). Peter mentioned several times that Aurelia wants to help developers write apps,
      while AngularJS is more tied to helping Google write apps.
  &lt;/p&gt;
&lt;p&gt;
  There were around 400 people at Angular Summit, which I think is pretty good for a first-run conference. As with most No Fluff Just Stuff shows, it ran smoothly, had
    plenty of time between sessions and was filled with knowledgeable, entertaining speakers. It was fun doing my first keynote and I look forward to speaking again in November
    (at &lt;a href=&quot;http://www.devoxx.be/&quot;&gt;Devoxx&lt;/a&gt;) and December (at
    &lt;a href=&quot;http://www.therichwebexperience.com/conference/fort_lauderdale/2015/12/home&quot;&gt;The Rich Web Experience&lt;/a&gt;).
  &lt;/head&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: .9em&quot;&gt;1. I know Dice.com is probably not a great site, but it makes sense to use it since I&apos;ve
been tracking JavaScript MVC framework job stats on it since February 2014.&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/uberconf_2015_my_presentations_on</id>
        <title type="html">UberConf 2015: My Presentations on Apache Camel and Java Webapp Security</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/uberconf_2015_my_presentations_on"/>
        <published>2015-07-27T08:08:48-06:00</published>
        <updated>2015-07-27T14:08:48-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="apacheshiro" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apachecamel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webapp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="uberconf" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last week I had the pleasure of speaking at &lt;a href=&quot;http://uberconf.com/conference/denver/2015/07/home&quot;&gt;UberConf 2015&lt;/a&gt;. My first talk was on &lt;a href=&quot;http://uberconf.com/conference/denver/2015/07/session?id=33782&quot;&gt;Developing, Testing and Scaling with Apache Camel&lt;/a&gt;. This presentation contained an intro to &lt;a href=&quot;http://camel.apache.org&quot;&gt;Apache Camel&lt;/a&gt; and a recap of my experience &lt;a href=&quot;//raibledesigns.com/rd/entry/developing_services_with_apache_camel3&quot;&gt;using it at a client last year&lt;/a&gt;. You can click through the presentation below, download it from &lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;my presentations page&lt;/a&gt;, or &lt;a href=&quot;http://www.slideshare.net/mraible/developing-testing-and-scaling-with-apache-camel-uberconf-2015&quot;&gt;view it on SlideShare&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/k1ZZ5oFKjjH7bI&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border-top: 1px solid black; border-bottom: 1px solid black&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;My second presentation was about implementing &lt;a href=&quot;http://uberconf.com/conference/denver/2015/07/session?id=33746&quot;&gt;Java Web Application Security with Java EE, Spring Security and Apache Shiro&lt;/a&gt;. I updated this presentation to use Java EE 7 and Jersey, as well as Spring Boot. I used Spring Boot to manage dependencies in all three projects, then showed the slick &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/1.2.5.RELEASE/reference/htmlsingle/#boot-features-security&quot;&gt;out-of-the-box security Spring Boot has&lt;/a&gt; (when you include the Spring Security on the classpath). For &lt;a href=&quot;http://shiro.apache.org&quot;&gt;Apache Shiro&lt;/a&gt;, I configured its filter and required dependencies using Spring&apos;s JavaConfig. You can click through my security presentation below, download it from &lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;my presentations page&lt;/a&gt;, or &lt;a href=&quot;http://www.slideshare.net/mraible/java-web-application-security-with-java-ee-spring-security-and-apache-shiro-uberconf-2015&quot;&gt;view it on SlideShare&lt;/a&gt;.
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/7pd6dSYxXtj8u5&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border-top: 1px solid black; border-bottom: 1px solid black&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;One thing that didn&apos;t make it into the presentation was the &lt;a href=&quot;https://github.com/mraible/java-webapp-security-examples/pull/3&quot;&gt;super-helpful pull request&lt;/a&gt; from &lt;a href=&quot;https://spring.io/team/rwinch&quot;&gt;Rob Winch&lt;/a&gt;, Spring Security Lead. He showed me how you can use basic and form-based authentication in the same app, as well how to write tests with &lt;a href=&quot;https://github.com/rwinch/java-webapp-security-examples/commit/5357d7ae94f24e18e7641f9f2b98a36132a016d4&quot;&gt;MockMvc and Spring Security&apos;s Testing support&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The next time I do this presentation (at the &lt;a href=&quot;http://www.therichwebexperience.com/conference/fort_lauderdale/2015/12/speakers/matt_raible&quot;&gt;Rich Web Experience&lt;/a&gt;), I&apos;d like to see if it&apos;s possible to use all-Java to configure the Java EE 7 example. I used web.xml in this example and the &lt;a href=&quot;https://blogs.oracle.com/swchan/entry/follow_up_on_servlet_3&quot;&gt;Servlet 3.0 Security Annotations&lt;/a&gt; might offer enough to get rid of it.&lt;/p&gt;
&lt;p&gt;All the demos I did during the security presentation can be seen in my &lt;a href=&quot;https://github.com/mraible/java-webapp-security-examples&quot;&gt;java-webapp-security-examples project on GitHub&lt;/a&gt;. There&apos;s branches for where I started (javaee-start, springsecurity-start and apacheshiro-start) as well as &quot;complete&quot; branches for where I finished. The complete examples should also be in-sync with the master branch.&lt;/p&gt;
&lt;p&gt;If you have any questions about either presentation, please let me know.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/getting_hip_with_jhipster_at</id>
        <title type="html">Getting Hip with JHipster at Denver&apos;s Java User Group</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/getting_hip_with_jhipster_at"/>
        <published>2015-04-09T08:31:54-06:00</published>
        <updated>2015-04-09T19:20:43-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="html5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yeoman" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;Last night, I had the pleasure of &lt;a href=&quot;http://www.meetup.com/DenverJavaUsersGroup/events/220309287/&quot;&gt;speaking at Denver&apos;s Java User Group Meetup about JHipster&lt;/a&gt;. I&apos;ve been a big fan of &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; ever since I started using it last fall. I developed a quick prototype for a client and wrote about &lt;a href=&quot;//raibledesigns.com/rd/entry/getting_started_with_jhipster_on&quot;&gt;solving some issues I had with it on OS X&lt;/a&gt;. I like the project because it encapsulates the primary open source tools I&apos;ve been using for the last couple of years: &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;, &lt;a href=&quot;https://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; and &lt;a href=&quot;http://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;. I also wrote about its &lt;a href=&quot;http://www.infoq.com/news/2015/01/jhipster-2.0&quot;&gt;2.0 release&lt;/a&gt; on InfoQ in January.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://farm9.staticflickr.com/8820/16900780428_7093ff1754_c.jpg&quot; rel=&quot;lightbox[jhipsterdjug]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/16900780428&quot; title=&quot;My Hipster Getup by Matt Raible, on Flickr&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8820/16900780428_7093ff1754_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;My Hipster Getup&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
To add some humor to my talk, I showed up as a well-dressed Java Developer. Like a mature gentleman might do, I started the evening with a glass of scotch (Glenlivet 12). Throughout the talk I became more hip and adjusted my attire, and beverage, accordingly. As you might expect, my demos had failures. The initial project creation stalled during Bower&apos;s &lt;em&gt;download all JavaScript dependencies&lt;/em&gt;. Luckily, I had a backup and was able to proceed. Towards the end, when I tried to deploy to Heroku, I was presented with a lovely message that &quot;Heroku toolbelt updating, please try again later&quot;. I guess auto-updating has its downsides. &lt;/p&gt;
&lt;p&gt;After finishing the demo, I cracked open a cold PBR to ease my frustration.&lt;/p&gt;
&lt;p&gt;I did two live coding sessions during this presentation; standing on the shoulders of giants to do so. I modeled Josh Long&apos;s &lt;a href=&quot;http://www.joshlong.com/jl/blogPost/tech_tip_geting_started_with_spring_boot.html&quot;&gt;Getting Started with Spring Boot&lt;/a&gt; to create a quick introduction to Spring Boot. IntelliJ IDEA 14.1 has a &lt;a href=&quot;http://blog.jetbrains.com/idea/2015/03/develop-spring-boot-applications-more-productively-with-intellij-idea-14-1/&quot;&gt;nice way to create Spring Boot projects&lt;/a&gt;, so that came in handy.  For the JHipster portion, I created a blogging app and used relationships and business logic similar to what Julien Dubois did in his &lt;a href=&quot;https://spring.io/blog/2015/03/31/webinar-replay-jhipster-for-spring-boot&quot;&gt;JHipster for Spring Boot Webinar&lt;/a&gt;. Watching Josh and Julien&apos;s demos will give you a similar experience to what DJUG attendees experienced last night, without the download/deployment failures.
&lt;/p&gt;
&lt;p&gt;You can click through my presentation below, download it from &lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;my
    presentations page&lt;/a&gt;, or &lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster&quot;&gt;view it on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/46814366&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You might notice my &lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster/32&quot;&gt;announcement on slide #32&lt;/a&gt; that I&apos;ve signed up to write a book on JHipster.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://farm9.staticflickr.com/8825/17062597206_60a5bd6e19_c.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/17062597206&quot; rel=&quot;lightbox[jhipsterdjug]&quot; title=&quot;The JHipster Mini-Book by Matt Raible&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8825/17062597206_60a5bd6e19.jpg&quot; width=&quot;500&quot; alt=&quot;The JHipster Mini-Book&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I haven&apos;t started writing the book yet, but I have been talking with &lt;a href=&quot;http://infoq.com&quot;&gt;InfoQ&lt;/a&gt; and other folks about it for several months. I plan to use &lt;a href=&quot;https://github.com/asciidoctor/asciidoctor-gradle-examples&quot;&gt;Asciidoctor and Gradle&lt;/a&gt; as my authoring tools. If you have experience writing a book with these tools, I&apos;d love to hear about it. If you&apos;ve developed an application with JHipster and have some experience in the trenches, I&apos;d love to hear your stories too. 
&lt;/p&gt;
&lt;p&gt;
As I told DJUG last night, I plan to be done with the book in a few months. However, if you&apos;ve been a reader of this blog, you&apos;ll know I&apos;ve been planning to be done with my &apos;66 VW Bus in &lt;em&gt;just a few more months&lt;/em&gt; for quite some time, so that phrase has an interesting meaning for me. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_3_5_released</id>
        <title type="html">AppFuse 3.5 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_3_5_released"/>
        <published>2015-02-20T09:08:53-07:00</published>
        <updated>2015-02-20T17:24:22-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;http://static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 3.5. This release contains a number of improvements.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;XML reduced by 8x in projects generated with AppFuse&lt;/li&gt;&lt;li&gt;CRUD generation&amp;nbsp;support for Wicket, as well as AppFuse Light archetypes (Spring Security, Spring FreeMarker and Stripes)&lt;/li&gt;&lt;li&gt;Upgraded Tapestry to 5.4&lt;/li&gt;&lt;li&gt;Integrated&amp;nbsp;Spring IO Platform for dependency management&lt;/li&gt;&lt;li&gt;Refactored unit tests to use JUnit 4&lt;/li&gt;&lt;li&gt;Renamed maven-warpath-plugin to warpath-maven-plugin&lt;/li&gt;&lt;li&gt;Upgraded to jWebUnit 3 for AppFuse Light integration tests&lt;/li&gt;&lt;li&gt;Updated all AppFuse Light modules to be up-to-date&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;For more details on specific changes
    see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+3.5.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br&gt;
    AppFuse is a full-stack framework for building web applications on the JVM. It was
    originally developed to eliminate the ramp-up time when building new web applications. Over
    the years, it has matured into a very testable and secure system for creating Java-based
    webapps.
&lt;/p&gt;
&lt;p&gt;Demos for this release can be viewed at &lt;a href=&quot;http://demo.appfuse.org/&quot;&gt;http://demo.appfuse.org&lt;/a&gt;. Please see
    the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; style=&quot;font-weight: bold&quot;&gt;QuickStart Guide&lt;/a&gt; to
    get started with this release. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the
    &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any
    issues, please report them on the users mailing list. You can also post them to &lt;a href=&quot;http://stackoverflow.com/questions/tagged/appfuse&quot;&gt;Stack Overflow&lt;/a&gt; with the &quot;appfuse&quot; tag.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing
    lists.&lt;/p&gt;

&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our
    sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;,
    &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, and &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;.
    Atlassian and Contegix are especially awesome:
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all
        its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/converting_an_application_to_jhipster</id>
        <title type="html">Converting an Application to JHipster</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/converting_an_application_to_jhipster"/>
        <published>2015-02-12T09:28:59-07:00</published>
        <updated>2015-02-12T15:29:50-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dosug" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://jhipster.github.io/&quot;&gt;&lt;img src=&quot;http://jhipster.github.io/images/logo-jhipster.png&quot; class=&quot;picture&quot; width=&quot;94&quot;&gt;&lt;/a&gt;
I&apos;ve been intrigued by &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; ever since I first tried it &lt;a href=&quot;http://raibledesigns.com/rd/entry/getting_started_with_jhipster_on&quot;&gt;last September&lt;/a&gt;. I&apos;d worked with AngularJS and Spring Boot quite a bit, and I liked the idea that someone had combined them, adding some nifty features along the way. When I &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_art_of_angularjs_in&quot;&gt;spoke about AngularJS&lt;/a&gt; earlier this month, I included &lt;a href=&quot;http://www.slideshare.net/mraible/the-art-of-angularjs-in-2015/67&quot;&gt;a few slides on JHipster&lt;/a&gt; near the end of the presentation.&lt;/p&gt;
&lt;p&gt;This week, I received an email from someone who attended that presentation. &lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;Hey Matt,&lt;br&gt;
We met a few weeks back when you presented at DOSUG. You were talking about JHipster which I had been eyeing for a few months and wanted your quick .02 cents.&lt;/p&gt;
&lt;p&gt;
I have built a pretty heavy application over the last 6 months that is using mostly the same tech as JHipster. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Spring&lt;/li&gt;
&lt;li&gt;JPA&lt;/li&gt;
&lt;li&gt;AngularJS&lt;/li&gt;
&lt;li&gt;Compass&lt;/li&gt;
&lt;li&gt;Grunt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
It&apos;s ridiculously close for most of the tech stack. So, I was debating rolling it over into a JHipster app to make it a more familiar stack for folks. My concern is that it I will spend months trying to shoehorn it in for not much ROI. Any thoughts on going down this path?
What are the biggest issues you&apos;ve seen in using JHipster?
It seems pretty straightforward except for the entity generators. I&apos;m concerned they are totally different than what I am using. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
The main difference in what I&apos;m doing compared to JHipster is my almost complete use of groovy instead of old school Java in the app. I would have to be forced into going back to regular java beans...
Thoughts?&lt;/p&gt; 
&lt;/blockquote&gt;
&lt;p&gt;I replied with the following advice:&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
JHipster is great for starting a project, but I don&apos;t know that it buys you much value after the first few months. I would stick with your current setup and consider JHipster for your next project. I&apos;ve only prototyped with it, I haven&apos;t created any client apps or put anything in production. I have with Spring Boot and AngularJS though, so I like that JHipster combines them for me.
&lt;/p&gt;
&lt;p&gt;
JHipster doesn&apos;t generate Scala or Groovy code, but you could still use them in a project as long as you had Maven/Gradle configured properly. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
You might try generating a new app with JHipster and examine how they&apos;re doing this. At the very least, it can be a good learning tool, even if you&apos;re not using it directly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Java Hipsters: Do you agree with this advice? Have you tried migrating an existing app to JHipster? Are any of you using Scala or Groovy in your JHipster projects?&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_reduced</id>
        <title type="html">AppFuse, Reduced</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_reduced"/>
        <published>2014-12-16T06:03:31-07:00</published>
        <updated>2014-12-17T16:39:14-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maintenance" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lessxml" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
In November, I had some time off between clients. To occupy my time, I exercised my body and brain a bit. I spent a couple hours a day exercising and a few hours a day working on
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. AppFuse isn&apos;t used to start projects nearly as much as it once was. This makes sense since there&apos;s been a ton of innovation on the JVM and there&apos;s lots of
&lt;em&gt;get-started-quickly&lt;/em&gt; frameworks now. Among my favorites are Spring Boot, JHipster, Grails and Play.
&lt;p&gt;
    You can see that AppFuse&apos;s community activity has decreased quite a bit over the years by looking at its mailing list
    traffic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://appfuse.markmail.org/&quot;
       title=&quot;AppFuse Mailing List Traffic, December 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7525/15825430580_0531875e59.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Mailing List Traffic, December 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Even though there&apos;s not a lot of users talking on the mailing list, it still seems to get quite a few downloads from
    Maven Central.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/16011987392&quot;
       title=&quot;AppFuse Maven Central Stats, November 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7534/16011987392_442236433b.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Maven Central Stats, November 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I think the biggest value that AppFuse provides now is a learning tool for those who work on it. Also, it&apos;s a good place to
    show other developers how they can evolve with open source frameworks (e.g. Spring, Hibernate, JSF, Tapestry, Struts) over several years. Showing how
    we migrated to Spring MVC Test, for example, might be useful. The upcoming move to Spring Data instead of our
    Generic DAO solution might be interesting as well. 
&lt;/p&gt;
&lt;p&gt;
    Regardless of whether AppFuse is used a lot or not, it should be easy to maintain. Over the several weeks, I made some
    opinionated changes and achieved some pretty good progress on simplifying things and making the project easier to
    maintain. The previous structure has a lot of duplicate versions, properties and plugin configurations between
    different projects. I was able to leverage Maven&apos;s inheritance model to make a number of improvements:
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
In November, I had some time off between clients. To occupy my time, I exercised my body and brain a bit. I spent a couple hours a day exercising and a few hours a day working on
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. AppFuse isn&apos;t used to start projects nearly as much as it once was. This makes sense since there&apos;s been a ton of innovation on the JVM and there&apos;s lots of
&lt;em&gt;get-started-quickly&lt;/em&gt; frameworks now. Among my favorites are Spring Boot, JHipster, Grails and Play.
&lt;p&gt;
    You can see that AppFuse&apos;s community activity has decreased quite a bit over the years by looking at its mailing list
    traffic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://appfuse.markmail.org/&quot;
       title=&quot;AppFuse Mailing List Traffic, December 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7525/15825430580_0531875e59.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Mailing List Traffic, December 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Even though there&apos;s not a lot of users talking on the mailing list, it still seems to get quite a few downloads from
    Maven Central.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/16011987392&quot;
       title=&quot;AppFuse Maven Central Stats, November 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7534/16011987392_442236433b.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Maven Central Stats, November 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I think the biggest value that AppFuse provides now is a learning tool for those who work on it. Also, it&apos;s a good place to
    show other developers how they can evolve with open source frameworks (e.g. Spring, Hibernate, JSF, Tapestry, Struts) over several years. Showing how
    we migrated to Spring MVC Test, for example, might be useful. The upcoming move to Spring Data instead of our
    Generic DAO solution might be interesting as well. 
&lt;/p&gt;
&lt;p&gt;
    Regardless of whether AppFuse is used a lot or not, it should be easy to maintain. Over the several weeks, I made some
    opinionated changes and achieved some pretty good progress on simplifying things and making the project easier to
    maintain. The previous structure has a lot of duplicate versions, properties and plugin configurations between
    different projects. I was able to leverage Maven&apos;s inheritance model to make a number of improvements:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Changed AppFuse&apos;s parent to be based on the &lt;a
        href=&quot;http://www.infoq.com/news/2014/07/springio-platform&quot;&gt;Spring IO Platform&lt;/a&gt;. This project
        is a dependency manager that defines version numbers for open source projects that work well with Spring.
    &lt;/li&gt;
    &lt;li&gt;Defined plugins, their versions and configurations in &lt;code&gt;&amp;lt;pluginManagement&gt;&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Defined dependencies, their versions and exclusions in &lt;code&gt;&amp;lt;dependencyManagement&gt;&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Simplified archetypes so new projects have minimal dependencies. For example, here&apos;s a basic project&apos;s &lt;code&gt;pom.xml&lt;/code&gt;:
    &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;

    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;com.company&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;springmvc-project&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;AppFuse Spring MVC Application&amp;lt;/name&amp;gt;

    &amp;lt;parent&amp;gt;
        &amp;lt;groupId&amp;gt;org.appfuse&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;appfuse-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;3.5.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;/parent&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;de.juplo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;hibernate4-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;dbunit-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;build-helper-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.appfuse&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;appfuse-${web.framework}&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${appfuse.version}&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;amp.genericCore&amp;gt;true&amp;lt;/amp.genericCore&amp;gt;
        &amp;lt;amp.fullSource&amp;gt;false&amp;lt;/amp.fullSource&amp;gt;
        &amp;lt;dao.framework&amp;gt;hibernate&amp;lt;/dao.framework&amp;gt;
        &amp;lt;db.name&amp;gt;mydatabase&amp;lt;/db.name&amp;gt;
        &amp;lt;web.framework&amp;gt;spring&amp;lt;/web.framework&amp;gt;

        &amp;lt;!-- Framework/Plugin versions --&amp;gt;
        &amp;lt;appfuse.version&amp;gt;3.5.0-SNAPSHOT&amp;lt;/appfuse.version&amp;gt;
        &amp;lt;java.version&amp;gt;1.7&amp;lt;/java.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;profiles&amp;gt;
        &amp;lt;profile&amp;gt;
            &amp;lt;id&amp;gt;itest&amp;lt;/id&amp;gt;
            &amp;lt;build&amp;gt;
                &amp;lt;plugins&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.codehaus.cargo&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;cargo-maven2-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;webtest-maven-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                &amp;lt;/plugins&amp;gt;
            &amp;lt;/build&amp;gt;
        &amp;lt;/profile&amp;gt;
    &amp;lt;/profiles&amp;gt;

    &amp;lt;reporting&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;webtest-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/reporting&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
    span.diffstat {
        white-space: nowrap;
        text-align: right;
        font-family: Helvetica, arial, freesans, clean, sans-serif, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;
        color: #666;
        font-weight: bold;
        font-size: 12px;
        cursor: default;
    }

    span.diffstat .lines-added, span.diffstat .lines-deleted {
        display: inline-block;
        margin-left: 3px;
        font-weight: bold;
    }
&lt;/style&gt;
&lt;p&gt;
    The pull request for these changes says it all:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/appfuse/appfuse/pull/20&quot;&gt;AppFuse&lt;/a&gt; &lt;span class=&quot;diffstat&quot;&gt;
          &lt;span class=&quot;lines-added&quot; style=&quot;color: #55a532&quot;&gt;
            &lt;span class=&quot;diffstat-icon&quot;&gt;+&lt;/span&gt;4,822
          &lt;/span&gt;
          &lt;span class=&quot;lines-deleted&quot; style=&quot;color: #bd2c00&quot;&gt;
            &lt;span class=&quot;diffstat-icon&quot;&gt;-&lt;/span&gt;14,369
          &lt;/span&gt;
        &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/appfuse/appfuse-light/pull/1&quot;&gt;AppFuse Light&lt;/a&gt; &lt;span class=&quot;diffstat&quot;&gt;
              &lt;span class=&quot;lines-added&quot; style=&quot;color: #55a532&quot;&gt;
                &lt;span class=&quot;diffstat-icon&quot;&gt;+&lt;/span&gt;776
              &lt;/span&gt;
              &lt;span class=&quot;lines-deleted&quot; style=&quot;color: #bd2c00&quot;&gt;
                &lt;span class=&quot;diffstat-icon&quot;&gt;-&lt;/span&gt;4,687
              &lt;/span&gt;

            &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s right, I was able to eliminate a good chunk of code without affecting any of AppFuse&apos;s functionality&lt;sup&gt;&lt;a
    href=&quot;http://raibledesigns.com/rd/entry/appfuse_reduced#footnote1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.
    I think we can all agree that less code == easier maintenance. This theme will continue as we work on future
    releases.
&lt;/p&gt;

&lt;p&gt;Other improvements include migrating all tests to use JUnit4, integrating Spring MVC Test, and configuring the
    surefire plugin to run tests in parallel. I also The &lt;a href=&quot;http://mojo.codehaus.org/build-helper-maven-plugin/&quot;&gt;build-helper-maven-plugin&lt;/a&gt;
    is now used to find open ports for Cargo to run and a lot of testing was done to ensure you can build/test multiple
    AppFuse-derived projects at the same time. Finally, I migrated to the &lt;a href=&quot;http://juplo.de/hibernate4-maven-plugin/&quot;&gt;hibernate4-maven-plugin&lt;/a&gt; and upgraded to Tapestry 5.4.&lt;/p&gt;

&lt;p&gt;In the next version of AppFuse, I plan to remove as
    much XML as possible - moving all of the configuration to Spring&apos;s JavaConfig. We&apos;ll also be moving to Java 8 as a
    minimum. I&apos;m even considering getting rid of all the pom.xml files in favor of another build language that requires
    less code. &lt;/p&gt;
&lt;p&gt;In other words, the upcoming 3.5 release will be the last release that supports Java 7 and uses Spring&apos;s XML for configuration. AppFuse 4.0 will strive for #NoXML.
   &lt;a href=&quot;http://appfuse.org/display/APF/Roadmap&quot;&gt;The project&apos;s roadmap&lt;/a&gt; has more details on additional
    hopes and dreams.&lt;/p&gt;

&lt;p&gt;We&apos;d love to hear your feedback on these change. Do you like the simplification theme? Are you OK with having AppFuse
    as a parent in your projects?
&lt;/p&gt;
&lt;p class=&quot;footnotes&quot; style=&quot;border-top: 1px dotted silver; padding-top: 5px; font-size: .9em&quot;&gt;
    &lt;a name=&quot;footnote1&quot;&gt;&lt;/a&gt;1. For project
    and code stats, see &lt;a href=&quot;https://www.openhub.net/p/appfuse/analyses/latest/languages_summary&quot;&gt;AppFuse on Open
    Hub&lt;/a&gt;.
&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel2</id>
        <title type="html">Developing Services with Apache Camel - Part III: Integrating Spring 4 and Spring Boot</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/developing_services_with_apache_camel2"/>
        <published>2014-10-08T07:13:18-06:00</published>
        <updated>2014-10-15T19:00:44-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="apachecamel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tomcat" scheme="http://roller.apache.org/ns/tags/" />
        <category term="microservices" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="camel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring4" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
&lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/spring-boot-logo.png&quot; alt=&quot;Spring Boot&quot; height=&quot;108&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
    This article is the third in a series on Apache Camel and how I used it to replace IBM Message Broker for a client.
    I used Apache Camel for several months this summer to create a number of SOAP services. These services performed
    various third-party data lookups for our customers. For previous articles, see
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel&quot;&gt;Part I: The Inspiration&lt;/a&gt;
    and &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel1&quot;&gt;Part II: Creating and
    Testing Routes&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
    In late June, I sent an email to my client&apos;s engineering team. Its subject: &quot;External Configuration and
    Microservices&quot;.
    I recommended we integrate &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt; into the
    Apache Camel project I was working on. I told them my main motivation was its
    &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config&quot;&gt;
        external configuration&lt;/a&gt; feature. I also pointed out its container-less WAR feature, where Tomcat (or Jetty)
    is embedded in the WAR and you can start your app with &quot;java -jar appname.war&quot;. I mentioned
    &lt;a href=&quot;http://martinfowler.com/articles/microservices.html&quot;&gt;microservices&lt;/a&gt;
    and that Spring Boot would make it easy to split the project into a project-per-service structure if we wanted
    to go that route. I then asked two simple questions:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Is it OK to integrate Spring Boot?&lt;/li&gt;
    &lt;li&gt;Should I split the project into microservices?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
    Both of these suggestions were well received, so I went to work.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
&lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/spring-boot-logo.png&quot; alt=&quot;Spring Boot&quot; height=&quot;108&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
    This article is the third in a series on Apache Camel and how I used it to replace IBM Message Broker for a client.
    I used Apache Camel for several months this summer to create a number of SOAP services. These services performed
    various third-party data lookups for our customers. For previous articles, see
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel&quot;&gt;Part I: The Inspiration&lt;/a&gt;
    and &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel1&quot;&gt;Part II: Creating and
    Testing Routes&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
    In late June, I sent an email to my client&apos;s engineering team. Its subject: &quot;External Configuration and
    Microservices&quot;.
    I recommended we integrate &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt; into the
    Apache Camel project I was working on. I told them my main motivation was its
    &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config&quot;&gt;
        external configuration&lt;/a&gt; feature. I also pointed out its container-less WAR feature, where Tomcat (or Jetty)
    is embedded in the WAR and you can start your app with &quot;java -jar appname.war&quot;. I mentioned
    &lt;a href=&quot;http://martinfowler.com/articles/microservices.html&quot;&gt;microservices&lt;/a&gt;
    and that Spring Boot would make it easy to split the project into a project-per-service structure if we wanted
    to go that route. I then asked two simple questions:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Is it OK to integrate Spring Boot?&lt;/li&gt;
    &lt;li&gt;Should I split the project into microservices?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
    Both of these suggestions were well received, so I went to work.
&lt;/p&gt;

&lt;h3 id=&quot;spring4&quot;&gt;Spring 4&lt;/h3&gt;

&lt;p&gt;
    Before I integrated Spring Boot, I knew I had to upgrade to &lt;a href=http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html&quot;&gt;Spring 4&lt;/a&gt;. The version of Camel I was using (2.13.1)
    did not support Spring 4. I found issue CAMEL-7074 (Support spring 4.x) and
    &lt;a href=&quot;https://issues.apache.org/jira/browse/CAMEL-7074?focusedCommentId=14042668&amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14042668&quot;&gt;
        added a comment&lt;/a&gt; to see when it would be fixed. After fiddling with dependencies and trying Camel
    2.14-SNAPSHOT,
    I was able to upgrade to CXF 3.0. However, this didn&apos;t solve my problem. There were some API uncompatible changes
    between
    Spring 3.3.x and Spring 4.0.x and the camel-test-spring module wouldn&apos;t work with both. I proposed the following:
&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;
    I think the easiest way forward is to create two modules: camel-test-spring and camel-test-spring3. The former
    compiles against Spring 4 and the latter against Spring 3. You could switch it so camel-test-spring defaults to
    Spring 3, but camel-test-spring4 doesn&apos;t seem to be forward-looking, as you hopefully won&apos;t need a
    camel-test-spring5.
    &lt;br/&gt;&lt;br/&gt;
    I&apos;ve made this change in a fork and it works in my project. I can upgrade to Camel 2.14-SNAPSHOT and CXF 3.0 with
    Spring 3.2.8 (by using camel-test-spring3). I can also upgrade to Spring 4 if I use the upgraded camel-test-spring.
    &lt;br/&gt;&lt;br/&gt;
    Here&apos;s a pull request that has this change: &lt;a href=&quot;https://github.com/apache/camel/pull/199&quot;&gt;https://github.com/apache/camel/pull/199&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The Camel team integrated my suggested change a couple weeks later. Unfortunately,
    &lt;a href=&quot;https://issues.apache.org/jira/browse/CAMEL-7835&quot;&gt;a similar situation happened with Spring 4.1&lt;/a&gt;, so
    you&apos;ll have to wait for Camel 2.15 if you want to use Spring 4.1.&lt;/p&gt;
&lt;p&gt;
    After making a patched 2.14-SNAPSHOT version available to my project, I was able to upgrade to Spring 4 and CXF 3
    with a few minor changes to my pom.xml.
&lt;/p&gt;
&lt;pre class=&quot;brush: diff&quot;&gt;
    &amp;lt;properties&amp;gt;
      &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
      &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt;
-     &amp;lt;camel.version&amp;gt;2.13.1&amp;lt;/camel.version&amp;gt;
-     &amp;lt;cxf.version&amp;gt;2.7.11&amp;lt;/cxf.version&amp;gt;
-     &amp;lt;spring.version&amp;gt;3.2.8.RELEASE&amp;lt;/spring.version&amp;gt;
+     &amp;lt;camel.version&amp;gt;2.14-SNAPSHOT&amp;lt;/camel.version&amp;gt;
+     &amp;lt;cxf.version&amp;gt;3.0.0&amp;lt;/cxf.version&amp;gt;
+     &amp;lt;spring.version&amp;gt;4.0.5.RELEASE&amp;lt;/spring.version&amp;gt;
    &amp;lt;/properties&amp;gt;
...
+      &amp;lt;!-- upgrade camel-spring dependencies --&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
+         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
+      &amp;lt;/dependency&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-aop&amp;lt;/artifactId&amp;gt;
+         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
+      &amp;lt;/dependency&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt;
+         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
+      &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I also had to change some imports for CXF 3.0 since it &lt;a href=&quot;http://cxf.apache.org/docs/30-migration-guide.html&quot;&gt;
    includes a new major version of Apache WSS4J (2.0.0)&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: diff&quot;&gt;
-import org.apache.ws.security.handler.WSHandlerConstants;
+import org.apache.wss4j.dom.handler.WSHandlerConstants;
...
-import org.apache.ws.security.WSPasswordCallback;
+import org.apache.wss4j.common.ext.WSPasswordCallback;
&lt;/pre&gt;
&lt;p&gt;After getting everything upgraded, I continued developing services for the next couple weeks.&lt;/p&gt;
&lt;h3 id=&quot;spring-boot&quot;&gt;Spring Boot&lt;/h3&gt;
&lt;p&gt;In late July, I integrated Spring Boot. It was fairly straightforward and mostly consisted of adding/removing
    dependencies and removing versions already defined in Boot&apos;s starter-parent.
&lt;/p&gt;
&lt;pre class=&quot;brush: diff&quot;&gt;
+   &amp;lt;parent&amp;gt;
+      &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+      &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;
+      &amp;lt;version&amp;gt;1.1.4.RELEASE&amp;lt;/version&amp;gt;
+   &amp;lt;/parent&amp;gt;
...
       &amp;lt;cxf.version&amp;gt;3.0.1&amp;lt;/cxf.version&amp;gt;
+      &amp;lt;java.version&amp;gt;1.7&amp;lt;/java.version&amp;gt;
+      &amp;lt;servlet-api.version&amp;gt;3.1.0&amp;lt;/servlet-api.version&amp;gt;
       &amp;lt;spring.version&amp;gt;4.0.6.RELEASE&amp;lt;/spring.version&amp;gt;
...
-            &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
-            &amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
-            &amp;lt;configuration&amp;gt;
-               &amp;lt;source&amp;gt;1.7&amp;lt;/source&amp;gt;
-               &amp;lt;target&amp;gt;1.7&amp;lt;/target&amp;gt;
-            &amp;lt;/configuration&amp;gt;
-         &amp;lt;/plugin&amp;gt;
-         &amp;lt;plugin&amp;gt;
-            &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
             &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;/plugin&amp;gt;
+         &amp;lt;plugin&amp;gt;
+            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+            &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
+         &amp;lt;/plugin&amp;gt;
       &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;

    &amp;lt;dependencies&amp;gt;
+      &amp;lt;!-- spring boot --&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt;
+         &amp;lt;exclusions&amp;gt;
+            &amp;lt;exclusion&amp;gt;
+               &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+               &amp;lt;artifactId&amp;gt;spring-boot-starter-logging&amp;lt;/artifactId&amp;gt;
+            &amp;lt;/exclusion&amp;gt;
+         &amp;lt;/exclusions&amp;gt;
+      &amp;lt;/dependency&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-boot-starter-log4j&amp;lt;/artifactId&amp;gt;
+      &amp;lt;/dependency&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt;
+         &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
+      &amp;lt;/dependency&amp;gt;
+      &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
+      &amp;lt;/dependency&amp;gt;
       &amp;lt;!-- camel --&amp;gt;
...
-      &amp;lt;!-- upgrade camel-spring dependencies --&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
-      &amp;lt;/dependency&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;spring-aop&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
-      &amp;lt;/dependency&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
-      &amp;lt;/dependency&amp;gt;
...
-      &amp;lt;!-- logging --&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;1.7.6&amp;lt;/version&amp;gt;
-      &amp;lt;/dependency&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;1.7.6&amp;lt;/version&amp;gt;
-      &amp;lt;/dependency&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt;
-      &amp;lt;/dependency&amp;gt;
-
       &amp;lt;!-- utilities --&amp;gt;
       &amp;lt;dependency&amp;gt;
          &amp;lt;groupId&amp;gt;joda-time&amp;lt;/groupId&amp;gt;
          &amp;lt;artifactId&amp;gt;joda-time&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;
       &amp;lt;/dependency&amp;gt;
       &amp;lt;dependency&amp;gt;
          &amp;lt;groupId&amp;gt;commons-dbcp&amp;lt;/groupId&amp;gt;
          &amp;lt;artifactId&amp;gt;commons-dbcp&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;
...
       &amp;lt;!-- testing --&amp;gt;
       &amp;lt;dependency&amp;gt;
+         &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+         &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt;
+         &amp;lt;exclusions&amp;gt;
+            &amp;lt;exclusion&amp;gt;
+               &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
+               &amp;lt;artifactId&amp;gt;spring-boot-starter-logging&amp;lt;/artifactId&amp;gt;
+            &amp;lt;/exclusion&amp;gt;
+         &amp;lt;/exclusions&amp;gt;
+      &amp;lt;/dependency&amp;gt;
+      &amp;lt;dependency&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
-         &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
-      &amp;lt;/dependency&amp;gt;
-      &amp;lt;dependency&amp;gt;
-         &amp;lt;groupId&amp;gt;org.mockito&amp;lt;/groupId&amp;gt;
-         &amp;lt;artifactId&amp;gt;mockito-core&amp;lt;/artifactId&amp;gt;
-         &amp;lt;version&amp;gt;1.9.5&amp;lt;/version&amp;gt;
-         &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
-      &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, I deleted the &lt;code&gt;AppInitializer.java&lt;/code&gt; class I mentioned in
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel1&quot;&gt;Part II&lt;/a&gt; and added an
    &lt;code&gt;Application.java&lt;/code&gt; class.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.ErrorPage;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class})
@ComponentScan
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        CXFServlet servlet = new CXFServlet();
        return new ServletRegistrationBean(servlet, &quot;/api/*&quot;);
    }

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, &quot;/401.html&quot;);
                ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, &quot;/404.html&quot;);
                ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, &quot;/500.html&quot;);
                container.addErrorPages(error401Page, error404Page, error500Page);
            }
        };
    }
}
&lt;/pre&gt;
&lt;p&gt;
    The error pages you see configured above were configured and copied from Tim Sporcic&apos;s
    &lt;a href=&quot;http://sporcic.org/2014/05/custom-error-pages-with-spring-boot/&quot;&gt;Custom Error Pages with Spring Boot&lt;/a&gt;.
&lt;/p&gt;
&lt;h4 id=&quot;dynamic-datasources&quot;&gt;Dynamic DataSources&lt;/h4&gt;
&lt;p&gt;I excluded the DataSource-related AutoConfiguration classes because this application had many datasources.
It also had a requirement to allow datasources to be added on-the-fly by simply editing application.properties.
I &lt;a href=&quot;http://stackoverflow.com/questions/25160221/how-do-i-create-beans-programmatically-in-spring-boot/25160828&quot;&gt;
asked how to do this on Stack Overflow&lt;/a&gt; and received an &lt;a href=&quot;http://stackoverflow.com/a/25160828/65681&quot;&gt;excellent
    answer&lt;/a&gt; from &lt;a href=&quot;http://stackoverflow.com/users/613628/st%C3%A9phane-nicoll&quot;&gt;St&#233;phane Nicoll&lt;/a&gt;.
&lt;/p&gt;
&lt;h4 id=&quot;spring-boot-issues&quot;&gt;Spring Boot Issues&lt;/h4&gt;
&lt;p&gt;
    I did encounter a couple issues after integrating Spring Boot. The first was that &lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/1316&quot;&gt;
    it was removing the content-* headers for CXF responses&lt;/a&gt;. This only happened when running the WAR in Tomcat and I
    was able to figure out a workaround with a custom ResponseWrapper and Filter. This issue was fixed in Spring Boot 1.1.6.
&lt;/p&gt;
&lt;p&gt;The other issue was that the property override feature didn&apos;t seem to work when setting environment variables. The workaround
was to create a &lt;code&gt;setenv.sh&lt;/code&gt; script in $CATALINA_HOME/bin and add the environment variables there. See section 3.4
of &lt;a href=&quot;http://tomcat.apache.org/tomcat-7.0-doc/RUNNING.txt&quot;&gt;Tomcat 7&apos;s RUNNING.txt&lt;/a&gt; for more information.&lt;/p&gt;

&lt;h4 id=&quot;soap-faults&quot;&gt;SOAP Faults&lt;/h4&gt;
&lt;p&gt;
    After upgrading to Spring 4 and integrating Spring Boot, I continued migrating IBM Message Broker flows. My goal
    was to make all new services backward compatible, but I ran into an issue. With the new services, SOAP Faults were
    sent back to the client instead of error messages in a SOAP Message. I suggested we fix it with one of two ways:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Modify the client so it looks for SOAP Faults and handles them appropriately.&lt;/li&gt;
    &lt;li&gt;Modify the new services so messages are returned instead of faults.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For #2, I learned how do to &lt;a href=&quot;http://camel.465427.n5.nabble.com/Convert-from-Fault-to-Message-td5754465.html&quot;&gt;convert from a fault to messages&lt;/a&gt;
on the Camel user mailing list. However, the team opted to improve the client and we added fault handling there instead.&lt;/p&gt;


&lt;h3 id=&quot;microservices&quot;&gt;Microservice Deployment&lt;/h3&gt;
&lt;p&gt;When I first integrated Spring Boot, I was planning on splitting our project into a project-per-service.
    This would allow each service to evolve on its own, instead of having a monolithic war that contains all the services.
    In team discussions, there was some concern about the memory overhead of running multiple instances instead of one.
    &lt;/p&gt;
&lt;p&gt;
    I pointed out an &lt;a href=&quot;http://camel.465427.n5.nabble.com/one-context-or-multiple-contexts-td5754635.html&quot;&gt;interesting thread&lt;/a&gt;
    on the Camel mailing list about deploying routes with a route-per-jvm or all in the same JVM.
    The recommendation from that thread was to bundle similar routes together if you were to split them.&lt;/p&gt;
&lt;p&gt;In the end, we decided to allow our Operations team decide how they wanted to manage/deploy everything. I mentioned that
    Spring Boot can work with &lt;a href=&quot;http://spring.io/blog/2014/03/07/deploying-spring-boot-applications&quot;&gt;
        Tomcat, Jetty, JBoss and even cloud providers like Heroku and Cloud Foundry&lt;/a&gt;. I estimated that splitting the project
    apart would take less than a day, as would making it back into a monolithic WAR.
&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;This article explains how we upgraded our Apache Camel application to Spring 4 and integrated Spring Boot. There was
    a bit of pain getting things to work, but nothing a few pull requests and workarounds couldn&apos;t fix. We discovered
    some issues with setting environment variables for Tomcat and opted not to split our project into small microservices.
    Hopefully this article will help people trying to &lt;a href=&quot;http://stackoverflow.com/questions/25775418/camelize-a-spring-boot-application&quot;&gt;
        Camelize a Spring Boot application
    &lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;//raibledesigns.com/rd/entry/developing_services_with_apache_camel3&quot;&gt;next article&lt;/a&gt;, I&apos;ll talk about load testing with &lt;a href=&quot;http://gatling.io&quot;&gt;Gatling&lt;/a&gt;, logging with
    &lt;a href=&quot;http://www.infoq.com/news/2014/07/apache-log4j2&quot;&gt;Log4j2&lt;/a&gt; and monitoring with
    &lt;a href=&quot;http://hawt.io/&quot;&gt;hawtio&lt;/a&gt; and &lt;a href=&quot;http://newrelic.com/&quot;&gt;New Relic&lt;/a&gt;. &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel1</id>
        <title type="html">Developing Services with Apache Camel - Part II: Creating and Testing Routes</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/developing_services_with_apache_camel1"/>
        <published>2014-09-30T10:05:38-06:00</published>
        <updated>2014-10-15T19:00:16-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="junit" scheme="http://roller.apache.org/ns/tags/" />
        <category term="testing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tomcat" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apachecamel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="microservices" scheme="http://roller.apache.org/ns/tags/" />
        <category term="camel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jenkins" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    &lt;a href=&quot;http://camel.apache.org&quot;&gt;&lt;img src=&quot;http://camel.apache.org/images/camel-box-small.png&quot; height=&quot;150&quot;
                                           alt=&quot;Apache Camel&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
    This article is the second in a series on Apache Camel and how I used it to replace IBM Message Broker for a client.
    The first article, &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel&quot;&gt;
    Developing Services with Apache Camel - Part I: The Inspiration&lt;/a&gt;, describes why I chose Camel for this project.
&lt;/p&gt;

&lt;p&gt;

&lt;p&gt;To make sure these new services correctly replaced existing services, a 3-step approach was used:&lt;/p&gt;
&lt;ol class=&quot;task-list&quot;&gt;
    &lt;li&gt;Write an integration test pointing to the old service.&lt;/li&gt;
    &lt;li&gt;Write the implementation and a unit test to prove it works.&lt;/li&gt;
    &lt;li&gt;Write an integration test pointing to the new service.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
    I chose to start by replacing the simplest service first. It was a SOAP Service that talked to a database to
    retrieve
    a value based on an input parameter. To learn more about Camel and how it works, I started by looking at the
    &lt;a href=&quot;http://camel.apache.org/cxf-tomcat-example.html&quot;&gt;CXF Tomcat Example&lt;/a&gt;. I learned that
    Camel is used to provide &lt;em&gt;routing&lt;/em&gt; of requests. Using its &lt;a href=&quot;http://camel.apache.org/cxf.html&quot;&gt;CXF
    component&lt;/a&gt;, it can easily produce SOAP web service
    endpoints. An end point is simply an interface, and Camel takes care of producing the implementation.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    &lt;a href=&quot;http://camel.apache.org&quot;&gt;&lt;img src=&quot;http://camel.apache.org/images/camel-box-small.png&quot; height=&quot;150&quot;
                                           alt=&quot;Apache Camel&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
    This article is the second in a series on Apache Camel and how I used it to replace IBM Message Broker for a client.
    The first article, &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel&quot;&gt;
    Developing Services with Apache Camel - Part I: The Inspiration&lt;/a&gt;, describes why I chose Camel for this project.
&lt;/p&gt;

&lt;p&gt;

&lt;p&gt;To make sure these new services correctly replaced existing services, a 3-step approach was used:&lt;/p&gt;
&lt;ol class=&quot;task-list&quot;&gt;
    &lt;li&gt;Write an integration test pointing to the old service.&lt;/li&gt;
    &lt;li&gt;Write the implementation and a unit test to prove it works.&lt;/li&gt;
    &lt;li&gt;Write an integration test pointing to the new service.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
    I chose to start by replacing the simplest service first. It was a SOAP Service that talked to a database to
    retrieve
    a value based on an input parameter. To learn more about Camel and how it works, I started by looking at the
    &lt;a href=&quot;http://camel.apache.org/cxf-tomcat-example.html&quot;&gt;CXF Tomcat Example&lt;/a&gt;. I learned that
    Camel is used to provide &lt;em&gt;routing&lt;/em&gt; of requests. Using its &lt;a href=&quot;http://camel.apache.org/cxf.html&quot;&gt;CXF
    component&lt;/a&gt;, it can easily produce SOAP web service
    endpoints. An end point is simply an interface, and Camel takes care of producing the implementation.
&lt;/p&gt;

&lt;h3 id=&quot;legacy-integration-test&quot;&gt;Legacy Integration Test&lt;/h3&gt;

&lt;p&gt;I started by writing a &lt;code&gt;LegacyDrugServiceTests&lt;/code&gt; integration test for the old drug service.
    I tried two different ways of testing, using WSDL-generated Java classes, as well as using JAX-WS&apos;s SOAP API.
    Finding the WSDL for the legacy service was difficult because IBM Message Broker doesn&apos;t expose it when adding
    &quot;?wsdl&quot; to the service&apos;s URL. Instead, I had to dig through the project files until I found it. Then I
    used the &lt;a href=&quot;http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html&quot;&gt;cxf-codegen-plugin&lt;/a&gt;
    to generate the web service client. Below is what one of the tests looked like that uses the JAX-WS API.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Test
public void sendGPIRequestUsingSoapApi() throws Exception {
    SOAPElement bodyChildOne = getBody(message).addChildElement(&quot;gpiRequest&quot;, &quot;m&quot;);
    SOAPElement bodyChildTwo = bodyChildOne.addChildElement(&quot;args0&quot;, &quot;m&quot;);
    bodyChildTwo.addChildElement(&quot;NDC&quot;, &quot;ax22&quot;).addTextNode(&quot;54561237201&quot;);
    SOAPMessage reply = connection.call(message, getUrlWithTimeout(SERVICE_NAME));
    if (reply != null) {
        Iterator itr = reply.getSOAPBody().getChildElements();
        Map resultMap = TestUtils.getResults(itr);
        assertEquals(&quot;66100525123130&quot;, resultMap.get(&quot;GPI&quot;));
    }
}
&lt;/pre&gt;
&lt;h3 id=&quot;implementation&quot;&gt;Implementing the Drug Service&lt;/h3&gt;

&lt;p&gt;In the last article, I mentioned I wanted no XML in the project. To facilitate this, I used Camel&apos;s
    &lt;a href=&quot;http://camel.apache.org/java-dsl.html&quot;&gt;Java DSL&lt;/a&gt; to define routes and Spring&apos;s
    &lt;a href=&quot;http://docs.spring.io/spring/docs/4.0.6.RELEASE/spring-framework-reference/htmlsingle/#beans-java&quot;&gt;JavaConfig&lt;/a&gt;
    to configure dependencies.
&lt;/p&gt;

&lt;p&gt;The first route I wrote was one that looked up a GPI (Generic Product Identifier) by NDC (National Drug Code).&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@WebService
public interface DrugService {
    @WebMethod(operationName = &quot;gpiRequest&quot;)
    GpiResponse findGpiByNdc(GpiRequest request);
}
&lt;/pre&gt;
&lt;p&gt;
    To expose this as a web service endpoint with CXF, I needed to do two things:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Tell Spring how to configure CXF by importing &quot;classpath:META-INF/cxf/cxf.xml&quot; into a @Configuration class.&lt;/li&gt;
    &lt;li&gt;Configure CXF&apos;s Servlet so endpoints can be served up at a particular URL.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To satisfy item #1, I created a &lt;code&gt;CamelConfig&lt;/code&gt; class that extends &lt;a
        href=&quot;http://camel.apache.org/maven/camel-2.14.0/camel-spring-javaconfig/apidocs/org/apache/camel/spring/javaconfig/CamelConfiguration.html&quot;&gt;CamelConfiguration&lt;/a&gt;.
    This class allows Camel to be configured by Spring&apos;s JavaConfig. In it, I imported the CXF configuration, allowed
    tracing to be
    configured dynamically, and exposed my &lt;code&gt;application.properties&lt;/code&gt; to Camel. I also set it up (with &lt;code&gt;@ComponentScan&lt;/code&gt;)
    to look
    for Camel routes annotated with &lt;code&gt;@Component&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Configuration
@ImportResource(&quot;classpath:META-INF/cxf/cxf.xml&quot;)
@ComponentScan(&quot;com.raibledesigns.camel&quot;)
public class CamelConfig extends CamelConfiguration {
    @Value(&quot;${logging.trace.enabled}&quot;)
    private Boolean tracingEnabled;

    @Override
    protected void setupCamelContext(CamelContext camelContext) throws Exception {
        PropertiesComponent pc = new PropertiesComponent();
        pc.setLocation(&quot;classpath:application.properties&quot;);
        camelContext.addComponent(&quot;properties&quot;, pc);
        // see if trace logging is turned on
        if (tracingEnabled) {
            camelContext.setTracing(true);
        }
        super.setupCamelContext(camelContext);
    }

    @Bean
    public Tracer camelTracer() {
        Tracer tracer = new Tracer();
        tracer.setTraceExceptions(false);
        tracer.setTraceInterceptors(true);
        tracer.setLogName(&quot;com.raibledesigns.camel.trace&quot;);
        return tracer;
    }
}
&lt;/pre&gt;
&lt;p&gt;CXF has a servlet that&apos;s responsible for serving up its services at common path. To map CXF&apos;s servlet, I leveraged
    Spring&apos;s
    &lt;a href=&quot;http://docs.spring.io/autorepo/docs/spring-framework/4.0.x/javadoc-api/org/springframework/web/WebApplicationInitializer.html&quot;&gt;
        WebApplicationInitializer&lt;/a&gt; in an &lt;code&gt;AppInitializer&lt;/code&gt; class. I decided to serve up everything from a
    &lt;code&gt;/api/*&lt;/code&gt; base URL.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package com.raibledesigns.camel.config;

import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class AppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.addListener(new ContextLoaderListener(getContext()));
        ServletRegistration.Dynamic servlet = servletContext.addServlet(&quot;CXFServlet&quot;, new CXFServlet());
        servlet.setLoadOnStartup(1);
        servlet.setAsyncSupported(true);
        servlet.addMapping(&quot;/api/*&quot;);
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation(&quot;com.raibledesigns.camel.config&quot;);
        return context;
    }
}
&lt;/pre&gt;
&lt;p&gt;
    To implement this web service with Camel, I created a &lt;code&gt;DrugRoute&lt;/code&gt; class that extends Camel&apos;s
    &lt;code&gt;RouteBuilder&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Component
public class DrugRoute extends RouteBuilder {
    private String uri = &quot;cxf:/drugs?serviceClass=&quot; + DrugService.class.getName();

    @Override
    public void configure() throws Exception {
        from(uri)
            .recipientList(simple(&quot;direct:${header.operationName}&quot;));
        from(&quot;direct:gpiRequest&quot;).routeId(&quot;gpiRequest&quot;)
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    // get the ndc from the input
                    String ndc = exchange.getIn().getBody(GpiRequest.class).getNDC();
                    exchange.getOut().setBody(ndc);
                }
            })
            .to(&quot;sql:{{sql.selectGpi}}&quot;)
            .to(&quot;log:output&quot;)
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    // get the gpi from the input
                    List&amp;lt;HashMap&amp;gt; data = (ArrayList&amp;lt;HashMap&amp;gt;) exchange.getIn().getBody();
                    DrugInfo drug = new DrugInfo();
                    if (data.size() &amp;gt; 0) {
                        drug = new DrugInfo(String.valueOf(data.get(0).get(&quot;GPI&quot;)));
                    }
                    GpiResponse response = new GpiResponse(drug);
                    exchange.getOut().setBody(response);
                }
            });
    }
}
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;sql.selectGpi&lt;/code&gt; property is read from &lt;code&gt;src/main/resources/application.properties&lt;/code&gt; and looks
    as follows:&lt;/p&gt;
&lt;pre&gt;sql.selectGpi=select GPI from drugs where ndc = #?dataSource=ds.drugs&lt;/pre&gt;
&lt;p&gt;The &quot;ds.drugs&quot; reference is to a datasource that&apos;s created by Spring. From my
    &lt;code&gt;AppConfig&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Configuration
@PropertySource(&quot;classpath:application.properties&quot;)
public class AppConfig {

    @Value(&quot;${ds.driver.db2}&quot;)
    private String jdbcDriverDb2;

    @Value(&quot;${ds.password}&quot;)
    private String jdbcPassword;

    @Value(&quot;${ds.url}&quot;)
    private String jdbcUrl;

    @Value(&quot;${ds.username}&quot;)
    private String jdbcUsername;

    @Bean(name = &quot;ds.drugs&quot;)
    public DataSource drugsDataSource() {
        return createDataSource(jdbcDriverDb2, jdbcUsername, jdbcPassword, jdbcUrl);
    }

    private BasicDataSource createDataSource(String driver, String username, String password, String url) {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driver);
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setUrl(url);
        ds.setMaxActive(100);
        ds.setMaxWait(1000);
        ds.setPoolPreparedStatements(true);
        return ds;
    }
}
&lt;/pre&gt;

&lt;h3 id=&quot;unit-testing&quot;&gt;Unit Testing&lt;/h3&gt;

&lt;p&gt;
    The hardest part about unit testing this route was figuring out how to use Camel&apos;s
    &lt;a href=&quot;http://camel.apache.org/testing.html&quot;&gt;testing support&lt;/a&gt;. I posted
    &lt;a href=&quot;http://camel.465427.n5.nabble.com/Mocking-SQL-results-in-a-route-td5752169.html&quot;&gt;a question&lt;/a&gt; to the
    Camel users mailing list in early June. Based on advice received, I bought
    &lt;a href=&quot;http://www.manning.com/ibsen/&quot;&gt;Camel in Action&lt;/a&gt;, read chapter 6 on testing and went to work.
    I wanted to eliminate the dependency on a datasource, so I used Camel&apos;s
    &lt;a href=&quot;http://camel.apache.org/advicewith.html&quot;&gt;AdviceWith&lt;/a&gt; feature to modify my route and intercept the
    SQL call. This allowed me to return pre-defined results and verify everything worked.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = CamelSpringDelegatingTestContextLoader.class, classes = CamelConfig.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@UseAdviceWith
public class DrugRouteTests {

    @Autowired
    CamelContext camelContext;

    @Produce
    ProducerTemplate template;

    @EndpointInject(uri = &quot;mock:result&quot;)
    MockEndpoint result;

    static List&amp;lt;Map&amp;gt; results = new ArrayList&amp;lt;Map&amp;gt;() {{
        add(new HashMap&amp;lt;String, String&amp;gt;() {{
            put(&quot;GPI&quot;, &quot;123456789&quot;);
        }});
    }};

    @Before
    public void before() throws Exception {
        camelContext.setTracing(true);

        ModelCamelContext context = (ModelCamelContext) camelContext;
        RouteDefinition route = context.getRouteDefinition(&quot;gpiRequest&quot;);
        route.adviceWith(context, new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                interceptSendToEndpoint(&quot;sql:*&quot;).skipSendToOriginalEndpoint().process(new Processor() {
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        exchange.getOut().setBody(results);
                    }
                });
            }
        });
        route.to(result);
        camelContext.start();
    }

    @Test
    public void testMockSQLEndpoint() throws Exception {
        result.expectedMessageCount(1);
        GpiResponse expectedResult = new GpiResponse(new DrugInfo(&quot;123456789&quot;));
        result.allMessages().body().contains(expectedResult);

        GpiRequest request = new GpiRequest();
        request.setNDC(&quot;123&quot;);
        template.sendBody(&quot;direct:gpiRequest&quot;, request);

        MockEndpoint.assertIsSatisfied(camelContext);
    }
}
&lt;/pre&gt;
&lt;p&gt;
    I found AdviceWith to be extremely useful as I developed more routes and tests in this project. I used its
    &lt;a href=&quot;http://camel.apache.org/advicewith.html#AdviceWith-UsingweaveById&quot;&gt;weaveById&lt;/a&gt; feature to intercept
    calls to stored procedures, replace steps in my routes and remove steps I didn&apos;t want to test. For example,
    in one route, there was a complicated workflow to interact with a customer&apos;s data.
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Call a stored procedure in a remote database, which then inserts a record into a temp table.&lt;/li&gt;
    &lt;li&gt;Lookup that data using the value returned from the stored procedure.&lt;/li&gt;
    &lt;li&gt;Delete the record from the temp table.&lt;/li&gt;
    &lt;li&gt;Parse the data (as CSV) since the returned value is ~ delimited.&lt;/li&gt;
    &lt;li&gt;Convert the parsed data into objects, then do database inserts in a local database (if data doesn&apos;t exist).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To make matters worse, remote database access was restricted by IP address. This meant that, while developing, I
    couldn&apos;t
    even manually test from my local machine. To solve this, I used the following:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;code&gt;interceptSendToEndpoint(&quot;bean:*&quot;)&lt;/code&gt; to intercept the call to my stored procedure bean.&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;weaveById(&quot;myJdbcProcessor&quot;).before()&lt;/code&gt; to replace the temp table lookup with a CSV file.&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://code.google.com/p/mockito/&quot;&gt;Mockito&lt;/a&gt; to mock a JdbcTemplate that does the inserts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    To figure out how to configure and execute stored procedures in a route, I used the &lt;a
        href=&quot;https://github.com/quephird/camel-stored-procedure&quot;&gt;
    camel-store-procedure project on GitHub&lt;/a&gt;. Mockito&apos;s
    &lt;a href=&quot;http://docs.mockito.googlecode.com/hg/org/mockito/ArgumentCaptor.html&quot;&gt;ArgumentCaptor&lt;/a&gt; also became very
    useful
    when developing a route that called a 3rd-party web service within a route. James Carr has
    &lt;a href=&quot;http://blog.james-carr.org/2009/09/28/mockito-verifying-details-of-an-object-passed-to-a-collaborator/&quot;&gt;more
        information&lt;/a&gt;
    on how you might use this to verify values on an argument.
&lt;/p&gt;

&lt;p&gt;
    To see if my tests were hitting all aspects of the code, I integrated the
    &lt;a href=&quot;http://mojo.codehaus.org/cobertura-maven-plugin/&quot;&gt;cobertura-maven-plugin&lt;/a&gt; for code coverage
    reports (generated by running &lt;code&gt;mvn site&lt;/code&gt;).
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
        &amp;lt;plugin&amp;gt;
            &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;cobertura-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;instrumentation&amp;gt;
                    &amp;lt;excludes&amp;gt;
                        &amp;lt;exclude&amp;gt;**/model/*.class&amp;lt;/exclude&amp;gt;
                        &amp;lt;exclude&amp;gt;**/AppInitializer.class&amp;lt;/exclude&amp;gt;
                        &amp;lt;exclude&amp;gt;**/StoredProcedureBean.class&amp;lt;/exclude&amp;gt;
                        &amp;lt;exclude&amp;gt;**/SoapActionInterceptor.class&amp;lt;/exclude&amp;gt;
                    &amp;lt;/excludes&amp;gt;
                &amp;lt;/instrumentation&amp;gt;
                &amp;lt;check/&amp;gt;
            &amp;lt;/configuration&amp;gt;
            &amp;lt;version&amp;gt;2.6&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
...
&amp;lt;reporting&amp;gt;
    &amp;lt;plugins&amp;gt;
        &amp;lt;plugin&amp;gt;
            &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;cobertura-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.6&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;h3 id=&quot;integration-testing&quot;&gt;Integration Testing&lt;/h3&gt;

&lt;p&gt;
    Writing an integration test was fairly straightforward. I created a &lt;code&gt;DrugRouteITest&lt;/code&gt; class, a
    client using CXF&apos;s &lt;a href=&quot;https://cxf.apache.org/javadoc/latest/org/apache/cxf/jaxws/JaxWsProxyFactoryBean.html&quot;&gt;JaxWsProxyFactoryBean&lt;/a&gt;
    and called the method on the service.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public class DrugRouteITest {

    private static final String URL = &quot;http://localhost:8080/api/drugs&quot;;

    protected static DrugService createCXFClient() {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setBindingId(&quot;http://schemas.xmlsoap.org/wsdl/soap12/&quot;);
        factory.setServiceClass(DrugService.class);
        factory.setAddress(getTestUrl(URL));
        return (DrugService) factory.create();
    }

    @Test
    public void findGpiByNdc() throws Exception {
        // create input parameter
        GpiRequest input = new GpiRequest();
        input.setNDC(&quot;54561237201&quot;);

        // create the webservice client and send the request
        DrugService client = createCXFClient();
        GpiResponse response = client.findGpiByNdc(input);

        assertEquals(&quot;66100525123130&quot;, response.getDrugInfo().getGPI());
    }
}
&lt;/pre&gt;
&lt;p&gt;This integration test is only run after Tomcat has started and deployed the app. Unit tests are run by Maven&apos;s
    &lt;a href=&quot;http://maven.apache.org/surefire/maven-surefire-plugin/&quot;&gt;surefire-plugin&lt;/a&gt;, while integration tests are
    run by the &lt;a href=&quot;http://maven.apache.org/surefire/maven-failsafe-plugin/&quot;&gt;failsafe-plugin&lt;/a&gt;. An available
    Tomcat port is determined by the &lt;a href=&quot;http://mojo.codehaus.org/build-helper-maven-plugin/&quot;&gt;
        build-helper-maven-plugin&lt;/a&gt;. This port is set as a system property and read by the &lt;code&gt;getTestUrl()&lt;/code&gt;
    method call above.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public static String getTestUrl(String url) {
    if (System.getProperty(&quot;tomcat.http.port&quot;) != null) {
        url = url.replace(&quot;8080&quot;, System.getProperty(&quot;tomcat.http.port&quot;));
    }
    return url;
}
&lt;/pre&gt;
&lt;p&gt;Below are the relevant bits from
    &lt;code&gt;pom.xml&lt;/code&gt; that determines when to start/stop Tomcat, as well as which tests to run. &lt;/p&gt;

&lt;p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.tomcat.maven&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;tomcat7-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;path&amp;gt;/&amp;lt;/path&amp;gt;
    &amp;lt;/configuration&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;id&amp;gt;start-tomcat&amp;lt;/id&amp;gt;
            &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;fork&amp;gt;true&amp;lt;/fork&amp;gt;
                &amp;lt;port&amp;gt;${tomcat.http.port}&amp;lt;/port&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;id&amp;gt;stop-tomcat&amp;lt;/id&amp;gt;
            &amp;lt;phase&amp;gt;post-integration-test&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;shutdown&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.17&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;excludes&amp;gt;
            &amp;lt;exclude&amp;gt;**/*IT*.java&amp;lt;/exclude&amp;gt;
            &amp;lt;exclude&amp;gt;**/Legacy**.java&amp;lt;/exclude&amp;gt;
        &amp;lt;/excludes&amp;gt;
        &amp;lt;includes&amp;gt;
            &amp;lt;include&amp;gt;**/*Tests.java&amp;lt;/include&amp;gt;
            &amp;lt;include&amp;gt;**/*Test.java&amp;lt;/include&amp;gt;
        &amp;lt;/includes&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-failsafe-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.17&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;includes&amp;gt;
            &amp;lt;include&amp;gt;**/*IT*.java&amp;lt;/include&amp;gt;
        &amp;lt;/includes&amp;gt;
        &amp;lt;systemProperties&amp;gt;
            &amp;lt;tomcat.http.port&amp;gt;${tomcat.http.port}&amp;lt;/tomcat.http.port&amp;gt;
        &amp;lt;/systemProperties&amp;gt;
    &amp;lt;/configuration&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;integration-test&amp;lt;/goal&amp;gt;
                &amp;lt;goal&amp;gt;verify&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The most useful part of integration testing came when I copied one of my legacy tests into it and started verifying
    backwards compatibility. Since we wanted to replace existing services, and require no client changes, I had to make
    the XML request and response match. &lt;a href=&quot;http://www.charlesproxy.com&quot;&gt;Charles&lt;/a&gt; was very useful for this
    exercise,
    letting me inspect the request/response and tweak things to match. The following JAX-WS annotations allowed me to
    change the XML
    element names and achieve backward compatibility.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;code&gt;@BindingType(SOAPBinding.SOAP12HTTP_BINDING)&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;@WebResult(name = &quot;return&quot;, targetNamespace = &quot;...&quot;)&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;@ResponseWrapper(localName = &quot;gpiResponse&quot;)&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;@WebParam(name = &quot;args0&quot;, targetNamespace = &quot;...&quot;)&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;@XmlElement(name = &quot;...&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jenkins-and-continuous-deployment&quot;&gt;Continuous Integration and Deployment&lt;/h3&gt;

&lt;p&gt;My next item of business was configuring a job in &lt;a href=&quot;http://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt; to continually test
    and deploy. Getting all the tests to pass was easy, and deploying to Tomcat was simple enough thanks to the
    &lt;a href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin&quot;&gt;Deploy Plugin&lt;/a&gt; and
    &lt;a href=&quot;http://paxcel.net/blog/automation-of-warear-deployment-using-jenkins/&quot;&gt;this article&lt;/a&gt;. However, after a
    few deploys, Tomcat would throw OutOfMemory exceptions. Therefore, I ended up creating a second &quot;deploy&quot; job that
    stops Tomcat, copies the successfully-built WAR to $CATALINA_HOME/webapps, removes $CATALINA_HOME/webapps/ROOT and
    restarts Tomcat. I used Jenkins &quot;Execute shell&quot; feature to configure these three steps.
    I was pleased to find my &lt;a
            href=&quot;http://raibledesigns.com/tomcat/boot-howto.html&quot;&gt;&lt;code&gt;/etc/init.d/tomcat&lt;/code&gt;&lt;/a&gt;
    script still worked for starting Tomcat at boot time and providing convenient start/stop commands.
&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;
    This article shows you how I implemented and tested a simple Apache Camel route. The route described
    only does a simple database lookup, but you can see how Camel&apos;s testing support allows you to mock results and concentrate
    on developing your route logic. I found its testing framework very useful and not well documented, so hopefully this
    article helps to fix that. In the &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel2&quot;&gt;next article&lt;/a&gt;, I&apos;ll talk about upgrading to Spring 4, integrating Spring Boot and
    our team&apos;s microservice deployment discussions.
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel</id>
        <title type="html">Developing Services with Apache Camel - Part I: The Inspiration</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/developing_services_with_apache_camel"/>
        <published>2014-09-23T10:58:25-06:00</published>
        <updated>2014-09-30T16:06:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="apachecamel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="camel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="soap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="microservices" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibmmessagebroker" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    In early May, my client asked me to work on a project migrating from IBM Message Broker 6.1 to an open source
    solution. Their reason was simple, the IBM solution was end of life and outdated. To prove how out of date it was,
    the Windows version required Windows XP to run. IBM WebSphere Message Broker
    has been replaced by &lt;a href=&quot;http://www-03.ibm.com/software/products/en/ibm-integration-bus&quot;&gt;
        IBM Integration Bus&lt;/a&gt; in recent years, but no upgrade path existed.
&lt;/p&gt;

&lt;p&gt;At first, I didn&apos;t want to do the project. I was hired as a Modern Java/UI Architect and I had enjoyed my first
    month upgrading libraries, making recommendations and doing a bit of UI performance work. I hadn&apos;t done much with
    ESBs and I enjoy front-end development a lot more than backend. It took me a couple days to realize they
    were willing to &lt;em&gt;pay me to learn&lt;/em&gt;. That&apos;s when I decided to clutch up, learn how to do it all, and get the job done.
    This article is the first in a series on what I learned during this migration project.
&lt;/p&gt;

&lt;p&gt;
    My approach for figuring out how everything worked was similar to working on any new application. I get the source
    code, install the software necessary to run it, and run it locally so I can interact with it.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    In early May, my client asked me to work on a project migrating from IBM Message Broker 6.1 to an open source
    solution. Their reason was simple, the IBM solution was end of life and outdated. To prove how out of date it was,
    the Windows version required Windows XP to run. IBM WebSphere Message Broker
    has been replaced by &lt;a href=&quot;http://www-03.ibm.com/software/products/en/ibm-integration-bus&quot;&gt;
        IBM Integration Bus&lt;/a&gt; in recent years, but no upgrade path existed.
&lt;/p&gt;

&lt;p&gt;At first, I didn&apos;t want to do the project. I was hired as a Modern Java/UI Architect and I had enjoyed my first
    month upgrading libraries, making recommendations and doing a bit of UI performance work. I hadn&apos;t done much with
    ESBs and I enjoy front-end development a lot more than backend. It took me a couple days to realize they
    were willing to &lt;em&gt;pay me to learn&lt;/em&gt;. That&apos;s when I decided to clutch up, learn how to do it all, and get the job done.
    This article is the first in a series on what I learned during this migration project.
&lt;/p&gt;

&lt;p&gt;
    My approach for figuring out how everything worked was similar to working on any new application. I get the source
    code, install the software necessary to run it, and run it locally so I can interact with it.
&lt;/p&gt;

&lt;h3 id=&quot;installing-ibm-message-broker&quot;&gt;Installing IBM Message Broker&lt;/h3&gt;

&lt;p&gt;The hardest part about installing IBM Message Broker 6.1 was getting the bits to do so. I installed Windows XP in a
    Parallels VM on my Mac, installed Java 7 and
    started downloading the install files from my client&apos;s server. The files consisted of the following, which I used to
    install the server, WebSphere Message Broker Toolkit (Eclipse-based), and some plugins we were using.&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
    &lt;li&gt;IBM_Broker_Install_Disks.zip&lt;/li&gt;
    &lt;li&gt;IBM_plugins.zip&lt;/li&gt;
    &lt;li&gt;IBM_Upgrade_6.1.06.zip&lt;/li&gt;
    &lt;li&gt;MessageBrokerInstallFiles.7z&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Transferring these files to my laptop took &lt;i&gt;hours&lt;/i&gt; over scp. Installing and getting everything to work correctly
    took &lt;i&gt;days&lt;/i&gt;. Much of this time was spent setting up various ODBC data sources, SMTP servers and figuring out
    how to
    run a &quot;message flow test&quot; to verify things were working. Before I started working with my client&apos;s project, I read
    Magnus Palm&#233;r&apos;s &lt;a href=&quot;https://github.com/magnuspalmer/wmbtesting/wiki/Article-about-testing-WMB&quot;&gt;article about
        testing WMB&lt;/a&gt;.
    It was very helpful and I was able to run his project and its tests against my local server.
&lt;/p&gt;

&lt;h3 id=&quot;choosing-an-open-source-solution&quot;&gt;Choosing an Open Source Solution&lt;/h3&gt;

&lt;p&gt;When searching for how one might migrate from IBM Message Broker to an open source solution, I stumbled upon &lt;a
        href=&quot;https://github.com/cnaphan/osler-mb/blob/master/README.md#alternative-implementations&quot;&gt;this article&lt;/a&gt;:
&lt;/p&gt;

&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;&lt;strong&gt;Use an Open Source Broker&lt;/strong&gt;&lt;br&gt;

        Refer to my report for details on Mule ESB and Fuse ESB. If I had to pick right now, I&apos;d use Fuse, as we already
        use Apache ActiveMQ and Apache CXF, so why not add another Apache-based product? Fuse also has a much higher install
        base. Mule seems perfectly acceptable, too, though. I would use the simplified routing scheme described in the
        section above and deploy either Mule or Fuse onto the same server as PFM. Mule/Fuse do not have dependencies on
        a queue manager like IBM Message Broker does, so there&apos;s less overhead. You can also re-use the XSLs from Message
        Broker.
    &lt;/p&gt;

    &lt;p style=&quot;margin-bottom: 0&quot;&gt;
        I think that if you really understood the IBM Message Broker implementation and were comfortable with Active MQ,
        SOAP, etc... you could have Mule or Fuse implemented in about 2 weeks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The last sentence inspired me to take a look at Fuse. I knew James Strachan was behind the project, so I shot him an
    email in early May:
&lt;/p&gt;

&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;Hey James,
    &lt;/p&gt;
    &lt;p&gt;It&apos;s been a while - hope you&apos;re doing well. I recently started working for a client that has a ton of legacy
        frameworks and servers. They basically haven&apos;t updated anything for 10 years, since the application was originally
        created by an outsourced company. They&apos;re using Acegi 1.0 for crying out loud!
    &lt;/p&gt;&lt;p&gt;
    One of the components they have in their system is IBM Message Broker - or maybe it&apos;s called WebSphere ESB - I&apos;m not
    sure. If I succeed in getting it installed, I&apos;m hoping to somehow install the &quot;services&quot; they have configured, which
    seem to consist of .bar, .esql and .msgflow files. From what I can tell, these seem to be ESB-related, but they
    might be proprietary as well. I don&apos;t have any experience with ESBs, so I&apos;m pretty much fumbling in the dark.
&lt;/p&gt;&lt;p&gt;
    I found the following information online:
&lt;/p&gt;&lt;p&gt;
    https://github.com/cnaphan/osler-mb/blob/master/README.md#alternative-implementations
&lt;/p&gt;&lt;p&gt;
    Under Alternative Implementations:
&lt;/p&gt;&lt;p&gt;
    &amp;lt;quote&gt;&lt;br/&gt;
    Use an Open Source Broker&lt;br/&gt;
    ...&lt;br/&gt;
    &lt;strong&gt;I think that if you really understood the IBM Message Broker implementation and were comfortable with Active
        MQ, SOAP, etc... you could have Mule or Fuse implemented in about 2 weeks.&lt;/strong&gt;&lt;br/&gt;
    &amp;lt;/quote&gt;
&lt;/p&gt;&lt;p&gt;
    Emphasis of the last sentence is mine. So I&apos;m trying to make this happen and migrate from IBM Message Broker to
    Fuse. I&apos;ve downloaded JBoss Fuse 6.1,
    installed it and got it running.
&lt;/p&gt;&lt;p&gt;
    Do you know of any guides or articles about migrating from IBM Message Broker to Fuse?
&lt;/p&gt;&lt;p&gt;
    Thanks,
&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0&quot;&gt;
    Matt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;James took a couple days to reply, but when he did it was packed with the advice I was hoping for.&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;
        I&apos;ll ask around to see. TBH the easiest thing really is to just start using Apache Camel for this kinda stuff; its a
        simple Java library that you can use in any application server. Then make sure you use the hawtio console (which
        lets you view/edit/trace/debug camel routes in your browser via a nice HTML5 / AngularJS application).
    &lt;a href=&quot;http://hawt.io/&quot;&gt;http://hawt.io/&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
    JBoss Fuse 6.1 is cool and all though; its based on OSGi which some folks love and some hate. The class loader /
    application server doesn&apos;t really matter to Camel though; use whatever you want (tomcat / jetty / wildfly / karaf /
    stand alone java applications etc).
&lt;/p&gt;&lt;p&gt;
    Fuse 6.1 is based on a bunch of apache projects plus an upstream open source project called &apos;fabric8&apos; which deals
    with provisioning, management, discovery and so forth (i.e. scaling 1 camel route in 1 JVM to many JVMs etc).
    &lt;a href=&quot;http://fabric8.io/&quot;&gt;http://fabric8.io/&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
    The 1.1.x version of fabric8 supports a &quot;Java Container&quot;; i.e. a static flat classpath. For folks who&apos;ve not done
    OSGi before (or folks who hate OSGi) I kinda recommend folks not start using OSGi yet - but just start with camel;
    otherwise it can seem like too much to learn and the OSGi class loading / metadata stuff can kinda get in the way
    and slow you down. I did a little demo &amp; blog about using 1.1.0.Beta5 of fabric8 (1.1.x of fabric8 will make it into
    a future JBoss Fuse product release).
    &lt;a href=&quot;http://macstrac.blogspot.co.uk/2014/05/micro-services-with-fabric8.html&quot;&gt;http://macstrac.blogspot.co.uk/2014/05/micro-services-with-fabric8.html&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
    TL;DR; - play with Apache Camel, it&apos;ll solve easily all your integration needs; its got a much bigger &amp; more active
    community than Mule and unlike Mule - its all open source; there&apos;s no locked down, non-open source
    connectors/magic/tools or proprietary software included. Once you&apos;ve got your build &amp; tests working fine; ponder
    which kinda container you wanna use in production (an app server or micro services) - it doesn&apos;t matter too much
    which one. We&apos;re working hard on making all our production/testing management/monitoring/diagnostics/debugging
    tooling work on all containers/app servers anyway (stand alone Java processes via the Java Container, Docker, OSGI
    (via Karaf like Fuse 6.1), Tomcat, TomEE and Wildfly).
&lt;/p&gt;&lt;p&gt;
    Though if you need 24x7 production support like now, definitely use the JBoss Fuse 6.1 distro &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt; If you can wait
    until later in the year for production support; I&apos;d stick with the fabric8 1.1.x stuff for Java Containers; its
    simpler &amp; more agile for you go get things sorted.
&lt;/p&gt;&lt;p&gt;
    Here&apos;s a little demo of the UI tooling btw
    &lt;a href=&quot;https://vimeo.com/album/2635012/video/84674508&quot;&gt;https://vimeo.com/album/2635012/video/84674508&lt;/a&gt;
&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0&quot;&gt;
    It&apos;s using the Fuse distro in the demo; but really the hawtio console is doing all the heavy lifting &amp; is available
    in any JVM thats got a jolokia agent running (and you can use the hawtio Chrome Plugin too). It hopefully will give
    you a feel for the UI tooling working with camel routes; debugging/tracing them, grokking their metrics and stuff.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After reading James&apos; email, I forwarded it to my client with my recommendation that we start with &lt;a href=&quot;http://camel.apache.org&quot;&gt;Apache Camel&lt;/a&gt;. He
    agreed it was a good approach and I went to work.&lt;/p&gt;

&lt;h3 id=&quot;dev-strategy&quot;&gt;Development Strategy&lt;/h3&gt;
&lt;p&gt;
    On May 21st, I subscribed to the Apache Camel users mailing list and posted &lt;a
        href=&quot;http://camel.465427.n5.nabble.com/Email-Error-on-Route-Exception-td5751479.html&quot;&gt;my first question&lt;/a&gt; the
    next day. My development strategy was the following:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Write an integration test against the existing service.&lt;/li&gt;
    &lt;li&gt;Implement the service with Camel, writing unit tests as I progressed.&lt;/li&gt;
    &lt;li&gt;Copy the logic from step 1&apos;s integration test and use it for the new service&apos;s integration tests.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I created the project with a &lt;a href=&quot;http://camel.apache.org/camel-maven-archetypes.html&quot;&gt;Camel Archetype&lt;/a&gt; and
    used Java 7 as the minimum JDK. I decided I wanted no XML in the project (aside from pom.xml) and that I&apos;d use Camel&apos;s
    &lt;a href=&quot;http://camel.apache.org/java-dsl.html&quot;&gt;Java DSL&lt;/a&gt; to develop my routes.
&lt;/p&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;
    When I first started migrating from IBM Message Broker to an open source solution, I was a bit overwhelmed with the seemingly
    daunting task. I quickly discovered that Apache Camel was a good replacement and started developing my first route.
    It took me a couple days to get things working, but I learned a lot in the process - especially around testing. In the &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel1&quot;&gt;next article&lt;/a&gt;, I&apos;ll
    talk about how I wrote tests, mocked 3rd party dependencies and configured everything to run in Jenkins. Stay tuned!
&lt;/p&gt;
&lt;p&gt;Related: I &lt;a href=&quot;http://raibledesigns.com/rd/entry/taking_apache_camel_for_a&quot;&gt;first learned about Apache Camel from Bruce
    Snyder in 2008&lt;/a&gt; at Colorado Software Summit.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea</id>
        <title type="html">Why I prefer IntelliJ IDEA over Eclipse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea"/>
        <published>2014-07-21T13:33:55-06:00</published>
        <updated>2014-11-06T20:03:50-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <category term="intellij" scheme="http://roller.apache.org/ns/tags/" />
        <category term="idea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="eclipse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;Over the last couple months, I&apos;ve received a few emails asking why I prefer &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt; over &lt;a href=&quot;https://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt;. They usually go something like this:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I keep seeing you recommending IntelliJ. I keep trying it intermittently with using Eclipse, but I feel like I&apos;m missing something obvious that makes so many people think it&apos;s better. 
Granted having the usual plugins incorporated is nice, but other things like the build process and debugger sometimes seems a step back from Eclipse. Could you please blog a &apos;10 reasons why I love IntelliJ&apos; or point me to something that would clue me in?
&lt;/p&gt;
&lt;p&gt;
I grew to love IntelliJ for a few reasons. It all started in 2006 when I decided to migrate &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; from Ant to Maven. Before that, I was a huge Eclipse fan (2002 - 2006). Before Eclipse, I used HomeSite, an HTML Editor to write all my Java code (1999-2002). Eclipse was the first IDE that didn&apos;t hog all my system&apos;s memory and was pleasant to work with.
&lt;/p&gt;
&lt;p&gt;
The reason I started using IntelliJ in 2006 was because of it&apos;s multi-module Maven support. Eclipse&apos;s Maven support was terrible, and m2e hasn&apos;t gotten a whole lot better in recent years AFAIK. 
&lt;/p&gt;
&lt;p&gt;
Back then, I used to think everything should be built and run from the command line. A couple years later, I realized it was better to run tests and debug from an IDE. Now I&apos;m more concerned with the ability to run tests and debug in an IDE than I am from the build system.
&lt;/p&gt;
&lt;p&gt;
In 2009, I started doing a lot more front-end work: writing HTML, CSS and JavaScript. I also started digging into alternate languages for these: Jade, GWT, CoffeeScript, LESS, SASS - even Scala. I found IntelliJ&apos;s support, and plugins, to be outstanding for these languages and really enjoyed how it would tell me I had invalid JavaScript, HTML and CSS. 
&lt;/p&gt;
&lt;p&gt;
My original passion in software was HTML and JavaScript and I found that hasn&apos;t changed in the last 15 years. AFAIK, Eclipse still has terrible web tools support; it excels at Java (and possibly C++ support). Even today, I write most of my HTML code (&lt;a href=&quot;http://www.infoq.com/author/Matt-Raible&quot;&gt;for InfoQ&lt;/a&gt; and this blog) in IntelliJ.
&lt;/p&gt;
&lt;p&gt;
In reality, it probably doesn&apos;t matter which IDE you use, as long as you&apos;re productive with it. Once you learn one IDE well, the way others do things will likely seem backwards. I&apos;m so familiar with debugging in IntelliJ, that when I tried to use Eclipse&apos;s debugger a few weeks ago, it seemed backwards to me. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In a nutshell: the technologies I&apos;ve worked with have been better embraced by IntelliJ. Has this happened to you? Have certain technologies caused you to use one IDE over another?&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/documenting_your_spring_api_with</id>
        <title type="html">Documenting your Spring API with Swagger</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/documenting_your_spring_api_with"/>
        <published>2014-03-25T13:07:18-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="swagger" scheme="http://roller.apache.org/ns/tags/" />
        <category term="swagger-springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    Over the last several months, I&apos;ve been developing a &lt;a href=&quot;http://www.infoq.com/articles/webber-rest-workflow&quot;&gt;
    REST&lt;/a&gt; API using &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;.
    My client hired an outside company
    to develop a native iOS app, and my development team was responsible for developing its API. Our main task involved
    integrating with &lt;a href=&quot;http://www.epic.com/&quot;&gt;Epic&lt;/a&gt;, a popular software system used in Health care. We also
    developed a &lt;a href=&quot;https://www.atlassian.com/software/crowd/overview&quot;&gt;Crowd&lt;/a&gt;-backed authentication system,
    based loosely on &lt;a href=&quot;https://github.com/philipsorst/angular-rest-springsecurity&quot;&gt;Philip Sorst&apos;s Angular
    REST Security&lt;/a&gt;.

&lt;/p&gt;

&lt;p&gt;To document our API, we used &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;Spring MVC integration for
    Swagger&lt;/a&gt; (a.k.a. swagger-springmvc). I briefly looked into &lt;a
        href=&quot;https://github.com/wkennedy/swagger4spring-web&quot;&gt;swagger4spring-web&lt;/a&gt;,
    but gave up quickly when it didn&apos;t recognize Spring&apos;s @RestController. We started with swagger-springmvc 0.6.5 and
    found it fairly easy to integrate. Unfortunately, it didn&apos;t allow us to annotate our model objects and tell clients
    which fields were required. We were quite pleased when a new version (0.8.2) was released that supports Swagger 1.3
    and its @ApiModelProperty.
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;strong&gt;What is Swagger?&lt;/strong&gt;&lt;br/&gt;
    The goal of &lt;a href=&quot;https://helloreverb.com/developers/swagger&quot;&gt;Swagger&lt;/a&gt; is to define a standard, language-agnostic interface to REST APIs which allows both humans and
    computers to discover and understand the capabilities of the service without access to source code, documentation,
    or through network traffic inspection.
&lt;/blockquote&gt;
&lt;p&gt;
    To demonstrate how Swagger works, I integrated it into Josh Long&apos;s
    &lt;a href=&quot;https://github.com/joshlong/boot-examples/tree/master/x-auth-security&quot;&gt;x-auth-security&lt;/a&gt; project. If you
    have a Boot-powered project, you should be able to use the same steps.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    Over the last several months, I&apos;ve been developing a &lt;a href=&quot;http://www.infoq.com/articles/webber-rest-workflow&quot;&gt;
    REST&lt;/a&gt; API using &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;.
    My client hired an outside company
    to develop a native iOS app, and my development team was responsible for developing its API. Our main task involved
    integrating with &lt;a href=&quot;http://www.epic.com/&quot;&gt;Epic&lt;/a&gt;, a popular software system used in Health care. We also
    developed a &lt;a href=&quot;https://www.atlassian.com/software/crowd/overview&quot;&gt;Crowd&lt;/a&gt;-backed authentication system,
    based loosely on &lt;a href=&quot;https://github.com/philipsorst/angular-rest-springsecurity&quot;&gt;Philip Sorst&apos;s Angular
    REST Security&lt;/a&gt;.

&lt;/p&gt;

&lt;p&gt;To document our API, we used &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;Spring MVC integration for
    Swagger&lt;/a&gt; (a.k.a. swagger-springmvc). I briefly looked into &lt;a
        href=&quot;https://github.com/wkennedy/swagger4spring-web&quot;&gt;swagger4spring-web&lt;/a&gt;,
    but gave up quickly when it didn&apos;t recognize Spring&apos;s @RestController. We started with swagger-springmvc 0.6.5 and
    found it fairly easy to integrate. Unfortunately, it didn&apos;t allow us to annotate our model objects and tell clients
    which fields were required. We were quite pleased when a new version (0.8.2) was released that supports Swagger 1.3
    and its @ApiModelProperty.
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;strong&gt;What is Swagger?&lt;/strong&gt;&lt;br/&gt;
    The goal of &lt;a href=&quot;https://helloreverb.com/developers/swagger&quot;&gt;Swagger&lt;/a&gt; is to define a standard, language-agnostic interface to REST APIs which allows both humans and
    computers to discover and understand the capabilities of the service without access to source code, documentation,
    or through network traffic inspection.
&lt;/blockquote&gt;
&lt;p&gt;
    To demonstrate how Swagger works, I integrated it into Josh Long&apos;s
    &lt;a href=&quot;https://github.com/joshlong/boot-examples/tree/master/x-auth-security&quot;&gt;x-auth-security&lt;/a&gt; project. If you
    have a Boot-powered project, you should be able to use the same steps.
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;1. Add swagger-springmvc dependency to your project.&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.mangofactory&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;swagger-springmvc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.8.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Note: on my client&apos;s project, we had to exclude &quot;org.slf4j:slf4j-log4j12&quot; and add &quot;jackson-module-scala_2.10:2.3.1&quot;
    as a dependency. I did not need to do either of these in this project.
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;2. Add a SwaggerConfig class to configure Swagger.&lt;/strong&gt;

&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;swagger-springmvc documentation&lt;/a&gt; has an example of
    this
    with a bit more XML.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package example.config;

import com.mangofactory.swagger.configuration.JacksonScalaSupport;
import com.mangofactory.swagger.configuration.SpringSwaggerConfig;
import com.mangofactory.swagger.configuration.SpringSwaggerModelConfig;
import com.mangofactory.swagger.configuration.SwaggerGlobalSettings;
import com.mangofactory.swagger.core.DefaultSwaggerPathProvider;
import com.mangofactory.swagger.core.SwaggerApiResourceListing;
import com.mangofactory.swagger.core.SwaggerPathProvider;
import com.mangofactory.swagger.scanners.ApiListingReferenceScanner;
import com.wordnik.swagger.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

@Configuration
@ComponentScan(basePackages = &quot;com.mangofactory.swagger&quot;)
public class SwaggerConfig {

    public static final List&amp;lt;String&amp;gt; DEFAULT_INCLUDE_PATTERNS = Arrays.asList(&quot;/news/.*&quot;);
    public static final String SWAGGER_GROUP = &quot;mobile-api&quot;;

    @Value(&quot;${app.docs}&quot;)
    private String docsLocation;

    @Autowired
    private SpringSwaggerConfig springSwaggerConfig;
    @Autowired
    private SpringSwaggerModelConfig springSwaggerModelConfig;

    /**
     * Adds the jackson scala module to the MappingJackson2HttpMessageConverter registered with spring
     * Swagger core models are scala so we need to be able to convert to JSON
     * Also registers some custom serializers needed to transform swagger models to swagger-ui required json format
     */
    @Bean
    public JacksonScalaSupport jacksonScalaSupport() {
        JacksonScalaSupport jacksonScalaSupport = new JacksonScalaSupport();
        //Set to false to disable
        jacksonScalaSupport.setRegisterScalaModule(true);
        return jacksonScalaSupport;
    }


    /**
     * Global swagger settings
     */
    @Bean
    public SwaggerGlobalSettings swaggerGlobalSettings() {
        SwaggerGlobalSettings swaggerGlobalSettings = new SwaggerGlobalSettings();
        swaggerGlobalSettings.setGlobalResponseMessages(springSwaggerConfig.defaultResponseMessages());
        swaggerGlobalSettings.setIgnorableParameterTypes(springSwaggerConfig.defaultIgnorableParameterTypes());
        swaggerGlobalSettings.setParameterDataTypes(springSwaggerModelConfig.defaultParameterDataTypes());
        return swaggerGlobalSettings;
    }

    /**
     * API Info as it appears on the swagger-ui page
     */
    private ApiInfo apiInfo() {
        ApiInfo apiInfo = new ApiInfo(
                &quot;News API&quot;,
                &quot;Mobile applications and beyond!&quot;,
                &quot;https://helloreverb.com/terms/&quot;,
                &quot;matt@raibledesigns.com&quot;,
                &quot;Apache 2.0&quot;,
                &quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;
        );
        return apiInfo;
    }

    /**
     * Configure a SwaggerApiResourceListing for each swagger instance within your app. e.g. 1. private  2. external apis
     * Required to be a spring bean as spring will call the postConstruct method to bootstrap swagger scanning.
     *
     * @return
     */
    @Bean
    public SwaggerApiResourceListing swaggerApiResourceListing() {
        //The group name is important and should match the group set on ApiListingReferenceScanner
        //Note that swaggerCache() is by DefaultSwaggerController to serve the swagger json
        SwaggerApiResourceListing swaggerApiResourceListing = new SwaggerApiResourceListing(springSwaggerConfig.swaggerCache(), SWAGGER_GROUP);

        //Set the required swagger settings
        swaggerApiResourceListing.setSwaggerGlobalSettings(swaggerGlobalSettings());

        //Use a custom path provider or springSwaggerConfig.defaultSwaggerPathProvider()
        swaggerApiResourceListing.setSwaggerPathProvider(apiPathProvider());

        //Supply the API Info as it should appear on swagger-ui web page
        swaggerApiResourceListing.setApiInfo(apiInfo());

        //Global authorization - see the swagger documentation
        swaggerApiResourceListing.setAuthorizationTypes(authorizationTypes());

        //Every SwaggerApiResourceListing needs an ApiListingReferenceScanner to scan the spring request mappings
        swaggerApiResourceListing.setApiListingReferenceScanner(apiListingReferenceScanner());
        return swaggerApiResourceListing;
    }

    @Bean
    /**
     * The ApiListingReferenceScanner does most of the work.
     * Scans the appropriate spring RequestMappingHandlerMappings
     * Applies the correct absolute paths to the generated swagger resources
     */
    public ApiListingReferenceScanner apiListingReferenceScanner() {
        ApiListingReferenceScanner apiListingReferenceScanner = new ApiListingReferenceScanner();

        //Picks up all of the registered spring RequestMappingHandlerMappings for scanning
        apiListingReferenceScanner.setRequestMappingHandlerMapping(springSwaggerConfig.swaggerRequestMappingHandlerMappings());

        //Excludes any controllers with the supplied annotations
        apiListingReferenceScanner.setExcludeAnnotations(springSwaggerConfig.defaultExcludeAnnotations());

        //
        apiListingReferenceScanner.setResourceGroupingStrategy(springSwaggerConfig.defaultResourceGroupingStrategy());

        //Path provider used to generate the appropriate uri&apos;s
        apiListingReferenceScanner.setSwaggerPathProvider(apiPathProvider());

        //Must match the swagger group set on the SwaggerApiResourceListing
        apiListingReferenceScanner.setSwaggerGroup(SWAGGER_GROUP);

        //Only include paths that match the supplied regular expressions
        apiListingReferenceScanner.setIncludePatterns(DEFAULT_INCLUDE_PATTERNS);

        return apiListingReferenceScanner;
    }

    /**
     * Example of a custom path provider
     */
    @Bean
    public ApiPathProvider apiPathProvider() {
        ApiPathProvider apiPathProvider = new ApiPathProvider(docsLocation);
        apiPathProvider.setDefaultSwaggerPathProvider(springSwaggerConfig.defaultSwaggerPathProvider());
        return apiPathProvider;
    }


    private List&amp;lt;AuthorizationType&amp;gt; authorizationTypes() {
        ArrayList&amp;lt;AuthorizationType&amp;gt; authorizationTypes = new ArrayList&amp;lt;&amp;gt;();

        List&amp;lt;AuthorizationScope&amp;gt; authorizationScopeList = newArrayList();
        authorizationScopeList.add(new AuthorizationScope(&quot;global&quot;, &quot;access all&quot;));

        List&amp;lt;GrantType&amp;gt; grantTypes = newArrayList();

        LoginEndpoint loginEndpoint = new LoginEndpoint(apiPathProvider().getAppBasePath() + &quot;/user/authenticate&quot;);
        grantTypes.add(new ImplicitGrant(loginEndpoint, &quot;access_token&quot;));

        return authorizationTypes;
    }

    @Bean
    public SwaggerPathProvider relativeSwaggerPathProvider() {
        return new ApiRelativeSwaggerPathProvider();
    }

    private class ApiRelativeSwaggerPathProvider extends DefaultSwaggerPathProvider {
        @Override
        public String getAppBasePath() {
            return &quot;/&quot;;
        }

        @Override
        public String getSwaggerDocumentationBasePath() {
            return &quot;/api-docs&quot;;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;ApiPathProvider&lt;/code&gt; class referenced above is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package example.config;

import com.mangofactory.swagger.core.SwaggerPathProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.util.UriComponentsBuilder;

import javax.servlet.ServletContext;

public class ApiPathProvider implements SwaggerPathProvider {
    private SwaggerPathProvider defaultSwaggerPathProvider;
    @Autowired
    private ServletContext servletContext;

    private String docsLocation;

    public ApiPathProvider(String docsLocation) {
        this.docsLocation = docsLocation;
    }

    @Override
    public String getApiResourcePrefix() {
        return defaultSwaggerPathProvider.getApiResourcePrefix();
    }

    public String getAppBasePath() {
        return UriComponentsBuilder
                .fromHttpUrl(docsLocation)
                .path(servletContext.getContextPath())
                .build()
                .toString();
    }

    @Override
    public String getSwaggerDocumentationBasePath() {
        return UriComponentsBuilder
                .fromHttpUrl(getAppBasePath())
                .pathSegment(&quot;api-docs/&quot;)
                .build()
                .toString();
    }

    @Override
    public String getRequestMappingEndpoint(String requestMappingPattern) {
        return defaultSwaggerPathProvider.getRequestMappingEndpoint(requestMappingPattern);
    }

    public void setDefaultSwaggerPathProvider(SwaggerPathProvider defaultSwaggerPathProvider) {
        this.defaultSwaggerPathProvider = defaultSwaggerPathProvider;
    }
}
&lt;/pre&gt;
&lt;p&gt;In &lt;em&gt;src/main/resources/application.properties&lt;/em&gt;, add an &quot;app.docs&quot; property. This will need
    to be changed as you move your application from local -&gt; test -&gt; staging -&gt; production. Spring Boot&apos;s
    &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-application-property-files&quot;&gt;externalized
        configuration&lt;/a&gt; makes this fairly simple.
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
app.docs=http://localhost:8080
&lt;/pre&gt;
&lt;p&gt;
    &lt;strong&gt;3. Verify Swagger produces JSON.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
After completing the above steps, you should be able
    to see the JSON Swagger generates for your API. Open &lt;a href=&quot;http://localhost:8080/api-docs&quot;&gt;http://localhost:8080/api-docs&lt;/a&gt;
    in your browser or &lt;code&gt;curl http://localhost:8080/api-docs&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
{
    &quot;apiVersion&quot;: &quot;1&quot;,
    &quot;swaggerVersion&quot;: &quot;1.2&quot;,
    &quot;apis&quot;: [
        {
            &quot;path&quot;: &quot;http://localhost:8080/api-docs/mobile-api/example_NewsController&quot;,
            &quot;description&quot;: &quot;example.NewsController&quot;
        }
    ],
    &quot;info&quot;: {
        &quot;title&quot;: &quot;News API&quot;,
        &quot;description&quot;: &quot;Mobile applications and beyond!&quot;,
        &quot;termsOfServiceUrl&quot;: &quot;https://helloreverb.com/terms/&quot;,
        &quot;contact&quot;: &quot;matt@raibledesigns.com&quot;,
        &quot;license&quot;: &quot;Apache 2.0&quot;,
        &quot;licenseUrl&quot;: &quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;
    }
}
&lt;/pre&gt;
&lt;p&gt;
    &lt;strong&gt;4. Copy Swagger UI into your project.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/wordnik/swagger-ui&quot;&gt;Swagger UI&lt;/a&gt; is a good-looking JavaScript client for Swagger&apos;s
    JSON. I integrated it using the following steps:
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
git clone https://github.com/wordnik/swagger-ui
cp -r swagger-ui/dist ~/dev/x-auth-security/src/main/resources/public/docs
&lt;/pre&gt;
&lt;p&gt;
    I modified docs/index.html, deleting its header (&amp;lt;div id=&apos;header&apos;&gt;) element, as well as made its url
    dynamic.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
...
$(function () {
  var apiUrl = window.location.protocol + &quot;//&quot; + window.location.host;
  if (window.location.pathname.indexOf(&apos;/api&apos;) &gt; 0) {
    apiUrl += window.location.pathname.substring(0, window.location.pathname.indexOf(&apos;/api&apos;))
  }
  apiUrl += &quot;/api-docs&quot;;
  log(&apos;API URL: &apos; + apiUrl);
  window.swaggerUi = new SwaggerUi({
    url: apiUrl,
    dom_id: &quot;swagger-ui-container&quot;,
...
&lt;/pre&gt;
&lt;p&gt;
    After making these changes, I was able to open fire up the app with &quot;mvn spring-boot:run&quot; and view
    &lt;a href=&quot;http://localhost:8080/docs/index.html&quot;&gt;http://localhost:8080/docs/index.html&lt;/a&gt; in my browser.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3732/13409312164_feb72e7b8f_b.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/13409312164/&quot; title=&quot;Swagger UI News by mraible, on Flickr&quot;
       rel=&quot;lightbox[swagger]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3732/13409312164_feb72e7b8f.jpg&quot; width=&quot;500&quot; height=&quot;278&quot;
            alt=&quot;Swagger UI News&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;5. Annotate your API.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;There are two services in x-auth-security: one for authentication and one for
    news. To provide more
    information to the &quot;news&quot; service&apos;s documentation, add @Api and @ApiOperation annotations. These annotations aren&apos;t
    necessary to get a service
    to show up in Swagger UI, but if you don&apos;t specify the @Api(&quot;user&quot;), you&apos;ll end up with an ugly-looking class name
    instead
    (e.g. example_xauth_UserXAuthTokenController).
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@RestController
@Api(value = &quot;news&quot;, description = &quot;News API&quot;)
class NewsController {

    Map&amp;lt;Long, NewsEntry&amp;gt; entries = new ConcurrentHashMap&amp;lt;Long, NewsEntry&amp;gt;();

    @RequestMapping(value = &quot;/news&quot;, method = RequestMethod.GET)
    @ApiOperation(value = &quot;Get News&quot;, notes = &quot;Returns news items&quot;)
    Collection&amp;lt;NewsEntry&amp;gt; entries() {
        return this.entries.values();
    }

    @RequestMapping(value = &quot;/news/{id}&quot;, method = RequestMethod.DELETE)
    @ApiOperation(value = &quot;Delete News item&quot;, notes = &quot;Deletes news item by id&quot;)
    NewsEntry remove(@PathVariable Long id) {
        return this.entries.remove(id);
    }

    @RequestMapping(value = &quot;/news/{id}&quot;, method = RequestMethod.GET)
    @ApiOperation(value = &quot;Get a news item&quot;, notes = &quot;Returns a news item&quot;)
    NewsEntry entry(@PathVariable Long id) {
        return this.entries.get(id);
    }

    @RequestMapping(value = &quot;/news/{id}&quot;, method = RequestMethod.POST)
    @ApiOperation(value = &quot;Update News&quot;, notes = &quot;Updates a news item&quot;)
    NewsEntry update(@RequestBody NewsEntry news) {
        this.entries.put(news.getId(), news);
        return news;
    }
...
}
&lt;/pre&gt;
&lt;p&gt;
    You might notice
    the screenshot above only shows news. This is because &lt;code&gt;SwaggerConfig.DEFAULT_INCLUDE_PATTERNS&lt;/code&gt; only
    specifies news. The following
    will include all APIs.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public static final List&amp;lt;String&gt; DEFAULT_INCLUDE_PATTERNS = Arrays.asList(&quot;/.*&quot;);
&lt;/pre&gt;
&lt;p&gt;After adding these annotations and modifying &lt;code&gt;SwaggerConfig&lt;/code&gt;, you should see all available services.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7366/13408960855_8407d286a8_b.jpg&quot; rel=&quot;lightbox[swagger]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/13408960855/&quot; title=&quot;Swagger UI Complete by mraible, on Flickr&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7366/13408960855_8407d286a8.jpg&quot; width=&quot;500&quot; height=&quot;325&quot;
            alt=&quot;Swagger UI Complete&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;In swagger-springmvc 0.8.x, the ability to use @ApiModel and @ApiModelProperty annotations was added. This means you
    can annotate &lt;code&gt;NewsEntry&lt;/code&gt; to specify which fields are required.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@ApiModel(&quot;News Entry&quot;)
public static class NewsEntry {
    @ApiModelProperty(value = &quot;the id of the item&quot;, required = true)
    private long id;
    @ApiModelProperty(value = &quot;content&quot;, required = true)
    private String content;

    // getters and setters
}
&lt;/pre&gt;
&lt;p&gt;This results in the model&apos;s documentation showing up in Swagger UI. If &quot;required&quot; isn&apos;t specified, a property shows
    up as &lt;em&gt;optional&lt;/em&gt;.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3771/13409312244_27f72688d1_b.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/13409312244/&quot; title=&quot;Swagger UI Model by mraible, on Flickr&quot;
       rel=&quot;lightbox[swagger]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3771/13409312244_27f72688d1_n.jpg&quot; width=&quot;320&quot; height=&quot;247&quot;
            alt=&quot;Swagger UI Model&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;Parting Thoughts&lt;/strong&gt;&lt;br/&gt;
    The QA Engineers and 3rd Party iOS Developers have been very pleased with our API documentation. I believe this is
    largely
    due to Swagger and its nice-looking UI. The Swagger UI also provides an interface to test
    the endpoints by entering parameters (or JSON) into HTML forms and clicking buttons. This could benefit those QA
    folks
    that prefer using Selenium to test HTML (vs. raw REST endpoints).
&lt;/p&gt;

&lt;p&gt;I&apos;ve been quite pleased with swagger-springmvc, so kudos to its developers. They&apos;ve been very responsive in
    &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc/issues/created_by/mraible?page=1&amp;amp;state=closed&quot;&gt;fixing
        issues I&apos;ve reported&lt;/a&gt;.
    The only thing I&apos;d like is support for recognizing JSR303 annotations (e.g. @NotNull) as required fields.
&lt;/p&gt;

&lt;p&gt;To see everything running locally, checkout my modified &lt;a
        href=&quot;https://github.com/mraible/boot-examples/tree/master/x-auth-security&quot;&gt;x-auth-security project on
    GitHub&lt;/a&gt;
    and the &lt;a href=&quot;https://github.com/mraible/boot-examples/commits/master&quot;&gt;associated commits&lt;/a&gt; for this article.
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at</id>
        <title type="html">Comparing JVM Web Frameworks at vJUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at"/>
        <published>2014-02-06T10:54:17-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;A couple months ago, I was invited to &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/153096902/&quot;&gt;speak at Virtual JUG&lt;/a&gt; - an online-only Java User Group organized by the &lt;a href=&quot;http://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; folks. They chose my Comparing JVM Web Frameworks presentation and we agreed I&apos;d speak yesterday morning. They used a combination of Google Hangouts, live streaming on YouTube and IRC to facilitate the meeting. It all went pretty smoothly and produced a comfortable speaking environment. To practice for vJUG, I delivered the same talk on Tuesday night at the &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/155080452/&quot;&gt;Denver Open Source Users Group&lt;/a&gt;.
&lt;p&gt;
The last time I delivered this talk was at &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Devoxx France&lt;/a&gt; in March 2013. I didn&apos;t change any of the format this time, keeping with referencing the Paradox of Choice and encouraging people to define constraints to help them make their decision. I did add a few new slides regarding RebelLabs&apos; &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/&quot;&gt;Curious Coder&#8217;s Java Web Frameworks Comparison: Spring MVC, Grails, Vaadin, GWT, Wicket, Play, Struts and JSF&lt;/a&gt; and &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/&quot;&gt;The 2014 Decision Maker&#8217;s Guide to Java Web Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also updated all the pretty graphs (which may or may not have any significance) with the latest stats from Dice.com, LinkedIn, StackOverflow and respective mailing lists. Significant changes I found compared to one year ago:&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;A couple months ago, I was invited to &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/153096902/&quot;&gt;speak at Virtual JUG&lt;/a&gt; - an online-only Java User Group organized by the &lt;a href=&quot;http://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; folks. They chose my Comparing JVM Web Frameworks presentation and we agreed I&apos;d speak yesterday morning. They used a combination of Google Hangouts, live streaming on YouTube and IRC to facilitate the meeting. It all went pretty smoothly and produced a comfortable speaking environment. To practice for vJUG, I delivered the same talk on Tuesday night at the &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/155080452/&quot;&gt;Denver Open Source Users Group&lt;/a&gt;.
&lt;p&gt;
The last time I delivered this talk was at &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Devoxx France&lt;/a&gt; in March 2013. I didn&apos;t change any of the format this time, keeping with referencing the Paradox of Choice and encouraging people to define constraints to help them make their decision. I did add a few new slides regarding RebelLabs&apos; &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/&quot;&gt;Curious Coder&#8217;s Java Web Frameworks Comparison: Spring MVC, Grails, Vaadin, GWT, Wicket, Play, Struts and JSF&lt;/a&gt; and &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/&quot;&gt;The 2014 Decision Maker&#8217;s Guide to Java Web Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also updated all the pretty graphs (which may or may not have any significance) with the latest stats from Dice.com, LinkedIn, StackOverflow and respective mailing lists. Significant changes I found compared to one year ago:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job Listings on Dice.com
&lt;ul&gt;
&lt;li&gt;Play Framework job listings increased almost 4x&lt;/li&gt;
&lt;li&gt;Tapestry jobs are 1/3 of what they were a year ago&lt;/li&gt;
&lt;li&gt;Wicket jobs are 1/2 of what they were a year ago&lt;/li&gt;
&lt;li&gt;JavaScript framework jobs are up quite a bit: Ember.js up ~300%, AngularJS up 900%, Backbone up 160%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn Skills
&lt;ul&gt;
&lt;li&gt;Rails down ~30%&lt;/li&gt;
&lt;li&gt;Grails up 25%&lt;/li&gt;
&lt;li&gt;Play Framework up 200%&lt;/li&gt;
&lt;li&gt;Spring Roo up 40%&lt;/li&gt;
&lt;li&gt;Ember.js up 300%&lt;/li&gt;
&lt;li&gt;AngularJS up 840%&lt;/li&gt;
&lt;li&gt;Backbone up 200%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can tell from these findings, AngularJS has gained quite a bit of mindshare in the last year. There&apos;s a lot of companies looking for JavaScript skills and quite a few folks have added JavaScript frameworks to their LinkedIn profiles.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://www.youtube.com/watch?v=ygW8fJVlDxQ&quot;&gt;watch the recording on YouTube&lt;/a&gt; or click play in the embedded video below.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/ygW8fJVlDxQ&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;You can also quickly browse the slide deck below, &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Comparing_JVM_Web_Frameworks_February2014.pdf&quot;&gt;download the PDF&lt;/a&gt; or &lt;a href=&quot;http://www.slideshare.net/mraible/comparing-jvm-web-frameworks-february-2014&quot;&gt;view it on SlideShare&lt;/a&gt;.&lt;/li&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/30861557?rel=0&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt; &lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;Thanks to all the folks who attended these talks. And thanks to &lt;a href=&quot;http://twitter.com/dosug&quot;&gt;@dosug&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/virtualjug&quot;&gt;@virtualjug&lt;/a&gt; for giving me the opportunity to speak.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_3_0_released</id>
        <title type="html">AppFuse 3.0 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_3_0_released"/>
        <published>2013-12-23T14:31:15-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="primefaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap3" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring4" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 3.0. This release is AppFuse&apos;s first release as a &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_10_year_appfuse&quot;&gt;10-year old&lt;/a&gt; and includes a whole slew of improvements.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Java 7 and Maven 3 are now minimal requirements&lt;/li&gt;
    &lt;li&gt;Replaced MyFaces and Tomahawk with PrimeFaces for JSF&lt;br&gt;
        &lt;ul&gt;
            &lt;li&gt;Removed SiteMesh in favor of JSF&apos;s built-in layout support&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Added Wicket support&lt;/li&gt;
    &lt;li&gt;Migrated from jMock to Mockito for tests&lt;/li&gt;
    &lt;li&gt;Integrated wro4j and WebJars&lt;/li&gt;
    &lt;li&gt;Migrated to Bootstrap 3 and defaulted to Bootswatch&apos;s &lt;a href=&quot;http://bootswatch.com/spacelab/&quot;&gt;Spacelab
        theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, this release includes upgrades to all dependencies to bring them up-to-date with their latest
    releases. Most notable are Spring 4, Spring Security 3.2 and Bootstrap 3. For more details on specific changes
    see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+3.0.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br&gt;

    AppFuse is a full-stack framework for building web applications on the JVM. It was
    originally developed to eliminate the ramp-up time when building new web applications. Over
    the years, it has matured into a very testable and secure system for creating Java-based
    webapps.
&lt;/p&gt;
&lt;p&gt;Demos for this release can be viewed at &lt;a href=&quot;http://demo.appfuse.org/&quot;&gt;http://demo.appfuse.org&lt;/a&gt;. Please see
    the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; style=&quot;font-weight: bold&quot;&gt;QuickStart Guide&lt;/a&gt; to
    get started with this release. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the
    &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any
    issues, please report them on the users mailing list. You can also post them to &lt;a href=&quot;http://stackoverflow.com/questions/tagged/appfuse&quot;&gt;Stack Overflow&lt;/a&gt; with the &quot;appfuse&quot; tag.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing
    lists.&lt;/p&gt;

&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our
    sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;,
    &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, and &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;.
    Atlassian and Contegix are especially awesome:
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all
        its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/javaone_2013_videos_of_presentations</id>
        <title type="html">JavaOne 2013: Videos of Presentations on Parleys</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/javaone_2013_videos_of_presentations"/>
        <published>2013-12-13T09:40:42-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaone" scheme="http://roller.apache.org/ns/tags/" />
        <category term="parleys" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
&lt;img class=&quot;picture&quot; style=&quot;border: 0&quot; alt=&quot;Duke Rocking Out&quot; src=&quot;//static.raibledesigns.com/repository/images/rockstar_dukewithguitar_small.gif&quot; width=&quot;75&quot;&gt;
This year marked my &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2013&quot;&gt;first time speaking at JavaOne&lt;/a&gt;. It seems to have gone well, especially since audience feedback resulted in a &lt;a href=&quot;http://steveonjava.com/congrats-to-the-2013-javaone-rock-stars/&quot;&gt;JavaOne Rock Star Award&lt;/a&gt;. I&apos;m very humbled to be listed with some really great speakers. Congratulations to all the other Rock Stars - as well as everyone that had the courage to submit and present a talk this year!&lt;/p&gt;
For the top sessions at JavaOne 2013, Oracle worked with Parleys to capture the audio and synch it with the presentations. They published them in a &lt;a href=&quot;http://parleys.com/channel/5243df06e4b0d1fb3c78fe31/presentations&quot;&gt;JavaOne 2013 Channel&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2013_my_presentations&quot;&gt;my presentations&lt;/a&gt; were included. Without further ado, here they are for your viewing pleasure.&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe type=&quot;text/html&quot; width=&quot;550&quot; height=&quot;380&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; src=&quot;//www.parleys.com/share.html#play/52535869e4b0c4f11ec576c0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;iframe type=&quot;text/html&quot; width=&quot;550&quot; height=&quot;380&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; src=&quot;//www.parleys.com/share.html#play/5252f7ede4b0a43ac121247d&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;If you happen to watch these and have any feedback, please leave a comment or send a tweet to &lt;a href=&quot;http://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries</id>
        <title type="html">Devoxx 2013 + a Nordic Countries Speaking Tour</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries"/>
        <published>2013-11-28T12:07:26-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="nordea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="avegagroup" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7452/11089788834_b7541d335d_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/11089788834/&quot;
       title=&quot;Trish at Pelgrom by mraible, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;http://farm8.staticflickr.com/7452/11089788834_b7541d335d_t.jpg&quot; width=&quot;100&quot;
            alt=&quot;Trish at Pelgrom&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
    Two weeks ago, Trish and I boarded a flight for one of our favorite conferences: &lt;a
        href=&quot;http://devoxx.be/&quot;&gt;Devoxx&lt;/a&gt;. After a brief layover in Frankfurt, we arrived in Amsterdam and took a train to Antwerp. Within hours, we&apos;d settled into our hotel near the center of Antwerp and strolled over to the
    dungeonous, yet cozy, &lt;a href=&quot;http://www.pelgrom.be/&quot;&gt;Pelgrom restaurant&lt;/a&gt;. We were hoping for a delicious
    dinner, but found much more. We
    ran into James Ward, Dick Wall and a number of other enthusiastic speakers from the conference. Since I had to speak
    the next day, we didn&apos;t stay long, but we did share a number of laughs with some great people.
&lt;/p&gt;
&lt;p&gt;
    Tuesday (November 12), was a University Day at Devoxx, and I had my talk that afternoon. I spent a couple hours
    finishing up my talk
    that morning, then grabbed a taxi to head to the conference. I was honored with the opportunity to speak in Room 8,
    which is a huge theater that holds several hundred people.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2809/11089790274_ac70261260_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/11089790274/&quot;
       title=&quot;Devoxx: A Speaker&apos;s Perspective by mraible, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;http://farm3.staticflickr.com/2809/11089790274_ac70261260_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx: A Speaker&apos;s Perspective&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm3.staticflickr.com/2805/11102110783_8c0ea95e1d_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102110783/&quot;
       title=&quot;The Modern JVM Web Developer by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;http://farm3.staticflickr.com/2805/11102110783_8c0ea95e1d_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;The Modern JVM Web Developer&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm4.staticflickr.com/3727/11102183263_7fc28918f6_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102183263/&quot;
       title=&quot;AngularJS Deep Dive by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;http://farm4.staticflickr.com/3727/11102183263_7fc28918f6_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;AngularJS Deep Dive&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    I presented a lengthened version of The Modern Java Web Developer presentation I did early this year (at &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/the_modern_java_web_developer&quot;&gt;Denver&apos;s JUG&lt;/a&gt; and &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/javaone_2013_my_presentations&quot;&gt;JavaOne&lt;/a&gt;). Based on &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/the_modern_java_web_developer1&quot;&gt;your feedback&lt;/a&gt;, I chose to do deep
    dives on AngularJS, Bootstrap and Page Speed. I&apos;ve always enjoyed speaking at Devoxx because attendees are so
    enthusiastic and passionate about the conference. I received an immense amount of feedback, both in praises and
    criticisms. The critics indicated there were &lt;a
        href=&quot;http://steveschols.wordpress.com/2013/11/21/devoxx-2013-a-retrospective/&quot;&gt;too many buzzwords&lt;/a&gt; and not
    enough substance. Others complained that the AngularJS &lt;a
        href=&quot;http://www.informit.com/articles/article.aspx?p=1930512&amp;amp;seqNum=3&quot;&gt;Lipsync&lt;/a&gt; that I did was &lt;em&gt;too
    deep&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
    I made sure to review and process everyone&apos;s comments, and then used them to improve the presentation throughout the
    following week. I learned to elaborate on the fact that many of the technologies were important to know about, but
    not important to know through-and-through. I made sure to mention that the use of CoffeeScript and LESS is often
    limited (or embraced) by team members and their willingness to try new things. If you&apos;re not writing thousands of
    lines of JavaScript or CSS, it probably doesn&apos;t make sense to use these languages. Furthermore, if your team members
    are struggling to write JavaScript or CSS, introducing a new language is probably not the best thing. I also
    reminded people to be skeptical of new technology, but also to be open-minded and give everything a chance. The
    10-minute, download-and-try test, is a great way to do that.
&lt;/p&gt;
&lt;p&gt;You can find my presentation below, download it from &lt;a href=&quot;http://raibledesigns.com/rd/page/publications&quot;&gt;my
    presentations page&lt;/a&gt;, or view it &lt;a
        href=&quot;http://www.slideshare.net/mraible/the-modern-java-web-developer-bootcamp-devoxx-2013&quot;&gt;on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
    &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/28649243?rel=0&quot; width=&quot;600&quot; height=&quot;375&quot; frameborder=&quot;0&quot;
            marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;
            style=&quot;border:1px solid #ccc;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;
    Within this presentation, there are links to each of the deep dives. The last two are screencasts that I added
    audio to a few days ago.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/bootstrap3&quot;&gt;Bootstrap 3&lt;/a&gt; | 
&lt;a href=&quot;https://vimeo.com/mraible/angularjs-deep-dive&quot;&gt;AngularJS Deep Dive&lt;/a&gt; | 
&lt;a href=&quot;https://vimeo.com/mraible/page-speed-demo&quot;&gt;Page Speed Demo&lt;/a&gt;
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7452/11089788834_b7541d335d_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/11089788834/&quot;
       title=&quot;Trish at Pelgrom by mraible, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7452/11089788834_b7541d335d_t.jpg&quot; width=&quot;100&quot;
            alt=&quot;Trish at Pelgrom&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
    Two weeks ago, Trish and I boarded a flight for one of our favorite conferences: &lt;a
        href=&quot;http://devoxx.be/&quot;&gt;Devoxx&lt;/a&gt;. After a brief layover in Frankfurt, we arrived in Amsterdam and took a train to Antwerp. Within hours, we&apos;d settled into our hotel near the center of Antwerp and strolled over to the
    dungeonous, yet cozy, &lt;a href=&quot;http://www.pelgrom.be/&quot;&gt;Pelgrom restaurant&lt;/a&gt;. We were hoping for a delicious
    dinner, but found much more. We
    ran into James Ward, Dick Wall and a number of other enthusiastic speakers from the conference. Since I had to speak
    the next day, we didn&apos;t stay long, but we did share a number of laughs with some great people.
&lt;/p&gt;
&lt;p&gt;
    Tuesday (November 12), was a University Day at Devoxx, and I had my talk that afternoon. I spent a couple hours
    finishing up my talk
    that morning, then grabbed a taxi to head to the conference. I was honored with the opportunity to speak in Room 8,
    which is a huge theater that holds several hundred people.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2809/11089790274_ac70261260_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/11089790274/&quot;
       title=&quot;Devoxx: A Speaker&apos;s Perspective by mraible, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2809/11089790274_ac70261260_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx: A Speaker&apos;s Perspective&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm3.staticflickr.com/2805/11102110783_8c0ea95e1d_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102110783/&quot;
       title=&quot;The Modern JVM Web Developer by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2805/11102110783_8c0ea95e1d_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;The Modern JVM Web Developer&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm4.staticflickr.com/3727/11102183263_7fc28918f6_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102183263/&quot;
       title=&quot;AngularJS Deep Dive by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3727/11102183263_7fc28918f6_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;AngularJS Deep Dive&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    I presented a lengthened version of The Modern Java Web Developer presentation I did early this year (at &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/the_modern_java_web_developer&quot;&gt;Denver&apos;s JUG&lt;/a&gt; and &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/javaone_2013_my_presentations&quot;&gt;JavaOne&lt;/a&gt;). Based on &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/the_modern_java_web_developer1&quot;&gt;your feedback&lt;/a&gt;, I chose to do deep
    dives on AngularJS, Bootstrap and Page Speed. I&apos;ve always enjoyed speaking at Devoxx because attendees are so
    enthusiastic and passionate about the conference. I received an immense amount of feedback, both in praises and
    criticisms. The critics indicated there were &lt;a
        href=&quot;http://steveschols.wordpress.com/2013/11/21/devoxx-2013-a-retrospective/&quot;&gt;too many buzzwords&lt;/a&gt; and not
    enough substance. Others complained that the AngularJS &lt;a
        href=&quot;http://www.informit.com/articles/article.aspx?p=1930512&amp;amp;seqNum=3&quot;&gt;Lipsync&lt;/a&gt; that I did was &lt;em&gt;too
    deep&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
    I made sure to review and process everyone&apos;s comments, and then used them to improve the presentation throughout the
    following week. I learned to elaborate on the fact that many of the technologies were important to know about, but
    not important to know through-and-through. I made sure to mention that the use of CoffeeScript and LESS is often
    limited (or embraced) by team members and their willingness to try new things. If you&apos;re not writing thousands of
    lines of JavaScript or CSS, it probably doesn&apos;t make sense to use these languages. Furthermore, if your team members
    are struggling to write JavaScript or CSS, introducing a new language is probably not the best thing. I also
    reminded people to be skeptical of new technology, but also to be open-minded and give everything a chance. The
    10-minute, download-and-try test, is a great way to do that.
&lt;/p&gt;
&lt;p&gt;You can find my presentation below, download it from &lt;a href=&quot;http://raibledesigns.com/rd/page/publications&quot;&gt;my
    presentations page&lt;/a&gt;, or view it &lt;a
        href=&quot;http://www.slideshare.net/mraible/the-modern-java-web-developer-bootcamp-devoxx-2013&quot;&gt;on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
    &lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/28649243?rel=0&quot; width=&quot;600&quot; height=&quot;375&quot; frameborder=&quot;0&quot;
            marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;
            style=&quot;border:1px solid #ccc;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;
    Within this presentation, there are links to each of the deep dives. The last two are screencasts that I added
    audio to a few days ago.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/bootstrap3&quot;&gt;Bootstrap 3&lt;/a&gt; | 
&lt;a href=&quot;https://vimeo.com/mraible/angularjs-deep-dive&quot;&gt;AngularJS Deep Dive&lt;/a&gt; | 
&lt;a href=&quot;https://vimeo.com/mraible/page-speed-demo&quot;&gt;Page Speed Demo&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;width: 575px; margin: auto;&quot;&gt;
    &lt;div style=&quot;display: inline;&quot;&gt;
        &lt;iframe src=&quot;//player.vimeo.com/video/80314102&quot; width=&quot;280&quot; height=&quot;175&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
    &lt;div style=&quot;display: inline; float: right;&quot;&gt;
        &lt;iframe src=&quot;//player.vimeo.com/video/80391343&quot; width=&quot;280&quot; height=&quot;175&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
    We stayed in Antwerp until Friday, attending the conference, taking pictures, networking over beers and having a
    fabulous time with everyone attending Devoxx.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7350/11102130224_8b2d9d1109_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102130224/&quot;
       title=&quot;Street Shadows by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7350/11102130224_8b2d9d1109_s.jpg&quot; width=&quot;75&quot;
            alt=&quot;Street Shadows&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm4.staticflickr.com/3706/11102238913_441d2fb728_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102238913/&quot;
       title=&quot;Devoxx posse at the Antwerp Town Hall by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3706/11102238913_441d2fb728_s.jpg&quot; width=&quot;75&quot;
            alt=&quot;Devoxx posse at the Antwerp Town Hall&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm6.staticflickr.com/5533/11102264113_6747b92a61_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102264113/&quot;
       title=&quot;Matt and Josh next to the Cathedral Antwerp by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm6.staticflickr.com/5533/11102264113_6747b92a61_s.jpg&quot; width=&quot;75&quot;
            alt=&quot;Matt and Josh next to the Cathedral Antwerp&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm8.staticflickr.com/7371/11089691035_34e95b21d0_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/11089691035/&quot;
       title=&quot;Devoxx Late Night by mraible, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7371/11089691035_34e95b21d0_s.jpg&quot; width=&quot;75&quot;
            alt=&quot;Devoxx Late Night&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm4.staticflickr.com/3775/11102166205_fe4c769a30_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102166205/&quot;
       title=&quot;Trish and Amelia by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3775/11102166205_fe4c769a30_s.jpg&quot; width=&quot;75&quot;
            alt=&quot;Trish and Amelia&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3801/11102112776_b8b7c90b9a_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102112776/&quot;
       title=&quot;Town Hall Antwerp by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3801/11102112776_b8b7c90b9a.jpg&quot; width=&quot;500&quot;
            alt=&quot;Town Hall Antwerp&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7399/11102078745_37f02cdc32_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102078745/&quot;
       title=&quot;Antwerp square by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7399/11102078745_37f02cdc32.jpg&quot; width=&quot;500&quot;
            alt=&quot;Antwerp square&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;
    Thursday night, we dined at &lt;a
        href=&quot;http://www.tripadvisor.com/Restaurant_Review-g188636-d2536032-Reviews-Matty-Antwerp_Antwerp_Province.html&quot;&gt;Matty&lt;/a&gt;,
    one of the best restaurants in Antwerp.
    The food was excellent and provided a nice start for a night that included the Devoxx Party at Noxx and a journey to
    &lt;a href=&quot;http://biercentral.be/&quot;&gt;Bier Central&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2813/11102230866_8b45e6d1e5_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102230866/&quot;
       title=&quot;Matty Restaurant Antwerp by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2813/11102230866_8b45e6d1e5_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Matty Restaurant Antwerp&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2872/11102238026_29af90ac67_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102238026/&quot;
       title=&quot;Steak at Matty by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2872/11102238026_29af90ac67_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Steak at Matty&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7291/11102264004_71837f43e7_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102264004/&quot;
       title=&quot;Dessert by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7291/11102264004_71837f43e7_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Dessert&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    On Friday, we traveled to Brussels for a weekend in one of the &lt;a
        href=&quot;http://www.usatoday.com/story/travel/destinations/2012/10/02/10-best-beer-cities-in-the-world/1608885/&quot;&gt;best
    beer cities in the world&lt;/a&gt;. Trish booked us a room at the &lt;a href=&quot;http://www.hotel-saint-michel.be/&quot;&gt;Hotel Saint
    Michel&lt;/a&gt;, which was right on the &lt;a href=&quot;http://www.europeish.com/25-amazingly-stunning-european-squares/&quot;&gt;most
    beautiful square in Europe&lt;/a&gt;. Their pre-Christmas light show was spectacular. The beer was delicious, the location
    was magnificent and we thoroughly enjoyed ourselves, especially the &lt;a
        href=&quot;http://farm8.staticflickr.com/7342/11102281806_49f4a65516_c.jpg&quot;
        data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102281806/&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;mussels in
    Brussels&lt;/a&gt;. Thanks in particular to &lt;a href=&quot;https://twitter.com/snicoll&quot;&gt;St&#233;phane&lt;/a&gt; and &lt;a
        href=&quot;https://twitter.com/philipluppens&quot;&gt;Philip&lt;/a&gt; for your recommendations.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2830/11102444343_3005a06b72_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102444343/&quot;
       title=&quot;Grand Place Brussels by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2830/11102444343_3005a06b72.jpg&quot; width=&quot;500&quot;
            alt=&quot;Grand Place Brussels&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p id=&quot;nordic-speaking-tour&quot;&gt;
    &lt;strong&gt;Nordic Countries Speaking Tour&lt;/strong&gt;&lt;br/&gt;
    On Sunday (November 17), we flew to Stockholm to being the second half our trip. Nordea hired me to deliver my
    Devoxx presentation as part their Java Competence Network. Nordea&apos;s Jonny Berggren first contacted me in March 2010
    about this opportunity, so it was fun to see it finally happen. We agreed that I&apos;d speak at their four main
    locations: Stockholm, Helsinki, Oslo and Copenhagen. 
&lt;/p&gt;
&lt;p&gt;
    Mattias Karlsson (of &lt;a href=&quot;http://www.jfokus.se/&quot;&gt;Jfokus&lt;/a&gt; fame) also presented me with an opportunity to speak at his
    company while I was in Sweden.
&lt;/p&gt;
&lt;p&gt;
    I started the week delivering my talk on Monday afternoon at Nordea. Then we met up with Mattias, walked to his
    company and I delivered it again 45 minutes later. It was exhausting to talk for six hours in one day, but it all seemed
    to go well. I especially enjoyed the enthusiasm of Mattias&apos;s Avega Group.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3817/11102348876_9d52cb9c3e_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102348876/&quot;
       title=&quot;Speaking at Avega Group by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3817/11102348876_9d52cb9c3e_n.jpg&quot; width=&quot;320&quot;
            alt=&quot;Speaking at Avega Group&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    That evening, we took the train to the airport, boarded a flight to Helsinki and arrived just after midnight. While
    on the train, we sat next to a Finlander, Karol, that gave us all kinds of great advice on what to do. Tuesday in
    Helsinki was cold and dreary; perfect sauna weather. We walked around a bit in the rain that morning and visited
    Senate Square on Karol&apos;s recommendation. I mentioned to the developers there that my Mom&apos;s grandparents were from
    Finland (Oulu and Hamina), and that I&apos;d grown up in a rustic cabin built by my Finish grandfather, Matti Hill.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3749/11102390024_179d50d342_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102390024/&quot;
       title=&quot;Matt in Helsinki Capitol by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3749/11102390024_179d50d342_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Matt in Helsinki Capitol&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2824/11102401054_357a5665f8_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102401054/&quot;
       title=&quot;Downtown Helsinki by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2824/11102401054_357a5665f8_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Downtown Helsinki&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    We flew to Oslo Tuesday evening, rode the super-fast train from the airport and got to bed just before midnight.
    Wednesday morning, we walked around the Vigelandsparken Sculpture Park, and then I headed to the Nordea office while
    Trish did a walkabout and rode a Viking ship around the bay. We met up afterwards at the wonderful &lt;a
        href=&quot;http://www.beerpalace.no/&quot;&gt;Beer Palace&lt;/a&gt; for some pizza and delicious German/Belgian beer.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3716/11102323505_758f0b2480_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102323505/&quot;
       title=&quot;Oslo Opera by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3716/11102323505_758f0b2480.jpg&quot; width=&quot;500&quot;
            alt=&quot;Oslo Opera&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7445/11102326065_c9807c37d5_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102326065/&quot;
       title=&quot;Ship and Oslo Opera by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7445/11102326065_c9807c37d5_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Ship and Oslo Opera&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3816/11102531063_e63b78e22e_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102531063/&quot;
       title=&quot;Crew&apos;s Sunset Oslo by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3816/11102531063_e63b78e22e_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Crew&apos;s Sunset Oslo&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;http://farm6.staticflickr.com/5512/11102364565_d44c5bf9dc_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102364565/&quot;
       title=&quot;Oslo ship in the Harbor by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm6.staticflickr.com/5512/11102364565_d44c5bf9dc.jpg&quot; width=&quot;500&quot;
            alt=&quot;Oslo ship in the Harbor&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7317/11102552963_caa2a844cd_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102552963/&quot;
       title=&quot;Danish Welcome by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7317/11102552963_caa2a844cd_t.jpg&quot; width=&quot;100&quot;
            alt=&quot;Danish Welcome&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    Copenhagen was our last stop, a city which neither of us have ever traveled to. After arriving, we quickly got a
    hint that Copenhagen was a special place. We did a bit of research on &lt;a
        href=&quot;http://en.wikipedia.org/wiki/Copenhagen&quot;&gt;Wikipedia&lt;/a&gt; and learned it was The City of Bikes and their
    craft brewing industry has blossomed in the last decade, now sporting over 100 microbreweries. My last talk on
    Thursday morning went very well, especially since my presentation and advice was well polished by that point.
&lt;/p&gt;
&lt;p&gt;
    That afternoon, we rented bikes from our hotel, slowly ate &lt;a
        href=&quot;http://www.tripadvisor.com/Restaurant_Review-g189541-d3454699-Reviews-Sticks_n_Sushi_Tivoli_Hotel_Congress_Center-Copenhagen_Zealand.html&quot;&gt;sushi&lt;/a&gt;
    on the top of the Tivoli Hotel, and then rode to &lt;a href=&quot;http://www.tivoli.dk/&quot;&gt;Tivoli Gardens&lt;/a&gt;. Tivoli Gardens
    was decorated as a Christmas wonderland and their amusement park made us smile and giggle with glee. We stayed there
    for hours before riding home. Biking around town with hundreds of other cyclists was really cool and fun. I hope
    Denver gets &lt;em&gt;Copenhagenized&lt;/em&gt; someday, the abundance of bike-only roads is simply awesome.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm4.staticflickr.com/3778/11102417765_08ccdbdc77_c.jpg&quot; data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102417765/&quot; title=&quot;Happy Couple at Tivoli by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3778/11102417765_08ccdbdc77_q.jpg&quot; width=&quot;150&quot; alt=&quot;Happy Couple at Tivoli&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.staticflickr.com/3821/11102492616_cc34d454e9_c.jpg&quot; data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102492616/&quot; title=&quot;Tivoli by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3821/11102492616_cc34d454e9_q.jpg&quot; width=&quot;150&quot; alt=&quot;Tivoli&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.staticflickr.com/3689/11102535804_660b10428a_c.jpg&quot; data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11102535804/&quot; title=&quot;Tivoli by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[devoxx2013]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3689/11102535804_660b10428a_q.jpg&quot; width=&quot;150&quot; alt=&quot;Tivoli&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    Our Nordic countries tour was especially pleasant because Christmas decorations were everywhere. In the US, many
    folks look down upon Christmas decorations before Thanksgiving, but since Europeans don&apos;t celebrate Thanksgiving - there&apos;s no reason not to ease into the Christmas spirit. We figured Abbie and Jack would have a blast at Tivoli in a future November or December. Yes, it was
    a bit chilly (20-30&amp;deg;F) in most of the countries, but we were well dressed for it. Unfortunately, we didn&apos;t get
    to see any snow.
&lt;/p&gt;
&lt;p&gt;
    Many thanks to Devoxx, Nordea, Mattias&apos;s Avega Group and the hundreds of developers who listened to me talk about being a
    modern web developer. We had a wonderful time speaking, laughing, photographing, drinking your delicious beer and
    seeing all your smiling faces.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; color: #999; padding-top: 5px&quot;&gt;
    For more photos of this whirlwind trip, see Trish&apos;s &lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157638119009136/&quot;&gt;
    EU and Scandanavian Speaking Tour 2013&lt;/a&gt;, while mine are in
    &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157638123386015/&quot;&gt;Devoxx 2013 and Nordic Speaking Tour&lt;/a&gt;.
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_modern_java_web_developer1</id>
        <title type="html">The Modern Java Web Developer Bootcamp at Devoxx</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_modern_java_web_developer1"/>
        <published>2013-10-29T10:21:49-06:00</published>
        <updated>2013-10-29T16:22:39-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dv13-javaweb$" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">At this year&apos;s &lt;a href=&quot;http://www.devoxx.be/&quot;&gt;Devoxx&lt;/a&gt;, I&apos;ll be delivering &lt;a href=&quot;http://www.devoxx.be/dv13-matt-raible.html?presId=3648&quot;&gt;my first University session&lt;/a&gt;. University talks are in depth presentations of 3 hours (= 75m + 30m break + 75m). I&apos;m calling it The Modern Java Web Developer Bootcamp and my goal is to teach people some new concepts and techniques that&apos;ll make them more valuable developers. My session&apos;s hashtag is &lt;a href=&quot;https://twitter.com/search?q=%23dv13-javaweb%24&quot;&gt;#dv13-javaweb$&lt;/a&gt; to exemplify the important takeaways: &lt;a href=&quot;http://www.infoq.com/articles/javaone2013-roundup&quot;&gt;Java is back&lt;/a&gt;, web development is fun and you can make more money.
&lt;/p&gt;
&lt;p&gt;Three hours is quite a bit longer than I&apos;m used to, but I&apos;m confident I can fill the time with lots of knowledge. My plan is to enhance my &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2013_my_presentations&quot;&gt;presentation from JavaOne&lt;/a&gt; and add a few demos. Currently, I&apos;m thinking of developing the following additional content:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Overview (with SPDY)&lt;/li&gt;
&lt;li&gt;Polymer and Web Components&lt;/li&gt;
&lt;li&gt;Bootstrap 3 Overview&lt;/li&gt;
&lt;li&gt;HTML5 Storage&lt;/li&gt;
&lt;li&gt;API Framework Comparison (Play, Grails, Dropwizard)&lt;/li&gt;
&lt;li&gt;Load Testing&lt;/li&gt;
&lt;li&gt;Performance Monitoring (including RUM)&lt;/li&gt;
&lt;li&gt;Internal Cloud Options&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For demos, I&apos;d like to show a few that provide real value to attendees and teach them how to do something they haven&apos;t done before. The ones below are candidates I&apos;m thinking of, and I&apos;d like to pick three for the final presentation.&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;Browser Tools Demo&lt;/li&gt;
&lt;li&gt;Developing with Bootstrap Demo&lt;/li&gt;
&lt;li&gt;AngularJS Demo&lt;/li&gt;
&lt;li&gt;Refactor an app from Spring to Java EE, no XML, all Java 8&lt;/li&gt;
&lt;li&gt;Page Speed Improvement Demo&lt;/li&gt;
&lt;li&gt;Security Demo (add LDAP to Angular app + OWASP ZAP)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you could pick three real-time tutorials from the choices above, which ones would you choose?&lt;/p&gt;
&lt;p&gt;I&apos;m also thinking of adding some stories about impressive loads served with very little hardware and real-time dashboard development. If you have a story about either of these, please let me know. I&apos;d be happy to credit you (or your company) and talk about any technical implementation details you&apos;re willing to provide.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/writing_for_infoq</id>
        <title type="html">Writing for InfoQ</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/writing_for_infoq"/>
        <published>2013-10-20T09:20:08-06:00</published>
        <updated>2013-10-20T15:20:08-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="javaone" scheme="http://roller.apache.org/ns/tags/" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="writing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="article" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">A little over six months ago, I received an email from &lt;a href=&quot;http://www.infoq.com/author/Charles-Humble&quot;&gt;Charles Humble&lt;/a&gt;, the lead Java editor at &lt;a href=&quot;http://infoq.com&quot;&gt;InfoQ.com&lt;/a&gt;. He asked me to comment on his &lt;a href=&quot;http://www.infoq.com/news/2013/04/struts1-eol&quot;&gt;Struts 1 Reaches End Of Life&lt;/a&gt;. I happily obliged, and my thoughts were published as part of the article.&lt;/p&gt;
&lt;p&gt;After that brief interaction, Charles and I started talking about the possibility of writing for InfoQ. I said I&apos;d be interested and things have been progressing steadily from there. Today, I&apos;m proud to announce that my first InfoQ article has been published. If you missed JavaOne, or attended but didn&apos;t see the keynotes, you might enjoy reading &lt;a href=&quot;http://www.infoq.com/articles/javaone2013-roundup&quot;&gt;JavaOne 2013 Roundup: Java 8 is Revolutionary, Java is back&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;did&lt;/em&gt; attend JavaOne, or simply watched the &lt;a href=&quot;http://www.oracle.com/javaone/live/on-demand/index.html#javaone&quot;&gt;JavaOne Keynotes&lt;/a&gt; and found something particularly intriguing, I&apos;d love to hear about it. </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/javaone_2013_my_presentations</id>
        <title type="html">JavaOne 2013: My Presentations</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/javaone_2013_my_presentations"/>
        <published>2013-09-27T13:35:01-06:00</published>
        <updated>2015-07-24T20:51:56-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="play" scheme="http://roller.apache.org/ns/tags/" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="web" scheme="http://roller.apache.org/ns/tags/" />
        <category term="smackdown" scheme="http://roller.apache.org/ns/tags/" />
        <category term="modern" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;I flew into San Francisco this past Monday to speak at &lt;a href=&quot;http://www.oracle.com/javaone&quot;&gt;JavaOne&lt;/a&gt; 2013, and to meet with my &lt;a href=&quot;http://www.johnmuirhealth.com/&quot;&gt;new client&lt;/a&gt;. I made sure to wear a &lt;a href=&quot;http://www.denverbroncos.com/&quot;&gt;Broncos&lt;/a&gt; shirt since I was riding the train through Oakland and had some co-workers that were Raiders fans. My trip started off nicely as the Broncos dismantled the Raiders on Monday Night Football. My new team and I watched it during a team dinner at &lt;a href=&quot;http://havanarestaurant.net/main/&quot;&gt;Havana&lt;/a&gt; in Walnut Creek. Historically, the Broncos and Raiders have had a heated rivalry historically, so the win was the perfect start to the week. &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On Tuesday, I worked from my hotel in the morning, then met &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt; to do some last minute prep for our &lt;a href=&quot;https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=2863&quot;&gt;smackdown&lt;/a&gt;. The prior week, we both upgraded our respective apps to use the latest versions of Grails and Play Framework. I ran into &lt;a href=&quot;http://grails.1312388.n4.nabble.com/Grails-2-3-Child-object-not-saved-in-unit-test-td4649385.html&quot;&gt;a&lt;/a&gt; &lt;a href=&quot;http://grails.1312388.n4.nabble.com/Geb-Tests-with-Grails-2-3-0-td4649417.html&quot;&gt;few&lt;/a&gt; &lt;a href=&quot;http://grails.1312388.n4.nabble.com/Grails-2-3-with-Spring-Security-td4649418.html&quot;&gt;issues&lt;/a&gt; when &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/801eca879dfeed208605db897eff8b77fa07bd29&quot;&gt;upgrading&lt;/a&gt;, while Play required &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/70cbdc9b00876c6dd455dd318c304ebf053e9fa1&quot;&gt;some API changes&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
We both added &lt;a href=&quot;https://www.memcachier.com/&quot;&gt;Memcachier&lt;/a&gt; to our apps (to share caching between dynos) and ran some Apache Bench tests. The &lt;a href=&quot;http://www.ubertracks.com/preso/#/8/10&quot;&gt;results&lt;/a&gt; showed quite a bit of slowdown compared to &lt;a href=&quot;http://www.ubertracks.com/preso/#/8/9&quot;&gt;last time&lt;/a&gt;, which we attributed to caching needing to make network hops. Other than that, we both had to make changes to our framework&apos;s buildpacks to get the latest versions running on Heroku, and when we headed for our talk, my instance of Grails wasn&apos;t running (60 second boot timeout on startup). The good news is it somehow solved its issues during our talk and was up and running when I checked it after, as it &lt;a href=&quot;http://bike.ubertracks.com/&quot;&gt;is now&lt;/a&gt;. Below is an embedded version of the presentation we delivered. You can also &lt;a href=&quot;http://ubertracks.com/preso&quot;&gt;click here&lt;/a&gt; to see it in a new window, or &lt;a href=&quot;http://www.slideshare.net/mraible/play-framework-vs-grails-smackdown-javaone-2013&quot;&gt;view it on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;http://static.raibledesigns.com/repository/presentations/Play_Framework_vs_Grails_Smackdown_JavaOne2013/&quot; width=&quot;600&quot; height=&quot;375&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt; 
&lt;/div&gt;
&lt;p&gt;On Wednesday morning, I tried to attend Venkat&apos;s &lt;a href=&quot;https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=2055&quot;&gt;Programming with Lambda Expressions in Java&lt;/a&gt;, but quickly discovered it was sold out. My talk on The Modern Java Web Developer started shortly after and I had a fantastic time talking to a packed room and preaching the virtues of learning and staying up-to-date with web technologies. I made sure to include a slide on &lt;a href=&quot;https://avatar.java.net/&quot;&gt;Avatar&lt;/a&gt;, an Oracle-sponsored JavaScript-based framework that requires &quot;very minor JavaScript knowledge&quot;. You can view my presentation below or &lt;a href=&quot;http://www.slideshare.net/mraible/the-modern-java-web-developer-javaone-2013&quot;&gt;on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/26581954?rel=0&quot; width=&quot;600&quot; height=&quot;375&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;According to @JavaOneConf, all JavaOne 2013 presentations will be &lt;a href=&quot;https://twitter.com/JavaOneConf/status/383381815626825728&quot;&gt;published on Parleys.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After completing my talks, I journeyed to my client and practiced what I preached, successfully finishing a spike that reduced page load time from 8 seconds to 2 seconds. That evening, I attended the Oracle Appreciation Event at Treasure Island, had some cold beer and listened to some loud music. &lt;/p&gt;
&lt;p&gt;I had a great time speaking at JavaOne this year, and look forward to my next speaking engagement. In November, I&apos;ll be traveling to Devoxx where I&apos;ll be giving a &lt;a href=&quot;http://www.devoxx.be/dv13-matt-raible.html?presId=3648&quot;&gt;3-hour University session&lt;/a&gt; on The Modern Java Web Developer. Hope to see you there!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_modern_java_web_developer</id>
        <title type="html">The Modern Java Web Developer and Java Web Security at Denver JUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_modern_java_web_developer"/>
        <published>2013-02-14T10:23:18-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="denverjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="denver" scheme="http://roller.apache.org/ns/tags/" />
        <category term="web" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last night, I had the pleasure of delivering two talks at the &lt;a href=&quot;http://www.meetup.com/DenverJavaUsersGroup/events/93932082/&quot;&gt;Denver Java User Group&lt;/a&gt;. The first talk, The Modern Java Web Developer, was inspired by the book titled &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_well_grounded_java_developer&quot;&gt;The Well-Grounded Java Developer&lt;/a&gt;. &lt;a href=&quot;http://boxcatjunction.blogspot.com/&quot;&gt;Ben Evans&lt;/a&gt; and &lt;a href=&quot;http://martijnverburg.blogspot.com/&quot;&gt;Martijn Verburg&lt;/a&gt; mention in the beginning of the book that they wrote it as a training guide to get new Java developers up to speed. For my talk, I wanted to do something similar, but for Java Web Developers.&lt;/p&gt;
&lt;p&gt;I mentioned that the first thing you have to do to become modern is to change your title from a Java Web Developer to a &lt;em&gt;JVM&lt;/em&gt; Web Developer. After doing that, you have a whole slew of new and wonderful technologies at your disposal. From there, I believe the Modern JVM Web Developer: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starts with Fast Hardware&lt;/li&gt;
&lt;li&gt;Uses IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;Leverages jQuery, HTML5, and CSS3&lt;/li&gt;
&lt;li&gt;Creates High Performance Web Sites&lt;/li&gt;
&lt;li&gt;For Mobile Devices&lt;/li&gt;
&lt;li&gt;In the Cloud&lt;/li&gt;
&lt;li&gt;And cares about Security&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/16515789&quot; width=&quot;514&quot; height=&quot;422&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px; &quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;You can also &lt;a href=&quot;http://www.slideshare.net/mraible/the-modern-java-web-developer-denver-jug-2013&quot;&gt;view this presentation on Slideshare&lt;/a&gt; or &lt;a href=&quot;http://raibledesigns.com/rd/page/publications&quot;&gt;download it from my presentations page&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;
The second talk was on Java Web Application Security and was largely an updated version of the talk I gave a couple years ago, starting with &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;an appearance at the Utah JUG&lt;/a&gt;. It was mostly a live demo session using my &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;Ajax Login&lt;/a&gt; application. To prepare the project for this talk, I created &lt;a href=&quot;https://github.com/mraible/ajax-login/branches&quot;&gt;branches for each step&lt;/a&gt;. This means you can checkout the &quot;baseline&quot; branch and use Git to compare it with the &quot;javaee&quot; branch. You can also compare the &quot;spring-security&quot; branch vs. the &quot;apache-shiro&quot; branch. Finally, you could see &lt;a href=&quot;https://github.com/mraible/ajax-login/commit/9a45b74b0b1c85c3e02f3824bc57f0cf76423000&quot;&gt;what I needed to do&lt;/a&gt; to fix many of the vulnerabilities found by &lt;a href=&quot;https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project&quot;&gt;Zed Attack Proxy&lt;/a&gt;. &lt;/p&gt;

&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/16515810&quot; width=&quot;514&quot; height=&quot;422&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;You can also &lt;a href=&quot;http://www.slideshare.net/mraible/java-web-application-security-denver-jug-2013&quot;&gt;view this presentation on Slideshare&lt;/a&gt; or &lt;a href=&quot;http://raibledesigns.com/rd/page/publications&quot;&gt;download it from my presentations page&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Thanks to the DJUG and &lt;a href=&quot;http://www.businessatthrive.com/v3/&quot;&gt;Thrive&lt;/a&gt; folks for providing good beer (especially the Guinness!) and &lt;a href=&quot;http://www.fullcontact.com/&quot;&gt;FullContact&lt;/a&gt; for hosting. Also, I&apos;d like to thank Manning for the copies of &lt;a href=&quot;http://manning.com/evans/&quot;&gt;The Well-Grounded Java Developer&lt;/a&gt; they sent and No Starch Press for copies of Michal Zalewsky&apos;s &lt;a href=&quot;http://lcamtuf.coredump.cx/tangled/&quot;&gt;The Tangled Web: A Guide to Securing Modern Web Applications&lt;/a&gt;. Last, but certainly not least, thanks to all the good people who attended and listened to me ramble on about all this cool technology.&lt;/p&gt;
&lt;p&gt;
Future speaking engagements include &lt;a href=&quot;http://www.devoxx.com/display/FR13/Matt+Raible&quot;&gt;Devoxx France&lt;/a&gt; in March and Denver&apos;s &lt;a href=&quot;http://www.meetup.com/HTML5-Denver-Users-Group/events/93212272/&quot;&gt;HTML5 User Group&lt;/a&gt; in April.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_light_2_2_1</id>
        <title type="html">AppFuse Light 2.2.1 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_light_2_2_1"/>
        <published>2013-01-24T19:43:20-07:00</published>
        <updated>2013-01-25T01:47:18-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse-light" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">In December, the &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; Team &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;released 2.2.1&lt;/a&gt;. Right before that release, I decided to wait on enhancing its &quot;light&quot; modules, a.k.a. &lt;a href=&quot;https://github.com/appfuse/appfuse-light&quot;&gt;AppFuse Light&lt;/a&gt;. I&apos;m glad I did, because it took some effort to get jQuery and Bootstrap integrated, as well as to make it more secure. 
&lt;/p&gt;
&lt;p&gt;
The good news is AppFuse Light 2.2.1 is released and it&apos;s sitting out on the &lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cappfuse-light&quot;&gt;Central Repository&lt;/a&gt;. This release is a refactoring of all  archetypes to be up-to-date with the AppFuse 2.2.1 release. This means Java 7 compatibility, Servlet 3, Bootstrap/jQuery integration, Tapestry 5.3.6 upgrade and security improvements. I integrated Bootstrap and jQuery using &lt;a href=&quot;http://www.webjars.org/documentation&quot;&gt;WebJars Servlet 3 support&lt;/a&gt; since it was simple and straightforward. 
&lt;/p&gt;
&lt;p&gt;
You can create projects using AppFuse&apos;s light archetypes using a command such as the following:
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes 
  -DarchetypeArtifactId=appfuse-light-spring-freemarker-archetype -DarchetypeVersion=2.2.1 
  -DgroupId=com.mycompany -DartifactId=myproject 
&lt;/pre&gt;
&lt;p&gt;
The list of archetypes is as follows:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appfuse-light-jsf-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-spring-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-spring-freemarker-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-spring-security-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-stripes-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-struts-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-tapestry-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-wicket-archetype&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; will help you get setup and demos are available at the following links:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;JSF 2 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-spring&quot;&gt;Spring MVC 3 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-spring-freemarker&quot;&gt;Spring MVC 3 + FreeMarker + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-spring-security&quot;&gt;Spring MVC 3 + Spring Security + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-stripes&quot;&gt;Stripes + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts&quot;&gt;Struts 2 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-tapestry&quot;&gt;Tapestry 5 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-wicket&quot;&gt;Wicket + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have questions about AppFuse, we invite you to ask them on the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;users mailing list&lt;/a&gt; or tweet using #appfuse. &lt;/p&gt;
&lt;p&gt;
For those enjoying &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;Bootstrap&lt;/a&gt; in your apps, I encourage you to check out &lt;a href=&quot;https://wrapbootstrap.com/&quot;&gt;{wrap}bootstrap&lt;/a&gt; and &lt;a href=&quot;http://bootswatch.com/&quot;&gt;Bootswatch&lt;/a&gt;.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_2_1_released</id>
        <title type="html">AppFuse 2.2.1 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_2_1_released"/>
        <published>2012-12-11T15:21:44-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are Hibernate 4, Struts 2.3.7, Apache CXF 2.7.0 and Spring Security 3.1.3. In addition, we&apos;ve integrated HTML5, Twitter Bootstrap, jQuery and replaced Compass with Hibernate Search. Last but not least, we&apos;ve added full support for Java 7 and integrated many &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part4&quot;&gt;security improvements&lt;/a&gt;. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.2.1&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;AppFuse is a full-stack framework for building web applications on the JVM. It was originally developed to eliminate the ramp-up time when building new web applications. Over the years, it has matured into a very testable and secure system for creating Java-based webapps.
&lt;/p&gt;

&lt;p&gt;Demos for this release can be viewed at &lt;a href=&quot;http://demo.appfuse.org/&quot;&gt;http://demo.appfuse.org&lt;/a&gt;. Please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; style=&quot;font-weight: bold&quot;&gt;QuickStart Guide&lt;/a&gt; to get started with this release. &lt;/p&gt;

&lt;p&gt;A number of blog posts were written about features that went into this release while it was being developed:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with&quot;&gt;Improving AppFuse&apos;s PageSpeed with Apache&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_news_liquibase_and_wro4j&quot;&gt;New Liquibase and wro4j Tutorials from J. Garc&#237;a&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search&quot;&gt;AppFuse News: GitHub, Hibernate Search and The Future&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with&quot;&gt;Refreshing AppFuse&apos;s UI with Twitter Bootstrap&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security&quot;&gt;Upgrading AppFuse to Spring Security 3.1 and Spring 3.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/integrating_oauth_with_appfuse_and&quot;&gt;Integrating OAuth with AppFuse and its REST API&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;mailing list&lt;/a&gt;. If you find any issues, please &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/ANN-AppFuse-2-2-1-Released-td4656067.html&quot;&gt;report them on the users mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot; style=&quot;color: #666&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; style=&quot;color: #666&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot; style=&quot;color: #666&quot;&gt;Contegix&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com&quot; style=&quot;color: #666&quot;&gt;JetBrains&lt;/a&gt;. We highly recommend using the new &lt;a href=&quot;http://blogs.jetbrains.com/idea/2012/12/intellij-idea-12-is-available-for-download/&quot;&gt;IntelliJ IDEA 12&lt;/a&gt; for developing web applications.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_well_grounded_java_developer</id>
        <title type="html">The Well-Grounded Java Developer Book Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_well_grounded_java_developer"/>
        <published>2012-11-21T09:54:25-07:00</published>
        <updated>2020-12-09T17:10:13-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="martijnverburg" scheme="http://roller.apache.org/ns/tags/" />
        <category term="manning" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="clojure" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java7" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bookreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="benevans" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://www.manning.com/evans/&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/java7developer.jpg&quot; width=&quot;150&quot; height=&quot;188&quot; alt=&quot;Well-Grounded Java Developer&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
After finishing &lt;a href=&quot;http://raibledesigns.com/rd/entry/core_html5_canvas_book_review&quot;&gt;Core HTML5 Canvas&lt;/a&gt;, I dived into the next book on my list: &lt;a href=&quot;http://www.manning.com/evans/&quot;&gt;The Well-Grounded Java Developer&lt;/a&gt; by &lt;a href=&quot;http://boxcatjunction.blogspot.com/&quot;&gt;Ben Evans&lt;/a&gt; and &lt;a href=&quot;http://martijnverburg.blogspot.com/&quot;&gt;Martijn Verburg&lt;/a&gt;. I&apos;ve known about this book since April of last year when I received an email from Martijn. He wanted to use some of my graphs and research on JVM Web Frameworks as evidence that many frameworks aren&apos;t meeting developer&apos;s needs and to support their coverage of Grails in the book. 
&lt;/p&gt;
&lt;p&gt;
I agreed and also did a quick review on Chapter 13, Rapid Web Development. In June of this year, I received another email saying the book was done and they&apos;d send me a free copy. I received the book in &lt;a href=&quot;https://twitter.com/mraible/status/234338414810497026&quot;&gt;early August&lt;/a&gt;, but didn&apos;t start reading it until mid September.
&lt;/p&gt;
The book is broken up into 4 separate parts:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developing with Java 7&lt;/li&gt;
&lt;li&gt;Vital techniques&lt;/li&gt;
&lt;li&gt;Polyglot programming on the JVM&lt;/li&gt;
&lt;li&gt;Crafting the polyglot project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Developing with Java 7&lt;/strong&gt;&lt;br/&gt;
The first two chapters on Java 7 and NIO.2 (aka JSR-203) were great in that I started learning new things immediately. While I knew about most of the changes (strings in switch statements, improved exception handling, try-with-resources, diamond syntax, etc.), it was a nice refresher and motivated me to install Java 7 and start using it on a daily basis. The NIO.2 chapter covers the new filesystem support with &lt;a href=&quot;http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html&quot;&gt;Path&lt;/a&gt;, the &lt;a href=&quot;http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html&quot;&gt;Files&lt;/a&gt; helper class and Asynchronous I/O.&lt;/p&gt;
&lt;p&gt;It was around this same time that I started on &lt;a href=&quot;https://www.coursera.org/&quot;&gt;Coursera&apos;s&lt;/a&gt; &lt;a href=&quot;https://www.coursera.org/course/progfun&quot;&gt;Functional Programming Principles in Scala&lt;/a&gt;. I quickly realized the course was going to take quite a bit of my free time (5-7 hours per week). It was a good challenge to try and read for 30 minutes a day as well as stay on top of my Scala homework. However, it was also highly rewarding in all the knowledge I received in the last two months.&lt;/p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vital techniques&lt;/strong&gt;&lt;br/&gt;
This section covers Dependency Injection, Concurrency, Class files, and Bytecode and Performance Tuning. I skimmed through the DI chapter but slowed down to try and get my head around concurrency. Then I thanked my lucky stars I haven&apos;t had to deal with it much. I found the class files and bytecode chapter mildly interesting but perked up again to learn more about how to do performance tuning, VisualVM, and the new G1 garbage collector.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Polyglot programming on the JVM&lt;/strong&gt;&lt;br/&gt;
The polyglot programming section was largely a reinforcement of my existing knowledge since I&apos;ve used Groovy and Scala quite a bit. The chapter on Clojure was an eye-opener since I hadn&apos;t used Clojure before. I wasn&apos;t quite convinced of its merits, but I did learn enough to read and understand its syntax. Reading the Scala chapter while doing the Coursera course made me realize that Ben and Martijn really packed a lot into each language&apos;s chapter. This section is really a great intro to all these languages, especially if you&apos;ve never worked with them before.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crafting the polyglot project&lt;/strong&gt;&lt;br/&gt;
While the final section was good, I learned the least in this section. While the concepts discussed in this section are important, they&apos;re also things I&apos;ve been using for years: TDD, CI, and Rapid Web Development (with Grails). This section touched on Hibernate when discussing TDD and I thought to myself - it&apos;s strange they don&apos;t have cover Hibernate (or JPA) as part of being a well-grounded Java developer. My guess is the authors assumed most Java devs already know it.
&lt;/p&gt;
&lt;p&gt;
The final chapter had a lot of tips on staying well-grounded (what&apos;s coming in Java 8, how the JVM is supporting polyglot programming, future concurrency trends, and new directions in the JVM). 
&lt;/p&gt;
&lt;p&gt;I really enjoyed this book and feel I became a more knowledgeable Java developer by reading it. It contained a lot of high-level concepts as well as nitty-gritty details. In my opinion, the sign of a great book is one that you feel you&apos;ll refer back to as a reference guide. The first half of this book definitely feels like something I&apos;ll refer back to. The second half I&apos;ll recommend to Java developers wanted to get caught up with the latest trends. 
&lt;/p&gt;
&lt;p&gt;
Nice work Ben and Martijn!</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/why_the_bias_against_jsf</id>
        <title type="html">Why the bias against JSF?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/why_the_bias_against_jsf"/>
        <published>2012-11-08T09:24:27-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">In my last post about &lt;a href=&quot;http://raibledesigns.com/rd/entry/infoq_s_top_20_web&quot;&gt;InfoQ&apos;s Top 20 Web Frameworks for the JVM&lt;/a&gt;, I received a thought-provoking &lt;a href=&quot;http://raibledesigns.com/rd/entry/infoq_s_top_20_web#comment-1352305197000&quot;&gt;comment&lt;/a&gt; from &lt;a href=&quot;http://henk53.wordpress.com/&quot;&gt;henk53&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
There is one little thing that does bother me in those presentations, and that&apos;s your fairly obvious bias against JSF. &lt;br/&gt;...&lt;br/&gt;
If you are presenting yourself as, more or less, an authority on comparing web frameworks, then having a fairly obvious biased against one of them is just peculiar. I, all of my team, and various clients distrust your ranking of JSF. We do look at your data if the choice is between other frameworks, but as soon as JSF comes into the picture we just look elsewhere.
&lt;br/&gt;&lt;br/&gt;
I&apos;m not really sure where this bias comes from. Yes, JSF 1.0 sucked and 1.2 was only marginally better, but 2.0 is really cool and productive and there are SUPERB component and utility libraries now like PrimeFaces and OmniFaces. As a researcher of this topic I think you should keep up the date and not stick to some old grudge.
&lt;/p&gt;
&lt;p&gt;This is true, I am biased against JSF. It all started with my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_jsf_experience&quot;&gt;first JSF experience&lt;/a&gt; back in August 2004. If you remember correctly, 2004 was a big year: JSF 1.0, Spring 1.0 and Flex 1.0 were all released. The &quot;AJAX&quot; term was coined in &lt;a href=&quot;http://www.adaptivepath.com/ideas/ajax-new-approach-web-applications&quot;&gt;early 2005&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/4378559350/&quot; title=&quot;History of Web Frameworks by mraible, on Flickr&quot;&gt;&lt;img src=&quot;//farm5.staticflickr.com/4067/4378559350_13f0755403.jpg&quot; width=&quot;500&quot; height=&quot;234&quot; alt=&quot;History of Web Frameworks&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;By &lt;a href=&quot;http://raibledesigns.com/rd/entry/jsf_still_sucks&quot;&gt;2007&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_wrong_with_jsf&quot;&gt;2008&lt;/a&gt;, JSF still hadn&apos;t gotten any better. In late 2009, JSF 2.0 was released and &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_to_jsf_2&quot;&gt;I upgraded in March 2011&lt;/a&gt;. As you can see from the aforementioned post, I ran into quite a few issues upgrading. JSF was also the &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry&quot;&gt;hardest one to get working with extension-less URLs&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Most of my issues with JSF come from having maintained an application built with it since 2004. If I were to start a new application without any legacy migration issues, I imagine it wouldn&apos;t be as difficult. However, if you compare it to Struts 2 and Spring MVC, I&apos;ve had little-to-no issues upgrading those applications over the years. &lt;/p&gt;
&lt;p&gt;Also, I&apos;m not just biased against JSF, but most component-based web frameworks. Just ask the Tapestry and Wicket folks. They&apos;ve felt my criticisms over the years. My reason for preferring request-based frameworks like Struts 2/Spring MVC and Grails/Play has been because I&apos;ve never seen the appeal in component-based frameworks. Often I&apos;ve found that their components are just widgets that you can get from any decent JavaScript framework. And chances are that JavaScript framework can work with &lt;em&gt;any&lt;/em&gt; web framework. Also, I&apos;ve worked on a lot of high-traffic web applications that require statelessness for scalability.&lt;/p&gt;
&lt;p&gt;I see the value in component-based frameworks, I just don&apos;t think components should be authored on the server-side. Most of the Java-based component frameworks require 2+ files for components (one for the component, one for the view, possibly one for the config). I love GWT&apos;s component concept in that you can just extract a class and re-use it. With JS frameworks, you can often just include a script. These days, when I think of good component-based frameworks, I think of jQuery UI and Twitter Bootstrap.&lt;/p&gt;
&lt;p&gt;All that being said, there&apos;s a lot of folks praising JSF 2 (and &lt;a href=&quot;http://primefaces.org/&quot;&gt;PrimeFaces&lt;/a&gt; moreso). That&apos;s why I&apos;ll be integrating it (or merging your pull request) into the 2.3 release of AppFuse. Since PrimeFaces contains a Bootstrap theme, I hope this is a pleasant experience and my overall opinion of JSF improves.&lt;/p&gt;
&lt;p&gt;In other component-based frameworks in AppFuse news, Tapestry 5 has gotten &lt;em&gt;really fast&lt;/em&gt; in the last year. I imagine this is because we have a Tapestry expert, &lt;a href=&quot;http://www.linkedin.com/in/sergeeby&quot;&gt;Serge Eby&lt;/a&gt;, working on it. And we&apos;re planning on adding Wicket in the 2.3 release. &lt;/p&gt;
&lt;p&gt;So even though I &lt;em&gt;prefer&lt;/em&gt; request-based frameworks with REST support and Bootstrap, that doesn&apos;t mean everyone does. I&apos;ll do my best to be less-biased in the future. However, please remember that my view on web frameworks is as a developer, not an analyst. And aren&apos;t developers &lt;em&gt;supposed&lt;/em&gt; to be opinionated? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/deploying_java_and_play_framework</id>
        <title type="html">Deploying Java and Play Framework Apps to the Cloud with James Ward</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/deploying_java_and_play_framework"/>
        <published>2011-11-18T08:14:45-07:00</published>
        <updated>2011-12-02T20:23:49-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sbt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springroo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="heroku" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx2011" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jamesward" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Yesterday, I attended &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt;&apos;s presentation on &lt;a href=&quot;http://www.devoxx.com/pages/viewpage.action?pageId=5015973&quot;&gt;Deploying Java &amp;amp; Play Framework Apps to the Cloud&lt;/a&gt; at Devoxx. I arrived a bit late, but still managed to get there in time to see a lot of demos and learn more about &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt;. Below are my notes from James&apos;s talk.
&lt;/p&gt;
&lt;p&gt;When I arrived, James was doing a demo using &lt;a href=&quot;http://www.springsource.org/spring-roo&quot;&gt;Spring Roo&lt;/a&gt;. He was using Roo&apos;s Petclinic sample app and showed us how you could use Git to create a local repository of the new project and install Heroku&apos;s command line tool. From there, he ran the following command to create a new application on Heroku.
&lt;/p&gt;
&lt;pre&gt;heroku create -s cedar&lt;/pre&gt;
&lt;p&gt;The &lt;a href=&quot;http://devcenter.heroku.com/articles/cedar&quot;&gt;Cedar Stack&lt;/a&gt; is what supports Java, Scala and Play Framework. It&apos;s the 3rd generation stack for Heroku. The command above created two endpoints, one for HTTP and one for Git. It picks from a list of randomly generated names, which all seem to have some humor in them. James ended up with &quot;electric-sword-8877&quot; for this demo.&lt;/p&gt;
&lt;p&gt;From there, he ran &lt;code&gt;git push heroku master&lt;/code&gt; to deploy the project to Heroku. Unfortunately, this resulted in a login error and there was an akward moment where we all thought the Demo Gods were angry. However, James was able to resolve this by using Heroku&apos;s sharing feature with the following command.
&lt;/p&gt;
&lt;pre&gt;
heroku sharing:add jw@heroku.com
&lt;/pre&gt;
&lt;p&gt;For Java projects, Heroku looks for a pom.xml file in the root directory and runs a Maven build on project. All the dependencies get downloaded on the cloud rather than put them into a WAR and requiring you to upload a large WAR file. You don&apos;t have to upload your source code to Heroku; James did it for the sake of the demo because it was faster.
&lt;/p&gt;
&lt;p&gt;After the build finishes, it creates a &lt;em&gt;slug&lt;/em&gt; file. This file contains everything Heroku needs to run your application. 
&lt;p&gt;Next, James showed a demo of the running application and added a new Pet through its UI. Then he scaled it to two servers using the following command:
&lt;/p&gt;
&lt;pre&gt;
heroku scale web=2
&lt;/pre&gt;
&lt;p&gt;
He proved this was working by running &lt;code&gt;heroku ps&lt;/code&gt;, which showed there were two running processes. He showed the app again, but noted that the record he added was missing. This is because when it started up a new dyno, Hibernate created the schema again and deleted all records. To fix, James changed Hibernate to only update the schema instead of create a new one. If you&apos;re a Hibernate user, you know this is as simple as changing:
&lt;/p&gt;
&lt;pre&gt;
hibernate.hbm2ddl.auto=create
&lt;/pre&gt;
&lt;p&gt;to:
&lt;pre&gt;
hibernate.hbm2ddl.auto=update
&lt;/pre&gt;
&lt;p&gt;After committing this change, James redeployed using Git.
&lt;/p&gt;
&lt;pre&gt;
git push heroku master
&lt;/pre&gt;
&lt;p&gt;The slug file got built again and Heroku deployed the new slug onto both dynos, automatically load balancing the app across two servers. James then ran &lt;code&gt;heroku logs&lt;/code&gt; to see the logs of his dynos and prove that a request to his app&apos;s HTTP endpoint made requests to both dynos. The logging is powered by &lt;a href=&quot;https://github.com/heroku/logplex&quot;&gt;Logplex&lt;/a&gt; and you can read about how it works in the article &lt;a href=&quot;http://blog.heroku.com/archives/2010/12/13/logging/&quot;&gt;Heroku Gets Sweet Logging&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;James mentioned that Roo has a Heroku plugin, but after watching his talk and searching a bit on the internet, it seems it&apos;s just the jetty-runner setup as described in &lt;a href=&quot;http://devcenter.heroku.com/articles/spring-mvc-hibernate&quot;&gt;Getting Started with Spring MVC Hibernate on Heroku/Cedar&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
What about autoscaling? There are some 3rd party tools that do this. Heroku&apos;s Management infrastructure has APIs that these tools talk too. Heroku hasn&apos;t built autoscaling into the platform because they don&apos;t know where the bottlenecks are in your application.
&lt;/p&gt;
&lt;p&gt;
Heroku = Polyglot + PaaS + Cloud Components. It supports Ruby, node.js, Java, Clojure, Play and Scala and they&apos;re working on native Grails and Gradle support. There&apos;s currently 534,374 apps running on Heroku.
&lt;/p&gt;
&lt;p&gt;
Heroku is a cloud application platform and there&apos;s 5 different components. 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instant deployment&lt;/li&gt;
&lt;li&gt;HTTP Routing / Load Balancing&lt;/li&gt;
&lt;li&gt;Elastic Polyglot Runtime&lt;/li&gt;
&lt;li&gt;Management &amp;amp; Logging&lt;/li&gt;
&lt;li&gt;Component as a Service Ecosystem&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
For instant deployment, it&apos;s a pretty simple process:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;You add files to a git repo&lt;/li&gt;
&lt;li&gt;You provision the app on Heroku (heroku create)&lt;/li&gt;
&lt;li&gt;You upload the files to Heroku (git push heroku master)&lt;/li&gt;
&lt;li&gt;Heroku runs the build and assembles a &quot;slug&quot; file&lt;/li&gt;
&lt;li&gt;Heroku starts a &quot;dyno&quot;&lt;/li&gt;
&lt;li&gt;Heroku copies the &quot;slug&quot; to the &quot;dyno&quot;&lt;/li&gt;
&lt;li&gt;Heroku starts the web application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most apps will contain a &lt;em&gt;Procfile&lt;/em&gt; that contains information about how to run the web process. For Spring Roo, it has:
&lt;/p&gt;
&lt;pre&gt;
web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war
&lt;/pre&gt;
&lt;p&gt;So how does Heroku decide what application server to use? It doesn&apos;t, you do. You need to get your application server into the slug file. 
The easiest way to do this is to specify your application server as a dependency in your pom.xml. In the Roo example, James uses the maven-dependency-plugin to get the jetty-runner dependency and copy it to the target directory. On Heroku, you bring your application server with you.
&lt;/p&gt;
&lt;p&gt;Heroku gives you 750 free dyno hours per app, per month. For developers, it&apos;s very easy to get started and use. Once you extend past one dyno, it&apos;s
  $.05 per dyno hour, which works out to around $30/month.

It&apos;s only when you want to scale beyond one dyno where you get charged by Heroku, no matter how much data you transfer.

&lt;a href=&quot;http://www.scalatest.org/&quot;&gt;Scalatest&lt;/a&gt; is running on Heroku. It has one dyno and is doing fine with that. Bill Venners doesn&apos;t have to pay anything for it.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://java.herokuapp.com&quot;&gt;java.herokuapp.com&lt;/a&gt; is a site James created that allows you to clone example apps and get started quickly with Heroku&apos;s Cedar Stack.&lt;/p&gt;
&lt;p&gt;
For 
HTTP Routing, 
Heroku uses an Erlang-based routing system to route all the HTTP requests across your dynos. Heroku doesn&apos;t support sticky sessions. Distributed session management does not work well, because it does not scale well. Heroku recommends you use a stateless web architecture or move your state into something like &lt;a href=&quot;http://memcached.org/&quot;&gt;memcached&lt;/a&gt;. Jetty has (in the latest version) the ability to automatically serialize your session into a Mongo system. This works fine on Heroku. The problem with this is if you have 2 dynos running, each request can hit a different dyno and get different session state. Hence the recommendation for an external storage mechanism that can synchronize between dynos.
&lt;/p&gt;
You can also run non-web applications on Heroku. You can have one web process, but as many non-web processes as you want.
&lt;/p&gt;
&lt;p&gt;Heroku has native support for the &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play framework&lt;/a&gt;. To detect Play applications, it look for a &lt;em&gt;conf/application.conf&lt;/em&gt; file. You don&apos;t need to have a Procfile in your root directory because Heroku knows how to start a Play application.
&lt;/p&gt;
&lt;p&gt;At this point, James created a new Play application, created a new Heroku app (he got &quot;young-night-7104&quot; this time) and pushed it to Heroku. He created a simple model object, a controller to allow adding new data and then wrote some jQuery to show new records via Ajax and JSON. He also showed how to configure the application to talk to Heroku&apos;s PostgreSQL database using the DATABASE_URL environment variable. He explained how you can use the &lt;code&gt;heroku config&lt;/code&gt; command to see your environment variables.
&lt;/p&gt;
&lt;p&gt;
The reason they use environment variables is so Heroku can update DATABASE_URL (and other variables) without having to call up all their customers and have them change them in their source code.
&lt;/p&gt;
&lt;p&gt;
Play on Heroku supports Scala if you create your app with Scala. Play 2.0 uses Scala, Akka and SBT. Heroku added support for SBT a couple month ago, so everything will work just fine.
&lt;/p&gt;
&lt;p&gt;Heroku also supports Scala, detecting it by looking for the &lt;code&gt;build.sbt&lt;/code&gt; file in the root directory. Heroku supports SBT 0.11.0 and it builds the &apos;stage&apos; task.
It currently does not support Lift because Lift uses an older version of SBT and because it&apos;s a very stateful framework that would require sticky sessions. Use Play, &lt;a href=&quot;https://github.com/jdegoes/blueeyes&quot;&gt;BlueEyes&lt;/a&gt; or &lt;a href=&quot;http://www.scalatra.org/&quot;&gt;Scalatra&lt;/a&gt; if you want Scala on Heroku.
&lt;/p&gt;
&lt;p&gt;Heroku has &lt;a href=&quot;http://addons.heroku.com&quot;&gt;addons&lt;/a&gt; for adding functionality to your application, including Custom DNS, HTTPS, Amazon RDS, NoSQL and many more. They&apos;re also working on making their add-on and management APIs available via Java, so you&apos;ll (hopefully) be able to use them from your IDE in the future.
&lt;/p&gt;
&lt;p&gt;From there, James showed us how Heroku keeps slug files around so you can do rollbacks with &lt;code&gt;heroku rollback&lt;/code&gt;. He also showed how you can use:
&lt;/p&gt;
&lt;pre&gt;heroku run &quot;your bash command&quot;&lt;/pre&gt;
to run any Bash command on the cloud.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br&gt;
I attended James&apos;s talk because he&apos;s a good friend, but also because I&apos;ve been using Heroku to host &lt;a href=&quot;http://raibledesigns.com/rd/entry/phonegap_to_the_rescue&quot;&gt;my latest adventures with Play, Scala, CoffeeScript and Jade&lt;/a&gt;. I&apos;m glad I attended because I learned some good tips and tricks and more about how Heroku works. 
&lt;/p&gt;
&lt;p&gt;Heroku seems like a great development tool to me. In my experience, it&apos;s been really nice to have instant deployments using Git. In fact, I&apos;ve created a &apos;push&apos; alias so I can push to my project&apos;s repo and heroku at the same time.
&lt;/p&gt;
&lt;pre&gt;
alias push=&apos;git push origin master &amp;&amp; git push heroku master&apos;
&lt;/pre&gt;
&lt;p&gt;I&apos;d like to see more organizations embrace something like Heroku for developers. It&apos;d be great if everyone had their own sandbox that business owners and product managers could see. I can&apos;t help but think this would be awesome for demos, prototyping, etc.
&lt;/p&gt;
&lt;p&gt;
There were some other talks I wanted to attend at the same time, particularly Martin Odersky&apos;s &lt;a href=&quot;http://www.devoxx.com/pages/viewpage.action?pageId=5015952&quot;&gt;What&apos;s in store for Scala?&lt;/a&gt; and &lt;a href=&quot;http://www.devoxx.com/display/DV11/WWW++World+Wide+Wait++A+Performance+Comparison+of+Java+Web+Frameworks&quot;&gt;WWW: World Wide Wait? A Performance Comparison of Java Web Frameworks&lt;/a&gt;. The WWW talk has &lt;a href=&quot;http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/&quot;&gt;posted their presentation&lt;/a&gt; but I&apos;m sure it&apos;d be more fun to watch. 
&lt;/p&gt;
&lt;p&gt;
It&apos;s pretty awesome that all the talks from Devoxx 2011 will be up on &lt;a href=&quot;http://www.parleys.com/&quot;&gt;Parleys.com&lt;/a&gt; soon.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; James has &lt;a href=&quot;http://www.jamesward.com/2011/11/29/heroku-preso-from-devoxx-2011&quot;&gt;posted his slides&lt;/a&gt; from this talk.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/how_do_you_get_started</id>
        <title type="html">How do you get started in programming?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/how_do_you_get_started"/>
        <published>2011-07-28T11:12:09-06:00</published>
        <updated>2011-07-28T17:16:14-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="programming" scheme="http://roller.apache.org/ns/tags/" />
        <category term="opensource" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I recently received the email below from someone asking how he might get started in programming. I think this is a popular topic, especially given the current economic situation in the US (&lt;a href=&quot;http://www.huffingtonpost.com/david-honig/coming-to-terms-with-the-_b_908181.html&quot;&gt;unemployment is high, but not in the tech industry&lt;/a&gt;). For that reason, I figured I&apos;d post my response here and allow others to chime in with their advice.
&lt;/p&gt;
&lt;p class=&quot;quote&quot; style=&quot;color: #666; background: #eee; border: 1px solid silver; border-left: 5px solid silver&quot;&gt;
I read about you on LinkedIn, forgive my intrusion. Since you seem like an expert in the field of designing websites I wanted to know your thoughts on switching into this field late in life. I am 41 and looking to make the move from an unrelated field (finance) to programming.  So far I have learned HTML, CSS and some Javascript.   I have taken classes on C and Java.   I have made some basic Android phone apps. 
&lt;br/&gt;&lt;br/&gt;
What languages do you think I should focus on?  What is the fastest way to get up to speed to make a career of it?  Classes?  Take a entry level job?  Study on my own?
 &lt;br/&gt;&lt;br/&gt;
Thanks for any insights&#8230;.
&lt;/p&gt;
&lt;p&gt;My reply:&lt;/p&gt;
&lt;p class=&quot;quote&quot; style=&quot;color: #666; background: #ffd&quot;&gt;
It&apos;s interesting that you&apos;re switching from finance to programming. I did the same thing early on in my career, but I was fortunate enough to do it in college (I have degrees in Russian, International Business and Finance) and therefore able to audit some CS classes before I graduated.
&lt;br/&gt;&lt;br/&gt;
I think the most valuable skills these days are front-end skills (HTML, CSS and JavaScript). If you can combine those skills with the ability to design websites, you&apos;ll go along way. I&apos;ve taken a different approach where I have excellent front-end skills, but also know a lot about the backend. 
&lt;br/&gt;&lt;br/&gt;
While it helps to have a Java background these days, the real sweat spot is the JVM and the containers that run on it like Tomcat and Jetty. A lot of Java developers are learning Groovy and Scala, but unfortunately a lot of their documentation/books are targeted towards Java developers.
&lt;br/&gt;&lt;br/&gt;
The fastest way to get up-to-speed on it is to start your own project (if you can&apos;t get a company to hire you to do it). I&apos;d suggest creating a webapp that solves a problem that you have, makes your life easier, etc. If you open source it and build a community around it, that&apos;s just as good as working for a company as far as experience goes. Combine this with studying on your own and you can likely come up to speed very quickly.
&lt;/p&gt;
&lt;p&gt;As a programmer, what advice do you have for someone looking to switch careers, or get into our industry fresh out of college? </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/installing_openjdk_7_on_os</id>
        <title type="html">Installing OpenJDK 7 on OS X</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/installing_openjdk_7_on_os"/>
        <published>2011-07-12T14:11:44-06:00</published>
        <updated>2012-10-11T16:05:10-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="osx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="mac" scheme="http://roller.apache.org/ns/tags/" />
        <category term="openjdk" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java7" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last week, I &lt;a href=&quot;http://java.dzone.com/articles/introducing-java-7-moving&quot;&gt;scanned an article&lt;/a&gt; and saw there was a &lt;a href=&quot;http://www.oracle.com/webapps/events/ns/EventsDetail.jsp?p_eventId=134208&quot;&gt;Java 7 Webinar&lt;/a&gt;. At first, I thought Java 7 was released, but soon after realized it was a &lt;a href=&quot;http://jdk7.java.net/preview/&quot;&gt;Developer Preview&lt;/a&gt;. Unfortunately, the &lt;a href=&quot;http://jdk7.java.net/download.html&quot;&gt;download page&lt;/a&gt; doesn&apos;t have support for OS X. Since it took me a bit of work to figure out how to install OpenJDK 7 on OS X (I&apos;m running Snow Leopard 10.6.7), I figured I&apos;d write down how I did it.
&lt;/p&gt;
&lt;p&gt;I started off by downloading &quot;OpenJDK 1.7 universal (32/64 bits) from Mac OS/X branch&quot; from &lt;a href=&quot;http://code.google.com/p/openjdk-osx-build/downloads/list&quot;&gt;the openjdk-osx-build project&apos;s downloads&lt;/a&gt; (&lt;a href=&quot;http://openjdk-osx-build.googlecode.com/files/OpenJDK-OSX-1.7-universal-20110709.dmg&quot;&gt;direct link&lt;/a&gt;). After downloading, I installed the dmg as normal.
&lt;/p&gt;
&lt;div class=&quot;quote&quot;  style=&quot;background: #ddfbdd; border-color: #83f082; margin-left: 0; margin-bottom: 10px; color: #666&quot;&gt;&lt;p&gt;&lt;strong&gt;Update Jan 27, 2012:&lt;/strong&gt;&lt;br/&gt;After installing the dmg, add the following to your ~/.profile and you should be good to go. Thanks to &lt;a href=&quot;http://raibledesigns.com/rd/entry/installing_openjdk_7_on_os#comment-1311684547000&quot;&gt;Mark Beaty for the tip&lt;/a&gt;. &lt;/p&gt;
&lt;pre&gt;
function setjdk() { if [ $# -ne 0 ];then export JAVA_HOME=`/usr/libexec/java_home -v $@`; fi; java -version; }
&lt;/pre&gt;
&lt;p&gt;Continue with the instructions below if you don&apos;t like this technique for some reason.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I don&apos;t use Java Preferences to set my JDK, instead I use &lt;a href=&quot;http://blog.dblevins.com/&quot;&gt;David Blevin&apos;s&lt;/a&gt; handy &lt;a href=&quot;http://docs.codehaus.org/display/ninja/setjdk&quot;&gt;setjdk&lt;/a&gt; script. To make this script work with JDK 7 on OS X, I had to make one minor change. On line 40, I added &quot;Contents&quot; to the path for JAVA_HOME:
&lt;/p&gt;
&lt;pre&gt;
export JAVA_HOME=$vmdir/$ver/Contents/Home
&lt;/pre&gt;
&lt;p class=&quot;quote&quot; style=&quot;background: #ddf4fb; border-color: #82d6f0; color: #666&quot;&gt;&lt;strong&gt;Update Jan 27, 2012:&lt;/strong&gt; You no longer need to make this change.&lt;/p&gt;
&lt;p&gt;From there, I had to setup some symlinks so everything would work as expected:
&lt;/p&gt;
&lt;pre&gt;
cd /System/Library/Java/JavaVirtualMachines/
sudo ln -s /Library/Java/JavaVirtualMachines/1.7.0.jdk
&lt;/pre&gt;
&lt;div class=&quot;quote&quot;  style=&quot;background: #ddf4fb; border-color: #82d6f0; margin-left: 0; margin-bottom: 10px; color: #666&quot;&gt;&lt;p&gt;&lt;strong&gt;Update Jan 27, 2012:&lt;/strong&gt; The latest version installs at a different location so the symlink command above should be changed to:&lt;/p&gt;
&lt;pre&gt;
sudo ln -s /Library/Java/JavaVirtualMachines/1.7.0u.jdk 1.7.0.jdk
&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left&quot;&gt;Lastly, I had my JAVA_HOME set to &quot;/System/Library/Frameworks/JavaVM.framework/Home&quot;. I like the shorter (and seemingly more common) &quot;/Library/Java/Home&quot;, so I set it back to that in my ~/.profile:
&lt;/p&gt;
&lt;pre&gt;
export JAVA_HOME=/Library/Java/Home
&lt;/pre&gt;
&lt;p style=&quot;text-align: left&quot;&gt;On my system, /Library/Java/Home had a symlink to /System/Library/Frameworks/JavaVM.framework/Home, so I changed it to the CurrentJDK that Java Preferences and setjdk use.
&lt;/p&gt;
&lt;pre&gt;
cd /Library/Java
rm Home
ln -s /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Contents/Home
&lt;/pre&gt;
&lt;p&gt;Then I had to add a symlink for 1.7 in the Versions directory.&lt;/p&gt;
&lt;pre&gt;
cd /System/Library/Frameworks/JavaVM.framework/Versions
sudo ln -s /System/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents 1.7
&lt;/pre&gt;
&lt;p&gt;After making these changes, I was able to switch to JDK 7 easily.
&lt;/p&gt;
&lt;pre&gt;
$ setjdk 1.7
Setting this terminal&apos;s JDK to 1.7 ... openjdk version &quot;1.7.0-internal&quot;
OpenJDK Runtime Environment (build 1.7.0-internal-b00)
OpenJDK 64-Bit Server VM (build 21.0-b17, mixed mode)
&lt;/pre&gt;
&lt;p&gt;I was also able to switch back to JDK 6.
&lt;/p&gt;
&lt;pre&gt;
$ setjdk 1.6
Setting this terminal&apos;s JDK to 1.6 ... java version &quot;1.6.0_26&quot;
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)
&lt;/pre&gt;
&lt;p id=&quot;maven-issues&quot;&gt;&lt;strong&gt;Maven Issues&lt;/strong&gt;&lt;br/&gt;Next, I tried using JDK 7 to build &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. I ran into two issues when I tried to do this. The first was caused by the native2ascii plugin, which has been known to &lt;a href=&quot;http://maven.apache.org/general.html#tools-jar-dependency&quot;&gt;cause issues&lt;/a&gt; on non-Mac platforms. Adding the following profile seemed to solve the problem.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;profile&amp;gt;
    &amp;lt;activation&amp;gt;
        &amp;lt;jdk&amp;gt;1.7&amp;lt;/jdk&amp;gt;
    &amp;lt;/activation&amp;gt;
    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;native2ascii-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;dependencies&amp;gt;
                    &amp;lt;dependency&amp;gt;
                      &amp;lt;groupId&amp;gt;com.sun&amp;lt;/groupId&amp;gt;
                      &amp;lt;artifactId&amp;gt;tools&amp;lt;/artifactId&amp;gt;
                      &amp;lt;version&amp;gt;1.7.0&amp;lt;/version&amp;gt;
                      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;
                      &amp;lt;systemPath&amp;gt;${java.home}/../lib/tools.jar&amp;lt;/systemPath&amp;gt;
                    &amp;lt;/dependency&amp;gt;
                &amp;lt;/dependencies&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&amp;lt;/profile&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The next issue was with &lt;a href=&quot;http://enunciate.codehaus.org&quot;&gt;Enunciate&lt;/a&gt; and its maven-enunciate-cxf-plugin. 
&lt;/p&gt;
&lt;pre&gt;
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] com/sun/mirror/apt/AnnotationProcessorFactory
com.sun.mirror.apt.AnnotationProcessorFactory
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.NoClassDefFoundError: com/sun/mirror/apt/AnnotationProcessorFactory
&lt;/pre&gt;
&lt;p&gt;It seemed like adding a profile that included tools.jar would solve this, but &lt;a href=&quot;http://markmail.org/message/kshhtwjlsgtwlvu3&quot;&gt;it doesn&apos;t&lt;/a&gt;. When I add the dependency directly to the plugin itself, I get the following error:
&lt;/p&gt;
&lt;pre&gt;
warning: The apt tool and its associated API are planned to be
removed in the next major JDK release.  These features have been
superseded by javac and the standardized annotation processing API,
javax.annotation.processing and javax.lang.model.  Users are
recommended to migrate to the annotation processing features of
javac; see the javac man page for more information.
[WARNING] Validation result has errors.
error: [core] java.lang.StackTraceElement: A TypeDefinition must have a public no-arg constructor or be annotated with a factory method.
1 error
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
&lt;/pre&gt;
&lt;p&gt;Hopefully this article helps you get started with Java 7 on OS X. If you have any additional tips, please leave a comment.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_application_security_at</id>
        <title type="html">My Java Web Application Security Presentation from Jazoon 2011</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_application_security_at"/>
        <published>2011-06-24T06:25:55-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="owaspzap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appsec" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apacheshiro" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="owasp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jazoon" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Yesterday I delivered my Java Web Application Security talk at &lt;a href=&quot;http://jazoon.com&quot;&gt;Jazoon&lt;/a&gt;. The presentation I gave was similar to the one I delivered at Utah JUG, but contains a few more slides about penetration testing and securing REST APIs. I also opted not to embed the screencasts in the presentation on SlideShare since you can click on the links to view them. Lastly, I included a great quote from &lt;a href=&quot;http://erlend.oftedal.no/blog/&quot;&gt;Erlend Oftedal&lt;/a&gt;, who left a &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part4#comment-1308826978000&quot;&gt;great comment&lt;/a&gt; on my last post. 
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&quot;Security is a quality, and as all other quality, it is important that we build it into our apps while we are developing them, not patching it on afterwards like many people do.&quot;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/8404346&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;/p&gt;
&lt;p&gt;If you&apos;d like to download a PDF of this presentation, you can do it from &lt;a href=&quot;http://www.slideshare.net/mobile/mraible/java-web-application-security-jazoon-2011&quot;&gt;Slideshare&lt;/a&gt; or from my &lt;a href=&quot;http://raibledesigns.com/rd/page/publications&quot;&gt;presentations page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Like most conferences in the last year, I brought the lovely &lt;a href=&quot;http://www.mcginityphoto.com&quot;&gt;Trish McGinity&lt;/a&gt; with me. As of today, it&apos;s been one year since I saw her switch from a Martini to a Guinness and thought &quot;I need to talk to that girl!&quot; It&apos;s been a heckuva a ride ever since and I&apos;m sure the future will be just as much fun. To celebrate, we&apos;re going to explore &lt;a href=&quot;http://www.rheinfall.ch/&quot;&gt;Rhine Falls&lt;/a&gt; and have dinner at &lt;a href=&quot;http://www.restaurant-greulich.ch/DE/Restaurant_Zurich_Gourmet.aspx&quot;&gt;Greulich&lt;/a&gt;. Happy Anniversary Trish!</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_application_security_part4</id>
        <title type="html">Java Web Application Security - Part V: Penetrating with Zed Attack Proxy</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_application_security_part4"/>
        <published>2011-06-21T07:45:41-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="owaspzap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="zedattackproxy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="owasp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appsec" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tutorial" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Web Application Security is an important part of developing applications. As developers, I think we often forget this, or simply ignore it. In my career, I&apos;ve learned a lot about web application security. However, I only recently learned and became familiar with the rapidly growing &quot;appsec&quot; industry. 
&lt;/p&gt;
&lt;p&gt;
I found a disconnect between what appsec consultants were selling and what I was developing. It seemed like appsec consultants were selling me fear, mostly because I thought my apps were secure. So I set out on a mission to learn more about web application security and penetration testing to see if my apps really were secure. This article is part of that mission, as are the previous articles I&apos;ve written in this series.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;Java Web Application Security - Part I: Java EE 6 Login Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part1&quot;&gt;Java Web Application Security - Part II: Spring Security Login Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part2&quot;&gt;Java Web Application Security - Part III: Apache Shiro Login Demo&lt;/a&gt;&lt;/li&gt;          
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part3&quot;&gt;Java Web Application Security - Part IV: Programmatic Login APIs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
When I first decided I wanted to do a talk on Webapp Security, I knew it would be more interesting if I showed the audience how to hack and fix an application. That&apos;s why I wrote it into my &lt;a href=&quot;http://raibledesigns.com/rd/entry/upcoming_conferences_tssjs_in_las&quot;&gt;original proposal&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&lt;strong&gt;Webapp Security: Develop. Penetrate. Protect. Relax.&lt;/strong&gt;&lt;br/&gt;
In this session, you&apos;ll learn how to implement authentication in your Java web applications using Spring Security, Apache Shiro and good ol&apos; Java EE Container Managed Authentication. You&apos;ll also learn how to secure your REST API with OAuth and lock it down with SSL.
&lt;br/&gt;&lt;br/&gt;
After learning how to develop authentication, I&apos;ll introduce you to OWASP, the OWASP Top 10, its Testing Guide and its Code Review Guide. From there, I&apos;ll discuss using WebGoat to verify your app is secure and commercial tools like webapp firewalls and accelerators.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;At the time, I hadn&apos;t done much &lt;a href=&quot;http://en.wikipedia.org/wiki/Penetration_test#Web_application_penetration_testing&quot;&gt;webapp pentesting&lt;/a&gt;. You can tell this from the fact that I mentioned &lt;em&gt;WebGoat&lt;/em&gt; as the pentesting tool. From &lt;a href=&quot;https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project&quot;&gt;WebGoat&apos;s Project page&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;&lt;b&gt;WebGoat&lt;/b&gt; is a deliberately insecure J2EE web application maintained by &lt;a href=&quot;http://www.owasp.org&quot;&gt;OWASP&lt;/a&gt; designed to teach web application security lessons. In each lesson, users must demonstrate their understanding of a security issue by exploiting a real vulnerability in the WebGoat application. For example, in one of the lessons the user must use &lt;a href=&quot;https://www.owasp.org//index.php/SQL_injection&quot; title=&quot;SQL injection&quot;&gt;SQL injection&lt;/a&gt; to steal fake credit card numbers. The application is a realistic teaching environment, providing users with hints and code to further explain the lesson.&lt;/p&gt;
&lt;p&gt;What I really meant to say and use was &lt;a href=&quot;https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project&quot;&gt;Zed Attack Proxy&lt;/a&gt;, also known as OWASP ZAP. ZAP is a Java Desktop application that you setup as a proxy for your browser, then use to find vulnerabilities in your application. This article explains how you can use ZAP to pentest a web applications and fix its vulnerabilities.
&lt;/p&gt;
&lt;p&gt;The application I&apos;ll be using in this article is the Ajax Login application I&apos;ve been using throughout this series. I think it&apos;s great that projects like &lt;a href=&quot;http://www.dvwa.co.uk/&quot;&gt;Damn Vulnerable Web App&lt;/a&gt; and WebGoat exist, but I wanted to test one that I &lt;em&gt;think&lt;/em&gt; is secure, rather than one I know is not secure. In this particular example, I&apos;ll be testing the Spring Security implementation, since that&apos;s the framework I most often use in my open source projects. 
&lt;/p&gt;

&lt;p id=&quot;zap-tutorial&quot;&gt;&lt;strong&gt;Zed Attack Proxy Tutorial&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#download-run&quot;&gt;Download and Run the Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#install-zap&quot;&gt;Install and Configure ZAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#scan&quot;&gt;Perform a Scan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#fix-vulnerabilities&quot;&gt;Fix Vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p id=&quot;download-run&quot;&gt;&lt;strong&gt;Download and Run the Application&lt;/strong&gt;&lt;br/&gt;
To begin, &lt;a href=&quot;http://static.raibledesigns.com/downloads/ajax-login-zap-tutorial-1.0.zip&quot;&gt;download the application&lt;/a&gt; and expand it on your hard drive. This app is the completed version of the Ajax Login application referenced in &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part1&quot;&gt;Java Web Application Security - Part II: Spring Security Login Demo&lt;/a&gt;. You&apos;ll need Java 6 and Maven installed to run the app. Run it using &lt;strong&gt;mvn jetty:run&lt;/strong&gt; and open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; in your browser. You&apos;ll see it&apos;s a simple CRUD application for users and you need to login to do anything.&lt;/p&gt;

&lt;p id=&quot;install-zap&quot;&gt;&lt;strong&gt;Install and Configure ZAP&lt;/strong&gt;&lt;br/&gt;
The &lt;a href=&quot;https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project&quot;&gt;Zed Attack Proxy&lt;/a&gt; (ZAP) is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. &lt;a href=&quot;http://code.google.com/p/zaproxy/downloads/list&quot;&gt;Download&lt;/a&gt; the latest version (I used 1.3.0) and install it on your system. After installing, launch the app and change the proxy port to 9000 (Tools &gt; Options &gt; Local Proxy). Next, configure your browser to proxy requests through port 9000 and allow localhost requests to be proxied. I used Firefox 4 (Preferences &gt; Advanced &gt; Network &gt; Connection Settings). When finished, your proxy settings should look like the following screenshot:
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5301/5841907039_d8b4ec906d_o.jpg&quot; title=&quot;Firefox Proxy Settings&quot; rel=&quot;lightbox[security-zap]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5301/5841907039_e8b204a6d8_m.jpg&quot; width=&quot;240&quot; height=&quot;239&quot; alt=&quot;Firefox Proxy Settings&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Another option (instead of removing localhost) is to add an entry to your hosts file with your production domain name. This is what I&apos;ve done for this demo.&lt;/p&gt;
&lt;pre&gt;127.0.0.1       demo.raibledesigns.com&lt;/pre&gt;
&lt;p&gt;I&apos;ve also configured Apache to proxy requests to Jetty with the following mod_proxy settings in my httpd.conf:
  &lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;IfModule mod_proxy.c&amp;gt;
    ProxyRequests Off 
    ProxyPreserveHost Off 

    &amp;lt;VirtualHost *:80&amp;gt;
       ProxyPass  /  http://localhost:8080/
    &amp;lt;/VirtualHost&amp;gt;

    &amp;lt;VirtualHost *:443&amp;gt;
        SSLEngine on
        SSLProxyEngine on
        SSLCertificateFile &quot;/etc/apache2/ssl.key/server.crt&quot;
        SSLCertificateKeyFile &quot;/etc/apache2/ssl.key/server.key&quot;

        ProxyPass  /  https://localhost:8443/
    &amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/pre&gt;
&lt;p id=&quot;scan&quot;&gt;&lt;strong&gt;Perform a Scan&lt;/strong&gt;&lt;br/&gt;
Now you need to give ZAP some data to work with. Using Firefox, I navigated to http://demo.raibledesigns.com and browsed around a bit, listing users, added a new one and deleted an existing one. After doing this, I noticed a number of flags in the ZAP UI under Sites. I then right-clicked on each site (one for http and one for https) and selected Attack &gt; Active Scan site. You should be able to do this from the &quot;Active Scan&quot; tab at the bottom of ZAP, but &lt;a href=&quot;http://code.google.com/p/zaproxy/issues/detail?id=123&quot;&gt;there&apos;s a bug when the URLs are the same&lt;/a&gt;. After doing this, I received a number of alerts, ranging from high (cross-site scripting) to low (password autocomplete). The screenshot below shows the various issues.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/5842085881/&quot; title=&quot;ZAP Alerts&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3177/5842085881_c35dd95cd4_o.jpg&quot; width=&quot;394&quot; height=&quot;157&quot; alt=&quot;ZAP Alerts&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Now let&apos;s take a look at how to fix them.
&lt;p id=&quot;fix-vulnerabilities&quot;&gt;&lt;strong&gt;Fix Vulnerabilities&lt;/strong&gt;&lt;br/&gt;
One of the things not mentioned by the scan, but #1 in &lt;a href=&quot;http://software-security.sans.org/blog/2010/08/11/security-misconfigurations-java-webxml-files&quot;&gt;Seven Security (Mis)Configurations in Java web.xml Files&lt;/a&gt;, is Custom Error Pages Not Configured. Custom error pages are configured in this app, but error.jsp contains the following code:
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
&amp;lt;% if (exception != null) { %&amp;gt;
    &amp;lt;% exception.printStackTrace(new java.io.PrintWriter(out)); %&amp;gt;
&amp;lt;% } else { %&amp;gt;
    Please check your log files for further information.
&amp;lt;% } %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Stack traces can be really useful to an attacker, so it&apos;s important to start by removing the above code from &lt;em&gt;src/main/webapp/error.jsp&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;The rest of the issues have to do with XSS, autocomplete, and cookies. Let&apos;s start with the easy ones. Fixing autocomplete is easy enough; simply changed the HTML in login.jsp and userform.jsp to have &lt;code&gt;autocomplete=&quot;off&quot;&lt;/code&gt; as part of the &amp;lt;form&amp;gt; tag.&lt;/p&gt;
&lt;p&gt;Then modify web.xml so http-only and secure cookies are used. While you&apos;re at it, add session-timeout and tracking-mode as recommended by the aforementioned web.xml misconfigurations article.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;session-config&amp;gt;
    &amp;lt;session-timeout&amp;gt;15&amp;lt;/session-timeout&amp;gt;
    &amp;lt;cookie-config&amp;gt;
        &amp;lt;http-only&amp;gt;true&amp;lt;/http-only&amp;gt;
        &amp;lt;secure&amp;gt;true&amp;lt;/secure&amp;gt;
    &amp;lt;/cookie-config&amp;gt;
    &amp;lt;tracking-mode&amp;gt;COOKIE&amp;lt;/tracking-mode&amp;gt;
&amp;lt;/session-config&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, modify Spring Security&apos;s Remember Me configuration so it uses secure cookies. To do this, add &lt;code&gt;use-secure-cookies=&quot;true&quot;&lt;/code&gt; to the &amp;lt;remember-me&amp;gt; element in &lt;em&gt;security.xml&lt;/em&gt;.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;remember-me user-service-ref=&quot;userService&quot; key=&quot;e37f4b31-0c45-11dd-bd0b-0800200c9a66&quot;
             use-secure-cookie=&quot;true&quot;/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Unfortunately, Spring Security &lt;a href=&quot;https://jira.springsource.org/browse/SEC-1761&quot;&gt;doesn&apos;t support HttpOnly cookies&lt;/a&gt;, but will in a future release.
&lt;/p&gt;
&lt;p&gt;The next issue to solve is disabling directory browsing. You can do this by copying Jetty&apos;s webdefault.xml (from the org.eclipse.jetty:jetty-webapp JAR) into &lt;em&gt;src/test/resources&lt;/em&gt; and changing its &quot;dirAllowed&quot; &amp;lt;init-param&amp;gt; to false:
&lt;/p&gt;              
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;servlet&amp;gt;
  &amp;lt;servlet-name&amp;gt;default&amp;lt;/servlet-name&amp;gt;
  &amp;lt;servlet-class&amp;gt;org.mortbay.jetty.servlet.DefaultServlet&amp;lt;/servlet-class&amp;gt;
  &amp;lt;init-param&amp;gt;
    &amp;lt;param-name&amp;gt;acceptRanges&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;
  &amp;lt;/init-param&amp;gt;
  &amp;lt;init-param&amp;gt;
    &amp;lt;param-name&amp;gt;dirAllowed&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;
  &amp;lt;/init-param&amp;gt;
  &amp;lt;init-param&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You&apos;ll also need to modify the plugin&apos;s configuration to point to this file by adding it to the &amp;lt;webAppConfig&amp;gt; section in pom.xml.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;webAppConfig&amp;gt;
        &amp;lt;contextPath&amp;gt;/&amp;lt;/contextPath&amp;gt;
        &amp;lt;defaultsDescriptor&amp;gt;src/test/resources/webdefault.xml&amp;lt;/defaultsDescriptor&amp;gt;
    &amp;lt;/webAppConfig&amp;gt;
&lt;/pre&gt;&lt;p&gt;Of course, if you&apos;re running in production you&apos;ll want to configure this in your server&apos;s settings rather than in your pom.xml file.
&lt;/p&gt;
&lt;p&gt;Next, I set out to fix &lt;em&gt;secure page browser cache issues&lt;/em&gt;. I had the following settings in my SiteMesh decorator:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-store&quot;/&gt;
&amp;lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot;/&gt;
&lt;/pre&gt;  
&lt;p&gt;However, according to ZAP, the first meta tag should have &quot;no-cache&quot; instead of &quot;no-store&quot;, so I changed it to &quot;no-cache&quot;.&lt;/p&gt;
&lt;p&gt;After making all these changes, I created a new ZAP session and ran an active scan on both sites again. Below are the results:
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/5854063700/&quot; title=&quot;Active Scan after Fixes&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5068/5854063700_8b57a2d49c_o.png&quot; width=&quot;345&quot; height=&quot;116&quot; alt=&quot;Active Scan after Fixes&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I believe the first issue (parameter tampering) is because I show the error page when a duplicate user exists. To fix this, I changed UserFormController so it catches a UserExistsException and sends the user back to the form.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
try {
    userManager.saveUser(user);
} catch (UserExistsException uex) {
    result.addError(new ObjectError(&quot;user&quot;, uex.getMessage()));
    return &quot;userform&quot;;
}
&lt;/pre&gt;
&lt;p&gt;However, this still doesn&apos;t seem to cause the alert to go away. This is likely because I&apos;m not filtering/escaping HTML when it&apos;s first submitted. I believe the best solution for this would be to use something like OWASP&apos;s &lt;a href=&quot;https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API&quot;&gt;ESAPI&lt;/a&gt; to filter parameter values. However, I was unable to find integration with Spring MVC&apos;s data binding, so I decided not to try and fix this vulnerability.&lt;/p&gt;
&lt;p&gt;Finally, I tried to disable jsessionid in URLs using &lt;a href=&quot;http://stackoverflow.com/questions/962729/is-it-possible-to-disable-jsessionid-in-tomcat-servlet&quot;&gt;suggestions from Stack Overflow&lt;/a&gt;. The previous setting in web.xml (&lt;code&gt;&amp;lt;tracking-mode&amp;gt;COOKIE&amp;lt;/tracking-mode&amp;gt;&lt;/code&gt;) should do this, but it doesn&apos;t seem to work with Jetty 8. The other issues (secure page browser cache, HttpOnly cookies and secure cookies), I was unable to solve.  The last two are issues caused by Spring Security as far as I can tell. 
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
In this article, I&apos;ve shown you how to pentest a web application using Firefox and OWASP&apos;s Zed Attack Proxy (ZAP). I found ZAP to be a nice tool for figuring out vulnerabilities, but it&apos;d be nice if it had a &quot;retest&quot; feature to see if you fixed an issue for a particular URL. It does have a &quot;resend&quot; feature, but running it didn&apos;t seem to clear alerts after I&apos;d fixed them.
&lt;/p&gt;
&lt;p&gt;The issues I wasn&apos;t able to solve seemed to be mostly related to frameworks (e.g. Spring Security and HttpOnly cookies) or servers (Jetty not using cookies for tracking). My suspicion is the Jetty issues are because it doesn&apos;t support Servlet 3 as well as it advertises. I believe this is fair; I am using a milestone release after all. I tried scanning &lt;a href=&quot;http://demo.raibledesigns.com/ajax-login&quot;&gt;http://demo.raibledesigns.com/ajax-login&lt;/a&gt; (which runs on Tomcat 7 at &lt;a href=&quot;http://www.contegix.com&quot;&gt;Contegix&lt;/a&gt;) and confirmed that no jsessionid exists.
&lt;/p&gt;
&lt;p&gt;Hopefully this article has helped you understand how to figure out security vulnerabilities in your web applications. I believe ZAP will continue to get more popular as developers become aware of it. If you feel ambitious and want to try and solve &lt;em&gt;all&lt;/em&gt; of the issues in my Ajax Login application, feel free to fork it on &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;GitHub&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in talking more about Webapp Security, please leave a comment, meet me at &lt;a href=&quot;http://jazoon.com/Conference/Thursday-23-June/Matt-Raible&quot;&gt;Jazoon&lt;/a&gt; later this week or let&apos;s talk in July at &lt;a href=&quot;http://uberconf.com/topics/java_web_application_security__develop__penetrate__protect__relax_&quot;&gt;&#220;ber Conf&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_application_security_part3</id>
        <title type="html">Java Web Application Security - Part IV: Programmatic Login APIs</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_application_security_part3"/>
        <published>2011-06-06T21:44:09-06:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="esapi" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tutorial" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apacheshiro" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appsec" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Over the last month, I&apos;ve posted a number of articles on implementing authentication with &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;Java EE 6&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part1&quot;&gt;Spring Security&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part2&quot;&gt;Apache Shiro&lt;/a&gt;. One of the things I demonstrated in my live demos (at Utah&apos;s JUG Meetings) was programmatic authentication. I left this out of my screencasts and previous tutorials because I thought it&apos;d fit better in a comparison article.&lt;/p&gt;
&lt;p&gt;In this article, I&apos;d like to show you how you can programmatically login to an application using the aforementioned security frameworks. To do this, I&apos;ll be using my &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;ajax-login&lt;/a&gt; application that I wrote for &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery&quot;&gt;Implementing Ajax Authentication using jQuery, Spring Security and HTTPS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To begin, I implemented a LoginController as a Spring MVC Controller that returns JSON. 
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.webapp.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(&quot;/api/login.json&quot;)
public class LoginController {

    @Autowired
    LoginService loginService;

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public LoginStatus getStatus() {
        return loginService.getStatus();
    }

    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public LoginStatus login(@RequestParam(&quot;j_username&quot;) String username,
                             @RequestParam(&quot;j_password&quot;) String password) {

        return loginService.login(username, password);
    }
}
&lt;/pre&gt;
&lt;p&gt;
This controller delegates its logic to a LoginService interface.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.webapp.security;

public interface LoginService {

  LoginStatus getStatus();

  LoginStatus login(String username, String password);
}
&lt;/pre&gt;
&lt;p id=&quot;theclient&quot;&gt;&lt;strong&gt;The Client&lt;/strong&gt;&lt;br/&gt;
The client for this controller is the same as mentioned in my &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery&quot;&gt;previous article&lt;/a&gt;, but I&apos;ll post it again for your convenience. I used jQuery and jQuery UI to implement a dialog that opens the login page on the same page rather than redirecting to the login page. The &quot;#demo&quot; locator refers to a button in the page.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
var dialog = $(&apos;&amp;lt;div&gt;&amp;lt;/div&gt;&apos;);

$(document).ready(function() {
    $.get(&apos;/login?ajax=true&apos;, function(data) {
        dialog.html(data);
        dialog.dialog({
            autoOpen: false,
	       title: &apos;Authentication Required&apos;
        });
    });

    $(&apos;#demo&apos;).click(function() {
      dialog.dialog(&apos;open&apos;);
      // prevent the default action, e.g., following a link
      return false;
    });
});
&lt;/pre&gt;
&lt;p&gt;The login page then has the following JavaScript to add a click handler to the &quot;login&quot; button that submits the request securely to the LoginController.
&lt;/p&gt;
&lt;pre class=&quot;brush: js; auto-links: false&quot;&gt;
var getHost = function() {
    var port = (window.location.port == &quot;8080&quot;) ? &quot;:8443&quot; : &quot;&quot;;
    return ((secure) ? &apos;https://&apos; : &apos;http://&apos;) + window.location.hostname + port;
};

var loginFailed = function(data, status) {
    $(&quot;.error&quot;).remove();
    $(&apos;#username-label&apos;).before(&apos;&lt;div class=&quot;error&quot;&gt;Login failed, please try again.&lt;/div&gt;&apos;);
};

$(&quot;#login&quot;).live(&apos;click&apos;, function(e) {
    e.preventDefault();
    $.ajax({url: getHost() + &quot;${ctx}/api/login.json&quot;,
        type: &quot;POST&quot;,
        beforeSend: function(xhr) {
            xhr.withCredentials = true;
        },
        data: $(&quot;#loginForm&quot;).serialize(),
        success: function(data, status) {
            if (data.loggedIn) {
                // success
                dialog.dialog(&apos;close&apos;);
                location.href = getHost() + &apos;${ctx}/users&apos;;
            } else {
                loginFailed(data);
            }
        },
        error: loginFailed
    });
});
&lt;/pre&gt;
&lt;p&gt;The biggest secret to making this all work (the HTTP -&gt; HTTPS communication, which is considered cross-domain), is the &lt;a href=&quot;http://www.sitepen.com/blog/2008/07/22/windowname-transport/&quot;&gt;window.name Transport&lt;/a&gt; and the &lt;a href=&quot;http://friedcellcollective.net/outbreak/jsjquerywindownameplugin/&quot;&gt;jQuery plugin&lt;/a&gt; that implements it. To make this plugin work with Firefox 3.6, I had to implement a Filter that adds Access-Control headers. 
&lt;/p&gt;
&lt;pre class=&quot;brush: java; auto-links: false&quot;&gt;
public class OptionsHeadersFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader(&quot;Access-Control-Allow-Origin&quot;, &quot;http://&quot; + req.getServerName());
        response.setHeader(&quot;Access-Control-Allow-Methods&quot;, &quot;GET,POST&quot;);
        response.setHeader(&quot;Access-Control-Max-Age&quot;, &quot;360&quot;);
        response.setHeader(&quot;Access-Control-Allow-Headers&quot;, &quot;x-requested-with&quot;);
        response.setHeader(&quot;Access-Control-Allow-Credentials&quot;, &quot;true&quot;);

        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }
}
&lt;/pre&gt;
&lt;/p&gt;
&lt;p id=&quot;javaee6-loginservice&quot;&gt;&lt;strong&gt;Java EE 6 LoginService&lt;/strong&gt;&lt;br/&gt;
Java EE 6 has a few new methods in &lt;a href=&quot;http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html&quot;&gt;HttpServletRequest&lt;/a&gt;:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;authenticate(response)&lt;/li&gt;
&lt;li&gt;login(user, pass)&lt;/li&gt;
&lt;li&gt;logout()&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In this example, I&apos;ll use the new &lt;em&gt;login(username, password)&lt;/em&gt; method. The hardest part about getting this working was finding the right Maven dependency. At first, I tried the one that seemed to make the most sense:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;javax&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;javaee-web-api&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;6.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Unfortunately, this resulted in a &lt;a href=&quot;http://hi.baidu.com/8741659422/blog/item/8410bf16104aef44f3de32b5.html&quot;&gt;strange error&lt;/a&gt; that  means the dependency has the interfaces, but not the implementation classes. I ended up using GlassFish&apos;s dependency instead (thanks to &lt;a href=&quot;http://stackoverflow.com/questions/1979957/maven-dependency-for-servlet-3-0-api&quot;&gt;Stack Overflow&lt;/a&gt; for the tip).
&lt;/p&gt;&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.glassfish&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;javax.servlet&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.0&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Since Servlet 3.0 doesn&apos;t appear to be in Maven Central, I had to add the GlassFish Repository to my pom.xml&apos;s &amp;lt;repositories&amp;gt; element.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;repository&amp;gt;
    &amp;lt;id&amp;gt;glassfish-repo&amp;lt;/id&amp;gt;
    &amp;lt;url&amp;gt;http://download.java.net/maven/glassfish&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After that, it was easy to implement the LoginService interface with a JavaEELoginService class:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.webapp.security;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

@Service(&quot;javaeeLoginService&quot;)
public class JavaEELoginService implements LoginService {
    private Log log = LogFactory.getLog(JavaEELoginService.class);

    @Autowired
    HttpServletRequest request;

    public LoginStatus getStatus() {
        if (request.getRemoteUser() != null) {
            return new LoginStatus(true, request.getRemoteUser());
        } else {
            return new LoginStatus(false, null);
        }
    }

    @Override
    public LoginStatus login(String username, String password) {
        try {
            if (request.getRemoteUser() == null) {
                request.login(username, password);
                log.debug(&quot;Login succeeded!&quot;);
            }
            return new LoginStatus(true, request.getRemoteUser());
        } catch (ServletException e) {
            e.printStackTrace();
            return new LoginStatus(false, null);
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;I tried to use this with &quot;mvn jetty:run&quot; (with version 8.0.0.M2 of the jetty-maven-plugin), but I got the following error:&lt;/p&gt;
&lt;pre&gt;
javax.servlet.ServletException
        at org.eclipse.jetty.server.Request.login(Request.java:1927)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler.invoke(AutowireUtils.java:178)
        at $Proxy52.login(Unknown Source)
        at org.appfuse.examples.webapp.security.JavaEELoginService.login(JavaEELoginService.java:30)
&lt;/pre&gt;
&lt;p&gt;This lead me to believe that Servlet 3 is not quite implemented, so I tried it with Tomcat 7.0.8. To support SSL and container-managed authentication, I had to &lt;a href=&quot;http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html&quot;&gt;create a certificate keystore and uncomment the SSL Connector in $CATALINA_HOME/conf/server.xml&lt;/a&gt;. I also had to add an &quot;admin&quot; user with roles=&quot;ROLE_ADMIN&quot; to $CATALINA_HOME/conf/tomcat-users.xml.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;user username=&quot;admin&quot; password=&quot;admin&quot; roles=&quot;ROLE_ADMIN&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;With Tomcat 7, I was able to login successfully, proven by the following logging.&lt;/p&gt;
&lt;pre&gt;
DEBUG - JavaEELoginService.login(31) | Login succeeded!
&lt;/pre&gt;
&lt;p&gt;However, in the UI, I still got a &quot;Login failed, please try again.&quot; message. Recalling that I had some issues with ports previous, I configured Apache to proxy the default http/https ports to 8080/8443 and tried again. This time it worked!&lt;/p&gt;
&lt;p id=&quot;springsecurity-loginservice&quot;&gt;&lt;strong&gt;Spring Security LoginService&lt;/strong&gt;&lt;br/&gt;
Spring Security offers a programmatic API and I was able to implement its LoginService as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.webapp.security;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.appfuse.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

@Service(&quot;springLoginService&quot;)
public class SpringSecurityLoginService implements LoginService {
    private Log log = LogFactory.getLog(SpringSecurityLoginService.class);

    @Autowired(required = false)
    @Qualifier(&quot;authenticationManager&quot;)
    AuthenticationManager authenticationManager;

    public LoginStatus getStatus() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null &amp;&amp; !auth.getName().equals(&quot;anonymousUser&quot;) &amp;&amp; auth.isAuthenticated()) {
            return new LoginStatus(true, auth.getName());
        } else {
            return new LoginStatus(false, null);
        }
    }

    public LoginStatus login(String username, String password) {
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
        User details = new User(username);
        token.setDetails(details);

        try {
            Authentication auth = authenticationManager.authenticate(token);
            log.debug(&quot;Login succeeded!&quot;);
            SecurityContextHolder.getContext().setAuthentication(auth);
            return new LoginStatus(auth.isAuthenticated(), auth.getName());
        } catch (BadCredentialsException e) {
            return new LoginStatus(false, null);
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;I then modified the LoginService dependency in LoginController so this implementation would be used.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Autowired
@Qualifier(&quot;springLoginService&quot;)
LoginService loginService;
&lt;/pre&gt;
&lt;p&gt;Since Spring&apos;s API doesn&apos;t depend on Servlet 3, I tried it in Jetty using &quot;mvn jetty:run&quot;. Of course, I modified my web.xml accordingly for Spring Security before doing so. Interestingly enough, I found that the my SpringSecurityLoginService seemed to work:
&lt;/p&gt;
&lt;pre&gt;DEBUG - SpringSecurityLoginService.login(39) | Login succeeded!&lt;/pre&gt;
&lt;p&gt;But in the UI, the login failed with a &quot;Login failed, please try again.&quot; message. Using the standard ports with Apache in front of Jetty solved this issue.
&lt;p id=&quot;apacheshiro-loginservice&quot;&gt;&lt;strong&gt;Apache Shiro LoginService&lt;/strong&gt;&lt;br/&gt;
Apache Shiro is nice enough to offer a programmatic API as well. I was able to implement a ShiroLoginService as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.webapp.security;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Service;

@Service(&quot;shiroLoginService&quot;)
public class ShiroLoginService implements LoginService {
    private Log log = LogFactory.getLog(ShiroLoginService.class);

    public LoginStatus getStatus() {
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser.isAuthenticated()) {
            return new LoginStatus(true, currentUser.getPrincipal().toString());
        } else {
            return new LoginStatus(false, null);
        }
    }

    public LoginStatus login(String username, String password) {
        if (!getStatus().isLoggedIn()) {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            Subject currentUser = SecurityUtils.getSubject();
            try {
                currentUser.login(token);
                log.debug(&quot;Login succeeded!&quot;);
                return new LoginStatus(currentUser.isAuthenticated(),
                        currentUser.getPrincipal().toString());
            } catch (AuthenticationException e) {
                return new LoginStatus(false, null);
            }

        } else {
            return getStatus();
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;Then I modified the LoginService dependency in LoginController so this implementation would be used.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Autowired
@Qualifier(&quot;shiroLoginService&quot;)
LoginService loginService;
&lt;/pre&gt;&lt;p&gt;Next, I modified my web.xml for Apache Shiro and tried &quot;mvn jetty:run&quot;. Again, the login appeared to succeed (based on log messages) on the server, but failed in the UI. When using http://localhost instead of http://localhost:8080, everything worked fine.&lt;/p&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
This article has shown you how you can programmatically login using Java EE 6, Spring Security and Apache Shiro. Before Java EE 6 (and Servlet 3), there was no API to programmatically login, so this is a welcome addition. The fact that my Ajax login example didn&apos;t work when ports differed is because of browsers&apos; &lt;a href=&quot;http://en.wikipedia.org/wiki/Same_origin_policy&quot;&gt;same origin policy&lt;/a&gt;, which specifies the ports have to be the same. Specifying no ports (the defaults), seems to be the loophole.
&lt;/p&gt;
&lt;p&gt;On a related note, I&apos;ve discovered some interesting articles recently from the &lt;a href=&quot;http://software-security.sans.org/blog&quot;&gt;AppSec Blog&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://software-security.sans.org/blog/2010/08/11/security-misconfigurations-java-webxml-files&quot;&gt;Seven Security (Mis)Configurations in Java web.xml Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://software-security.sans.org/blog/2011/06/06/safer-software-through-secure-frameworks&quot;&gt;Safer Software through Secure Frameworks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The 2nd article has an interesting paragraph:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;... there&apos;s &lt;a href=&quot;http://shiro.apache.org/&quot;&gt;Apache Shiro&lt;/a&gt; (FKA &lt;a href=&quot;http://www.jsecurity.org/&quot;&gt;JSecurity&lt;/a&gt; and then later as Apache &lt;a href=&quot;http://incubator.apache.org/ki/&quot;&gt;Ki&lt;/a&gt;), another secure framework for Java apps. Although it looks &lt;a href=&quot;http://shiro.apache.org/10-minute-tutorial.html&quot;&gt;simpler to use and understand&lt;/a&gt; than ESAPI and covers most of the main security bases (authentication, authorization, session management and encryption), it doesn&apos;t help take care of important functions like input validation and output encoding. And Spring users have &lt;a href=&quot;http://static.springsource.org/spring-security/site/&quot;&gt;Spring Security&lt;/a&gt; (Acegi) a comprehensive, but heavyweight authorization and authentication framework.
&lt;/p&gt;So according to this blog, the security frameworks discussed here aren&apos;t the best.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
The most comprehensive, up-to-date choice for Java developers is OWASP&apos;s &lt;a href=&quot;https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API&quot;&gt;ESAPI Enterprise Security API&lt;/a&gt; especially now that the 2.0 release has just come out. 
&lt;/p&gt;
&lt;p&gt;I haven&apos;t heard of many organizations adopting ESAPI over Java EE 6, Spring Security or Apache Shiro, but maybe I&apos;m wrong. Is ESAPI something that&apos;s being used out there by companies?
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_application_security_part2</id>
        <title type="html">Java Web Application Security - Part III: Apache Shiro Login Demo</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_application_security_part2"/>
        <published>2011-05-26T16:43:22-06:00</published>
        <updated>2015-07-07T01:37:14-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <category term="web" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apacheshiro" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ujug" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">A couple weeks ago, I wrote &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part1&quot;&gt;a tutorial on how to implement security with Spring Security&lt;/a&gt;. The week prior, I wrote a &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;similar tutorial for Java EE 6&lt;/a&gt;. This week, I&apos;d like to show you how to implement the same features using &lt;a href=&quot;http://shiro.apache.org&quot;&gt;Apache Shiro&lt;/a&gt;. As I mentioned in previous articles, I&apos;m writing this because I told the audience at April&apos;s &lt;a href=&quot;http://ujug.org&quot;&gt;UJUG&lt;/a&gt; that I would publish screencasts of the demos.
&lt;/p&gt;
&lt;p&gt;
Today, I&apos;ve finished the third screencast showing how to implement security with Apache Shiro. Below is the presentation (with the screencast embedded on slide 22) as well as a step-by-step tutorial.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/o4wwswiZck6bKS&quot; width=&quot;510&quot; height=&quot;420&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt;
&lt;br/&gt;
&lt;div style=&quot;font-size: .9em; text-align: left&quot;&gt;* You can also &lt;a href=&quot;http://www.youtube.com/watch?v=YJByiDvOhsc&quot;&gt;watch the screencast on YouTube&lt;/a&gt; or &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Java_Web_Application_Security_UJUG2011.pdf&quot;&gt;download the presentation PDF&lt;/a&gt;.&lt;/div&gt;
&lt;/p&gt;

&lt;p id=&quot;apacheshiro-login-tutorial&quot;&gt;&lt;strong&gt;Apache Shiro Login Tutorial&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#download-run&quot;&gt;Download and Run the Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#secure-basic&quot;&gt;Implement Basic Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ssl&quot;&gt;Force SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#form-authentication&quot;&gt;Implement Form-based Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#jdbc&quot;&gt;Store Users in a Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;download-run&quot;&gt;&lt;strong&gt;Download and Run the Application&lt;/strong&gt;&lt;br/&gt;

To begin, &lt;a href=&quot;http://static.raibledesigns.com/downloads/ajax-login-apacheshiro-tutorial-1.0.zip&quot;&gt;download the application&lt;/a&gt; you&apos;ll be implementing security in. This app is a stripped-down version of the Ajax Login application I wrote for my article on &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery&quot;&gt;Implementing Ajax Authentication using jQuery, Spring Security and HTTPS&lt;/a&gt;. You&apos;ll need Java 6 and Maven installed to run the app. Run it using &lt;strong&gt;mvn jetty:run&lt;/strong&gt; and open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; in your browser. You&apos;ll see it&apos;s a simple CRUD application for users and there&apos;s no login required to add or delete users.&lt;/p&gt;

&lt;p id=&quot;secure-basic&quot;&gt;&lt;strong&gt;Implement Basic Authentication&lt;/strong&gt;&lt;br/&gt;
  
The first step is to protect the list screen so people have to login to view users. To do this, you&apos;ll need to create a shiro.ini file Shiro&apos;s configuration. Create &lt;em&gt;src/main/resources/shiro.ini&lt;/em&gt; and populate it with the contents below:
&lt;/p&gt;
&lt;pre&gt;
[main]

[users]
admin = admin, ROLE_ADMIN

[roles]
ROLE_ADMIN = *

[urls]
/app/users = authcBasic
&lt;/pre&gt;
&lt;p&gt;You can see this file has four sections and is pretty simple to read and understand. For more information about what each section is for, check out &lt;a href=&quot;http://shiro.apache.org/configuration.html#Configuration-INISections&quot;&gt;Shiro&apos;s configuration documentation&lt;/a&gt;.
&lt;p&gt;Next, open &lt;em&gt;src/main/webapp/WEB-INF/web.xml&lt;/em&gt; and add Shiro&apos;s IniShiroFilter:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter&amp;gt;
    &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;filter-class&amp;gt;org.apache.shiro.web.servlet.IniShiroFilter&amp;lt;/filter-class&amp;gt;
    &amp;lt;!-- no init-param means load the INI config from classpath:shiro.ini --&amp;gt;
&amp;lt;/filter&amp;gt;
&lt;/pre&gt;
&lt;p&gt;And add its filter-mapping just after the rewriteFilter in the filter-mappings section (order is important!):
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;rewriteFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Then add Shiro&apos;s &lt;em&gt;core&lt;/em&gt; and &lt;em&gt;web&lt;/em&gt; dependencies to your pom.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.shiro&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;shiro-core&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.shiro&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;shiro-web&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
At this point, if you restart Jetty (Ctrl+C and jetty:run again), you should be prompted to login when you click on the &quot;Users&quot; tab. Enter admin/admin to login. Apache Shiro is easier to configure than Spring Security out-of-the-box, mostly because it doesn&apos;t require XML.
&lt;/p&gt;
&lt;p&gt;After logging in, you can try to logout by clicking the &quot;Logout&quot; link in the top-right corner. This calls a LogoutController with the following code that logs the user out.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public void logout(HttpServletResponse response) throws ServletException, IOException {
    request.getSession().invalidate();
    response.sendRedirect(request.getContextPath()); 
}
&lt;/pre&gt; 
&lt;p class=&quot;quote&quot; style=&quot;font-style: italic; color: #666&quot;&gt;NOTE: Shiro doesn&apos;t currently have a way to logout with its API. However, &lt;a href=&quot;https://issues.apache.org/jira/browse/SHIRO-284&quot;&gt;it will be added in the 1.2 release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You&apos;ll notice that clicking this link doesn&apos;t log you out, even though the session is invalidated. The only way to logout with basic authentication is to close the browser. In order to get the ability to logout, as well as to have more control over the look-and-feel of the login, you can implement form-based authentication.
  Before you implement form-based authentication, I&apos;d like to show you how easy it is to force SSL with Apache Shiro.
&lt;/p&gt;
&lt;p id=&quot;ssl&quot;&gt;&lt;strong&gt;Force SSL&lt;/strong&gt;&lt;br/&gt;
Apache Shiro allows you to force SSL on a URL by simply adding &quot;ssl[&lt;em&gt;port&lt;/em&gt;]&quot; to a URL in the [urls] section. If you don&apos;t specify the port, it will use the default port (443). I&apos;m not sure if it allows you to switch back to http like Spring Security&apos;s &lt;em&gt;requires-channel&lt;/em&gt;, but I don&apos;t think it does. Modify the URLs section of your &lt;em&gt;shiro.ini&lt;/em&gt; to have the following:
&lt;/p&gt;
&lt;pre&gt;[urls]
/app/users = ssl[8443],authc
&lt;/pre&gt;
&lt;p&gt;In order for this to work, you have to configure Jetty to listen on an SSL port. Add the following just after the jetty-maven-plugin&apos;s &amp;lt;/webAppConfig&amp;gt; element in your pom.xml:
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;connectors&amp;gt;
    &amp;lt;connector implementation=&quot;org.eclipse.jetty.server.nio.SelectChannelConnector&quot;&amp;gt;
        &amp;lt;forwarded&amp;gt;true&amp;lt;/forwarded&amp;gt;
        &amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;
    &amp;lt;/connector&amp;gt;
    &amp;lt;connector implementation=&quot;org.eclipse.jetty.server.ssl.SslSelectChannelConnector&quot;&amp;gt;
        &amp;lt;forwarded&amp;gt;true&amp;lt;/forwarded&amp;gt;
        &amp;lt;port&amp;gt;8443&amp;lt;/port&amp;gt;
        &amp;lt;maxIdleTime&amp;gt;60000&amp;lt;/maxIdleTime&amp;gt;
        &amp;lt;keystore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/keystore&amp;gt;
        &amp;lt;password&amp;gt;appfuse&amp;lt;/password&amp;gt;
        &amp;lt;keyPassword&amp;gt;appfuse&amp;lt;/keyPassword&amp;gt;
    &amp;lt;/connector&amp;gt;
&amp;lt;/connectors&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The keystore must be generated for Jetty to start successfully, so add the keytool-maven-plugin just above the jetty-maven-plugin in pom.xml.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;keytool-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;
            &amp;lt;id&amp;gt;clean&amp;lt;/id&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;clean&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;
            &amp;lt;id&amp;gt;genkey&amp;lt;/id&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;genkey&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;keystore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/keystore&amp;gt;
        &amp;lt;dname&amp;gt;cn=localhost&amp;lt;/dname&amp;gt;
        &amp;lt;keypass&amp;gt;appfuse&amp;lt;/keypass&amp;gt;
        &amp;lt;storepass&amp;gt;appfuse&amp;lt;/storepass&amp;gt;
        &amp;lt;alias&amp;gt;appfuse&amp;lt;/alias&amp;gt;
        &amp;lt;keyalg&amp;gt;RSA&amp;lt;/keyalg&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now if you restart Jetty, go to &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; and click on the &quot;Users&quot; tab, you&apos;ll be prompted to accept the Untrusted Certificate and then redirected to https://localhost:8443/users after logging in. 
&lt;/p&gt;
&lt;p&gt;Now let&apos;s look at how to have more control over the look-and-feel of the login screen, as well as how to make logout work with form-based authentication.&lt;/p&gt;
&lt;p id=&quot;form-authentication&quot;&gt;&lt;strong&gt;Implement Form-based Authentication&lt;/strong&gt;&lt;br/&gt;
To change from basic to form-based authentication, you simply have to add a few lines to shiro.ini. First of all, since I&apos;d rather not change the name of the input elements in login.jsp, override the default names in the [main] section:
&lt;/p&gt;
&lt;pre&gt;
# name of request parameter with username; if not present filter assumes &apos;username&apos;
authc.usernameParam = j_username
# name of request parameter with password; if not present filter assumes &apos;password&apos;
authc.passwordParam = j_password
authc.failureKeyAttribute = shiroLoginFailure
&lt;/pre&gt;
&lt;p&gt;Then change the [urls] section to filter on login.jsp and use &quot;authc&quot; instead of &quot;authcBasic&quot;:
&lt;pre&gt;[urls]
# The /login.jsp is not restricted to authenticated users (otherwise no one could log in!), but
# the &apos;authc&apos; filter must still be specified for it so it can process that url&apos;s
# login submissions. It is &apos;smart&apos; enough to allow those requests through as specified by the
# shiro.loginUrl above.
/login.jsp = authc
/app/users = ssl[8443],authc
&lt;/pre&gt;
&lt;p&gt;Then change login.jsp so the form&apos;s action is blank (causing it to submit to itself) instead of j_security_check:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;form action=&quot;&quot; id=&quot;loginForm&quot; method=&quot;post&quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now, restart Jetty and you should be prompted to login with this JSP instead of the basic authentication dialog.
&lt;/p&gt;
&lt;p id=&quot;jdbc&quot;&gt;&lt;strong&gt;Store Users in a Database&lt;/strong&gt;&lt;br/&gt;
To store your users in a database instead of file, you&apos;ll need to add a few settings to shiro.ini to define your database and tables to use. Open &lt;em&gt;src/main/resources/shiro.ini&lt;/em&gt; and add the following lines under the [main] section.
&lt;/p&gt;
&lt;pre&gt;
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#jdbcRealm.permissionsLookupEnabled=false
# If not filled, subclasses of JdbcRealm assume &quot;select password from users where username = ?&quot;
jdbcRealm.authenticationQuery = select user_pass from users where user_name = ?
# If not filled, subclasses of JdbcRealm assume &quot;select role_name from user_roles where username = ?&quot;
jdbcRealm.userRolesQuery = select role_name from users_roles where user_name = ?

ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
ds.serverName = localhost
ds.user = root
ds.databaseName = appfuse
jdbcRealm.dataSource = $ds
&lt;/pre&gt;
&lt;p class=&quot;quote&quot; style=&quot;margin-left: 0; color: #666&quot;&gt;This configuration is similar to what I did with the Java EE 6 tutorial where I&apos;m pointing to a database other than the H2 instance that&apos;s used by the application. I believe Shiro can talk to a DAO like Spring Security, but I have yet to explore that option.
&lt;/p&gt;
&lt;p&gt;While you&apos;re at it, add the following lines to enable password encryption.&lt;/p&gt;
&lt;pre&gt;
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
jdbcRealm.credentialsMatcher = $sha256Matcher
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;You&apos;ll need to &lt;a href=&quot;http://dev.mysql.com/downloads/mysql/5.5.html&quot;&gt;install MySQL&lt;/a&gt; for this to work. After installing it, you should be able to create an &quot;appfuse&quot; database using the following command:
&lt;/p&gt;
&lt;pre&gt;
mysql -u root -p -e &apos;create database appfuse&apos;
&lt;/pre&gt;
&lt;p&gt;Then create the tables necessary and populate it with an &apos;admin&apos; user. Login using &quot;mysql -u root -p appfuse&quot; and execute the following SQL statements:&lt;/p&gt;
&lt;pre&gt;
create table users (
  user_name         varchar(30) not null primary key,
  user_pass         varchar(100) not null
);

create table user_roles (
  user_name         varchar(30) not null,
  role_name         varchar(30) not null,
  primary key (user_name, role_name)
);

insert into users values (&apos;admin&apos;, &apos;22f256eca1f336a97eef2b260773cb0d81d900c208ff26e94410d292d605fed8&apos;);
insert into user_roles values (&apos;admin&apos;, &apos;ROLE_ADMIN&apos;);
&lt;/pre&gt;
&lt;p&gt;Now if you restart Jetty, you should be able to login with admin/adminjdbc and view the list of users.
&lt;/p&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
In this tutorial, you learned how to implement authentication using Apache Shiro 1.1.0. I don&apos;t have a lot of experience with Apache Shiro, but I was able to get the basics working without too much effort. This tutorial doesn&apos;t show how to do Remember Me because I couldn&apos;t figure it out in 5 minutes, which means I have 5 more minutes before it fails the 10-minute test. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
Shiro was formerly named &lt;a href=&quot;http://www.jsecurity.org/&quot;&gt;JSecurity&lt;/a&gt; and has been an Apache project for less than a year. It seems to be more targeted towards non-web use, so its certainly something to look at if you&apos;re more interested in cryptography or non-web apps. I think there&apos;s a good chance this project will continue to grow and be used more as more developers learn about it. The Apache brand certainly doesn&apos;t hurt.
&lt;/p&gt;
&lt;p&gt;
I didn&apos;t include a slide about the limitations I found with Shiro, mostly because I haven&apos;t used it much. I&apos;ve used Java EE and Spring Security for several years. The main limitation I found was the lack of documentation, but I&apos;ve heard it&apos;s improving rapidly.
&lt;/p&gt;
  &lt;p&gt;In the next couple weeks, I&apos;ll post a &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part3&quot;&gt;Part IV&lt;/a&gt; on implementing programmatic login using the APIs of Java EE 6, Spring Security and Apache Shiro. I&apos;ll be presenting this topic at &lt;a href=&quot;http://jazoon.com&quot;&gt;Jazoon&lt;/a&gt; as well as the long-form version (with hacking) at &lt;a href=&quot;http://uberconf.com/conference/denver/2011/07/home&quot;&gt;&#220;berConf&lt;/a&gt;. Hopefully I&apos;ll see you at one of those conferences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to help from &lt;a href=&quot;http://leshazlewood.com&quot;&gt;Les Hazlewood&lt;/a&gt;, I&apos;ve figured out how to implement Remember Me with Apache Shiro. In the [urls] section of shiro.ini, the second url (shown below) says to Shiro &quot;In order to visit the /app/users URL, you must be connecting via SSL on port 8443 and you must also be authenticated.&quot;
&lt;/p&gt;
&lt;pre&gt;
/app/users = ssl[8443],authc
&lt;/pre&gt;
&lt;p&gt;
Remembered users are not authenticated because their identity hasn&apos;t been proven during the current session.  What I want Shiro to say is &quot;In order to visit the /app/users URL, you must be connecting via SSL on 8443 and you must also be a known user.  If you&apos;re not, you should login first.&quot; Where a &lt;em&gt;known user&lt;/em&gt; is someone who has a recognized identity and has either authenticated during the current session or is known via RememberMe from a previous session.  The &lt;a href=&quot;http://shiro.apache.org/authentication.html#Authentication-Rememberedvs.Authenticated&quot;&gt;documentation&lt;/a&gt; gives a good example with Amazon.com for why Shiro makes this distinction.  It allows more control (usually necessary), but you can relax the control as you see fit.
&lt;p&gt;
So, to relax my configuration a bit to match what I want (&lt;em&gt;known users&lt;/em&gt;), I updated shiro.ini&apos;s [urls] section to be as follows:&lt;/p&gt;
&lt;pre&gt;
/app/users = ssl[8443],user
&lt;/pre&gt;
&lt;p&gt;
The key is that the /app/users url is now protected with the more relaxed &lt;a href=&quot;http://shiro.apache.org/static/current/apidocs/org/apache/shiro/web/filter/authc/UserFilter.html&quot;&gt;&lt;em&gt;user&lt;/em&gt; filter&lt;/a&gt; instead of the &lt;em&gt;authc&lt;/em&gt; filter.  However, you would typically want an account profile page (or credit card information page, or similar) protected with the authc filter instead to guarantee proof of identity for those sensitive operations.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_application_security_part1</id>
        <title type="html">Java Web Application Security - Part II: Spring Security Login Demo</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_application_security_part1"/>
        <published>2011-05-13T09:20:51-06:00</published>
        <updated>2015-07-07T01:36:15-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ujug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="web" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last week, I wrote &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;a tutorial on how to implement Security in Java EE 6&lt;/a&gt;. This week, I&apos;d like to show you how to implement the same features using &lt;a href=&quot;http://static.springsource.org/spring-security/site/&quot;&gt;Spring Security&lt;/a&gt;. Before I begin, I&apos;d like to explain my reason for writing this article.
&lt;/p&gt;
&lt;p&gt;Last month, I presented a talk on Java Web Application Security at the &lt;a href=&quot;http://ujug.org&quot;&gt;Utah JUG&lt;/a&gt; (UJUG). As part of that presentation, I did a number of demos about how to implement security with Java EE 6, Spring Security and Apache Shiro. I told the audience that I would post the presentation and was planning on recording screencasts of the various demos so the online version of the presentation would make more sense. 
&lt;/p&gt;
&lt;p&gt;
Today, I&apos;ve finished the second screencast showing how to implement security with Spring Security. Below is the presentation (with the screencast embedded on slide 16) as well as a step-by-step tutorial.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/o4wwswiZck6bKS&quot; width=&quot;510&quot; height=&quot;420&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt;
&lt;br/&gt;
&lt;div style=&quot;font-size: .9em; text-align: left&quot;&gt;* You can also &lt;a href=&quot;http://www.youtube.com/watch?v=K5Hf-2bKYu8&quot;&gt;watch the screencast on YouTube&lt;/a&gt; or &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Java_Web_Application_Security_UJUG2011.pdf&quot;&gt;download the presentation PDF&lt;/a&gt;.&lt;/div&gt;
&lt;/p&gt;

&lt;p id=&quot;springsecurity-login-tutorial&quot;&gt;&lt;strong&gt;Spring Security Login Tutorial&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#download-run&quot;&gt;Download and Run the Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#secure-basic&quot;&gt;Implement Basic Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ssl&quot;&gt;Force SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#form-authentication&quot;&gt;Implement Form-based Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#remember-me&quot;&gt;Add Remember Me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#jdbc&quot;&gt;Store Users in a Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;download-run&quot;&gt;&lt;strong&gt;Download and Run the Application&lt;/strong&gt;&lt;br/&gt;

To begin, &lt;a href=&quot;http://static.raibledesigns.com/downloads/ajax-login-springsecurity-tutorial-1.0.zip&quot;&gt;download the application&lt;/a&gt; you&apos;ll be implementing security in. This app is a stripped-down version of the Ajax Login application I wrote for my article on &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery&quot;&gt;Implementing Ajax Authentication using jQuery, Spring Security and HTTPS&lt;/a&gt;. You&apos;ll need Java 6 and Maven installed to run the app. Run it using &lt;strong&gt;mvn jetty:run&lt;/strong&gt; and open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; in your browser. You&apos;ll see it&apos;s a simple CRUD application for users and there&apos;s no login required to add or delete users.&lt;/p&gt;

&lt;p id=&quot;secure-basic&quot;&gt;&lt;strong&gt;Implement Basic Authentication&lt;/strong&gt;&lt;br/&gt;
  
The first step is to protect the list screen so people have to login to view users. To do this, you&apos;ll need to create a Spring context file that contains Spring Security&apos;s configuration. Create &lt;em&gt;src/main/webapp/WEB-INF/security.xml&lt;/em&gt; and populate it with the contents below:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
  &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
  &amp;lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/security&quot;
               xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
               xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
               xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd&quot;&amp;gt;

      &amp;lt;!-- New in Spring Security 3.1 --&amp;gt;
      &amp;lt;!-- &amp;lt;http pattern=&quot;/css/**&quot; security=&quot;none&quot;/&amp;gt; --&amp;gt;

      &amp;lt;http auto-config=&quot;true&quot;&amp;gt;
          &amp;lt;intercept-url pattern=&quot;/app/users&quot; access=&quot;ROLE_USER,ROLE_ADMIN&quot;/&amp;gt;
          &amp;lt;http-basic/&amp;gt;
      &amp;lt;/http&amp;gt;

      &amp;lt;authentication-manager alias=&quot;authenticationManager&quot;&amp;gt;
          &amp;lt;authentication-provider&amp;gt;
              &amp;lt;password-encoder hash=&quot;sha&quot;/&amp;gt;
              &amp;lt;user-service&amp;gt;
                  &amp;lt;user name=&quot;user&quot; password=&quot;12dea96fec20593566ab75692c9949596833adc9&quot; authorities=&quot;ROLE_USER&quot;/&amp;gt;
                  &amp;lt;user name=&quot;admin&quot; password=&quot;d033e22ae348aeb5660fc2140aec35850c4da997&quot; authorities=&quot;ROLE_ADMIN&quot;/&amp;gt;
              &amp;lt;/user-service&amp;gt;
          &amp;lt;/authentication-provider&amp;gt;
      &amp;lt;/authentication-manager&amp;gt;

      &amp;lt;!-- Override userSecurityAdvice bean in appfuse-service to allow any role to update a user. --&amp;gt;
      &amp;lt;beans:bean id=&quot;userSecurityAdvice&quot; class=&quot;org.appfuse.examples.webapp.security.UserSecurityAdvice&quot;/&amp;gt;
  &amp;lt;/beans:beans&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
The last bean, userSecurityAdvice, is an aspect that&apos;s needed to override some behavior in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. You won&apos;t need this normally when implementing Spring Security. 
&lt;/p&gt;
&lt;p&gt;Next, open &lt;em&gt;src/main/webapp/WEB-INF/web.xml&lt;/em&gt; and add Spring&apos;s DelegatingFilterProxy:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter&amp;gt;
    &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;targetBeanName&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;springSecurityFilterChain&amp;lt;/param-value&amp;gt;
    &amp;lt;/init-param&amp;gt;
&amp;lt;/filter&amp;gt;
&lt;/pre&gt;
&lt;p&gt;And add its filter-mapping just after the rewriteFilter in the filter-mappings section (order is important!):
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;rewriteFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
You don&apos;t need to add any dependencies in your pom.xml is because this project depends on AppFuse, which already contains these dependencies.
&lt;/p&gt;
&lt;p&gt;
At this point, if you restart Jetty (Ctrl+C and jetty:run again), you should be prompted to login when you click on the &quot;Users&quot; tab. Enter admin/admin to login. Spring Security is a bit easier to configure than Java EE 6 out-of-the-box, mostly because it doesn&apos;t require you to configure your container.
&lt;/p&gt;
&lt;p&gt;After logging in, you can try to logout by clicking the &quot;Logout&quot; link in the top-right corner. This calls a LogoutController with the following code that logs the user out.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public void logout(HttpServletResponse response) throws ServletException, IOException {
    request.getSession().invalidate();
    response.sendRedirect(request.getContextPath()); 
}
&lt;/pre&gt; 
&lt;p class=&quot;quote&quot; style=&quot;font-style: italic; color: #666&quot;&gt;NOTE: Spring Security has a way to configure &quot;logout&quot; to match a URL and get rid of a class like LogoutController. Since it was already in the project, I don&apos;t cover that in this tutorial.&lt;/p&gt;
&lt;p&gt;You&apos;ll notice that clicking this link doesn&apos;t log you out, even though the session is invalidated. The only way to logout with basic authentication is to close the browser. In order to get the ability to logout, as well as to have more control over the look-and-feel of the login, you can implement form-based authentication.
  Before you implement form-based authentication, I&apos;d like to show you how easy it is to force SSL with Spring Security.
&lt;/p&gt;
&lt;p id=&quot;ssl&quot;&gt;&lt;strong&gt;Force SSL&lt;/strong&gt;&lt;br/&gt;
Spring Security allows you to switch between secure (https) and non-secure (http) protocols using a simple &lt;em&gt;requires-channel&lt;/em&gt; attribute on the &amp;lt;intercept-url&amp;gt; element. Possible values are &quot;http&quot;, &quot;https&quot; and &quot;any&quot;. Add &lt;em&gt;requires-channel=&quot;https&quot;&lt;/em&gt; to your security.xml file:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;intercept-url pattern=&quot;/app/users&quot; access=&quot;ROLE_USER,ROLE_ADMIN&quot; requires-channel=&quot;https&quot;/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;In order for this to work, you have to configure Jetty to listen on an SSL port. Add the following just after the jetty-maven-plugin&apos;s &amp;lt;/webAppConfig&amp;gt; element in your pom.xml:
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;connectors&amp;gt;
    &amp;lt;connector implementation=&quot;org.eclipse.jetty.server.nio.SelectChannelConnector&quot;&amp;gt;
        &amp;lt;forwarded&amp;gt;true&amp;lt;/forwarded&amp;gt;
        &amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;
    &amp;lt;/connector&amp;gt;
    &amp;lt;connector implementation=&quot;org.eclipse.jetty.server.ssl.SslSelectChannelConnector&quot;&amp;gt;
        &amp;lt;forwarded&amp;gt;true&amp;lt;/forwarded&amp;gt;
        &amp;lt;port&amp;gt;8443&amp;lt;/port&amp;gt;
        &amp;lt;maxIdleTime&amp;gt;60000&amp;lt;/maxIdleTime&amp;gt;
        &amp;lt;keystore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/keystore&amp;gt;
        &amp;lt;password&amp;gt;appfuse&amp;lt;/password&amp;gt;
        &amp;lt;keyPassword&amp;gt;appfuse&amp;lt;/keyPassword&amp;gt;
    &amp;lt;/connector&amp;gt;
&amp;lt;/connectors&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The keystore must be generated for Jetty to start successfully, so add the keytool-maven-plugin just above the jetty-maven-plugin in pom.xml.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;keytool-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;
            &amp;lt;id&amp;gt;clean&amp;lt;/id&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;clean&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;
            &amp;lt;id&amp;gt;genkey&amp;lt;/id&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;genkey&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;keystore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/keystore&amp;gt;
        &amp;lt;dname&amp;gt;cn=localhost&amp;lt;/dname&amp;gt;
        &amp;lt;keypass&amp;gt;appfuse&amp;lt;/keypass&amp;gt;
        &amp;lt;storepass&amp;gt;appfuse&amp;lt;/storepass&amp;gt;
        &amp;lt;alias&amp;gt;appfuse&amp;lt;/alias&amp;gt;
        &amp;lt;keyalg&amp;gt;RSA&amp;lt;/keyalg&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now if you restart Jetty, go to &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; and click on the &quot;Users&quot; tab, you&apos;ll be prompted to accept the Untrusted Certificate and then redirected to https://localhost:8443/users after logging in. This is an 
  improvement on Java EE&apos;s user-data-constraint for two reasons:
  &lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;You can switch between http and https protocols. With Java EE, you can only force https. You have to write a custom filter to switch back to http.&lt;/li&gt;
    &lt;li&gt;Redirecting to https actually works. With Java EE (on Jetty at least), a 403 is returned instead of redirecting the request.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Now let&apos;s look at how to have more control over the look-and-feel of the login screen, as well as how to make logout work with form-based authentication.&lt;/p&gt;
&lt;p id=&quot;form-authentication&quot;&gt;&lt;strong&gt;Implement Form-based Authentication&lt;/strong&gt;&lt;br/&gt;
To change from basic to form-based authentication, you simply have to add a &amp;lt;form-login&amp;gt; element in security.xml&apos;s &amp;lt;http&amp;gt; element:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;http auto-config=&quot;true&quot;&amp;gt;
    &amp;lt;intercept-url pattern=&quot;/app/users&quot; access=&quot;ROLE_USER,ROLE_ADMIN&quot; requires-channel=&quot;https&quot;/&amp;gt;
    &amp;lt;form-login login-page=&quot;/login&quot; authentication-failure-url=&quot;/login?error=true&quot;
                login-processing-url=&quot;/j_security_check&quot;/&amp;gt;
    &amp;lt;http-basic/&amp;gt;
&amp;lt;/http&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
  You can leave the &amp;lt;http-basic&amp;gt; element since Spring Security is smart enough to serve up the form for browsers and use Basic Authentication for clients such as web services.
  
  The login.jsp page (that /login forwards to) already exists in the project, in the &lt;em&gt;src/main/webapp&lt;/em&gt; directory. The forwarding is done by the &lt;a href=&quot;http://www.tuckey.org/urlrewrite/&quot;&gt;UrlRewriteFilter&lt;/a&gt; with the following configuration in &lt;em&gt;src/main/webapp/WEB-INF/urlrewrite.xml&lt;/em&gt;. 
  
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;/login&amp;lt;/from&amp;gt;
    &amp;lt;to&amp;gt;/login.jsp&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&lt;/pre&gt;  
&lt;p&gt;
  This JSP has 3 important elements: 1) a form that submits to &quot;/j_security_check&quot;, 2) an input element named &quot;j_username&quot; and 3) an input element named &quot;j_password&quot;. If you restart Jetty, you&apos;ll now be prompted to login with this JSP instead of the basic authentication dialog.
&lt;/p&gt;
&lt;p id=&quot;remember-me&quot;&gt;&lt;strong&gt;Add Remember Me&lt;/strong&gt;&lt;br/&gt;
Remember Me is a feature you see in many web applications today. It&apos;s usually a checkbox on the login form that allows you to auto-login the next time you visit a site. This feature doesn&apos;t exist in Java EE security, but it does exist in Spring Security. To enable it, add the following just below &amp;lt;form-login&amp;gt; in security.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;remember-me user-service-ref=&quot;userDao&quot; key=&quot;e37f4b31-0c45-11dd-bd0b-0800200c9a66&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;Next, open &lt;em&gt;src/main/webapp/login.jsp&lt;/em&gt; and change the name of the &quot;remember me&quot; checkbox to be &lt;strong&gt;_spring_security_remember_me&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;input type=&quot;checkbox&quot; name=&quot;_spring_security_remember_me&quot; id=&quot;rememberMe&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;After making these changes, you should be able to restart Jetty, go to &lt;a href=&quot;http://localhost:8080/users&quot;&gt;http://localhost:8080/users&lt;/a&gt;, enter admin/adminjdbc, check the Remember Me checkbox and login. Then close your browser, and repeat the process. This time, you won&apos;t be prompted to login. For more information on this feature, see &lt;a href=&quot;http://static.springsource.org/spring-security/site/docs/3.0.x/reference/remember-me.html&quot;&gt;Spring Security&apos;s Remember Me documentation&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
While storing usernames and passwords in a file is convenient for demos, it&apos;s not very real-world-ish. The next section shows you how to configure Spring Security to use a database for its user store.
&lt;/p&gt;
&lt;p id=&quot;jdbc&quot;&gt;&lt;strong&gt;Store Users in a Database&lt;/strong&gt;&lt;br/&gt;
To store your users in a database instead of file, you&apos;ll need to add a &lt;em&gt;user-service-ref&lt;/em&gt; attribute to the &amp;lt;authentication-provider&amp;gt; element. You can also delete the &amp;lt;user-service&amp;gt; element. 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;authentication-manager alias=&quot;authenticationManager&quot;&amp;gt;
    &amp;lt;authentication-provider user-service-ref=&quot;userDao&quot;&amp;gt;
        &amp;lt;password-encoder hash=&quot;sha&quot;/&amp;gt;
    &amp;lt;/authentication-provider&amp;gt;
&amp;lt;/authentication-manager&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The &quot;userDao&quot; bean is provided by AppFuse and its &lt;a href=&quot;http://static.appfuse.org/appfuse-data/appfuse-hibernate/xref/org/appfuse/dao/hibernate/UserDaoHibernate.html&quot;&gt;UserDaoHibernate.java&lt;/a&gt; class. This 
  class implements Spring Security&apos;s &lt;a href=&quot;http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/UserDetailsService.html&quot;&gt;UserDetailsService&lt;/a&gt; interface.
  With Java EE, I had to configure a database connection and make sure the JDBC Driver was in my container&apos;s classpath. With Spring Security, you can talk to the database you already have configured in your application.
&lt;/p&gt;
&lt;div class=&quot;quote&quot; style=&quot;margin-left: 0; color: #666&quot;&gt;Of course, you could do this with Java EE too. One thing I neglected to show in my last tutorial was that 1) the app uses H2 and 2) I had to configure Java EE&apos;s database to be MySQL. This was because when I tried to access my H2 instance, I got an error about two threads trying to access it at once.
&lt;pre style=&quot;margin-top: 10px; margin-bottom: 0&quot;&gt;
2011-05-13 08:47:29.081:WARN::UserRealm Java EE Login could not connect to database; will try later
org.h2.jdbc.JdbcSQLException: Database may be already in use: &quot;Locked by another process&quot;. 
        Possible solutions: close all other connection(s); use the server mode [90020-154]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
	at org.h2.message.DbException.get(DbException.java:167)
	at org.h2.message.DbException.get(DbException.java:144)
	at org.h2.store.FileLock.getExceptionAlreadyInUse(FileLock.java:443)
	at org.h2.store.FileLock.lockFile(FileLock.java:338)
	at org.h2.store.FileLock.lock(FileLock.java:134)
	at org.h2.engine.Database.open(Database.java:535)
	at org.h2.engine.Database.openDatabase(Database.java:218)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;!-- Figure out exact error from H2 --&gt;
&lt;p&gt;The password for the &quot;admin&quot; user is configured in &lt;em&gt;src/test/resources/sample-data.xml&lt;/em&gt; and it&apos;s loaded by &lt;a href=&quot;http://dbunit.sourceforge.net/&quot;&gt;DbUnit&lt;/a&gt; before the application starts. 
  You can view your pom.xml and the dbunit-maven-plugin&apos;s configuration if you&apos;re interested in learning how this is done. The password is currently configured to &quot;adminjdbc&quot;, but you can reset it by
  &lt;a href=&quot;http://darrenfauth.com/generators/sha1&quot;&gt;generating a new password&lt;/a&gt; and modifying sample-data.xml.
&lt;/p&gt;
&lt;p&gt;Now if you restart Jetty, you should be able to login with admin/adminjdbc and view the list of users.
&lt;/p&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
In this tutorial, you learned how to implement authentication using Spring Security 3.0.5. In addition to the basic XML configuration, Spring Security also provides a AOP support and annotations you can use to secure methods. It also has many more features than standard Java EE Security. In my opinion, it&apos;s the most mature security framework we have in Java today. Currently, I think its &lt;a href=&quot;http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity.html&quot;&gt;reference documentation&lt;/a&gt; is the best place to learn more.
&lt;/p&gt;
There are a few limitations I found with Spring Security:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The authentication mechanism (file, database, ldap, etc.) is contained in the WAR&lt;/li&gt;
&lt;li&gt;Securing methods only works on Spring beans&lt;/li&gt;
&lt;li&gt;Remember Me doesn&apos;t work in my screencast (because I forgot to rename the checkbox in login.jsp)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;&lt;p&gt;Of course, you can configure Spring to load its configuration from outside the WAR (e.g. a file or JNDI), but it&apos;s not as easy as including the configuration in your app.
  &lt;/p&gt;
  &lt;p&gt;In the next couple weeks, I&apos;ll post &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part2&quot;&gt;Part III&lt;/a&gt; of this series, where I&apos;ll show you how to implement this same set of features using Apache Shiro. In the meantime, please let me know if you have any questions.
&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;
I created the screencasts with &lt;a href=&quot;http://www.techsmith.com/camtasia/&quot; style=&quot;color: #666&quot;&gt;Camtasia&lt;/a&gt;. For small screens, and embedding in the presentation, I created it at 50% and used the SmartFocus feature to zoom in and out during the demo. For larger screens, I published &lt;a href=&quot;http://www.youtube.com/watch?v=poc5dyImbig&quot; style=&quot;color: #666&quot;&gt;another screencast at 100%, in HD&lt;/a&gt;. If you have a preference for which screencast is better, I&apos;d love to hear about it.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_application_security_part</id>
        <title type="html">Java Web Application Security - Part I: Java EE 6 Login Demo</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_application_security_part"/>
        <published>2011-05-05T16:58:00-06:00</published>
        <updated>2022-08-22T14:56:40-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="ujug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="web" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;Back in February, I &lt;a href=&quot;http://raibledesigns.com/rd/entry/upcoming_conferences_tssjs_in_las&quot;&gt;wrote about my upcoming conferences&lt;/a&gt;:&lt;/p&gt;
&lt;p style=&quot;color: #666; border-top: 1px dotted silver; padding-top: 10px; margin-top: -5px&quot;&gt;
In addition to Vegas and Poland, there&apos;s a couple other events I might speak at in the next few months: the &lt;a href=&quot;http://www.ujug.org/&quot;&gt;Utah Java Users Group&lt;/a&gt; (possibly in April), &lt;a href=&quot;http://jazoon.com/&quot;&gt;Jazoon&lt;/a&gt; and &lt;a href=&quot;http://uberconf.com/conference/denver/2011/07/home&quot;&gt;&#220;berConf&lt;/a&gt; (if my proposals are accepted). For these events, I&apos;m hoping to present the following talk:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&lt;strong&gt;Webapp Security: Develop. Penetrate. Protect. Relax.&lt;/strong&gt;&lt;br&gt;
In this session, you&apos;ll learn how to implement authentication in your Java web applications using Spring Security, Apache Shiro and good ol&apos; Java EE Container Managed Authentication. You&apos;ll also learn how to secure your REST API with OAuth and lock it down with SSL.
&lt;br&gt;&lt;br&gt;
After learning how to develop authentication, I&apos;ll introduce you to OWASP, the OWASP Top 10, its Testing Guide and its Code Review Guide. From there, I&apos;ll discuss using WebGoat to verify your app is secure and commercial tools like webapp firewalls and accelerators.&lt;/p&gt;
&lt;p&gt;Fast forward a couple months and I&apos;m happy to say that I&apos;ve completed my talk at the Utah JUG and it&apos;s been accepted at Jazoon and &#220;ber Conf. For this talk, I created a presentation that primarily consists of demos implementing basic, form and Ajax authentication using &lt;a href=&quot;http://download.oracle.com/javaee/6/tutorial/doc/gkbaa.html&quot;&gt;Java EE 6&lt;/a&gt;, &lt;a href=&quot;http://static.springsource.org/spring-security/site/&quot;&gt;Spring Security&lt;/a&gt; and &lt;a href=&quot;http://shiro.apache.org/&quot;&gt;Apache Shiro&lt;/a&gt;. In the process of creating the demos, I learned (or re-educated myself) how to do a number of things in all 3 frameworks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement Basic Authentication&lt;/li&gt;
&lt;li&gt;Implement Form-based Authentication&lt;/li&gt;
&lt;li&gt;Implement Ajax HTTP -&gt; HTTPS Authentication (with programmatic APIs)&lt;/li&gt;
&lt;li&gt;Force SSL for certain URLs&lt;/li&gt;
&lt;li&gt;Implement a file-based store of users and passwords (in Jetty/Maven and Tomcat standalone)&lt;/li&gt;
&lt;li&gt;Implement a database store of users and passwords (in Jetty/Maven and Tomcat standalone)&lt;/li&gt;
&lt;li&gt;Encrypt Passwords&lt;/li&gt;
&lt;li&gt;Secure methods with annotations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the demos, I showed the audience how to do almost all of these, but skipped Tomcat standalone and securing methods in the interest of time. In July, when I do this talk at &#220;berConf, I plan on adding 1) hacking the app (to show security holes) and 2) fixing it to protect it against vulnerabilities. 
&lt;/p&gt;
&lt;p&gt;I told the audience at UJUG that I would post the presentation and was planning on recording screencasts of the various demos so the online version of the presentation would make more sense. Today, I&apos;ve finished the first screencast showing how to implement security with Java EE 6. Below is the presentation (with the screencast embedded on slide 10) as well as a step-by-step tutorial.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;object id=&quot;__sse7850034&quot; width=&quot;510&quot; height=&quot;426&quot;&gt; &lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=javawebapplicationsecurityujug2011-110505121131-phpapp02&amp;stripped_title=java-web-application-security-utah-jug-2011&amp;userName=mraible&quot; /&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt; &lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt; &lt;embed name=&quot;__sse7850034&quot; src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=javawebapplicationsecurityujug2011-110505121131-phpapp02&amp;stripped_title=java-web-application-security-utah-jug-2011&amp;userName=mraible&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;510&quot; height=&quot;426&quot;&gt;&lt;/embed&gt; &lt;/object&gt;
&lt;br/&gt;
&lt;div style=&quot;font-size: .9em; text-align: left&quot;&gt;* You can also &lt;a href=&quot;http://www.youtube.com/watch?v=4LD4mF5ex2U&quot;&gt;watch the screencast on YouTube&lt;/a&gt; or &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Java_Web_Application_Security_UJUG2011.pdf&quot;&gt;download the presentation PDF&lt;/a&gt;.&lt;/div&gt;
&lt;/p&gt;
&lt;p id=&quot;javaee6-login-tutorial&quot;&gt;&lt;strong&gt;Java EE 6 Login Tutorial&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://raibledesigns.com/rd/entry/java_web_application_security_part#download-run&quot;&gt;Download and Run the Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raibledesigns.com/rd/entry/java_web_application_security_part#secure-basic&quot;&gt;Implement Basic Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raibledesigns.com/rd/entry/java_web_application_security_part#form-authentication&quot;&gt;Implement Form-based Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raibledesigns.com/rd/entry/java_web_application_security_part#ssl&quot;&gt;Force SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raibledesigns.com/rd/entry/java_web_application_security_part#jdbc&quot;&gt;Store Users in a Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raibledesigns.com/rd/entry/java_web_application_security_part#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;download-run&quot;&gt;&lt;strong&gt;Download and Run the Application&lt;/strong&gt;&lt;br/&gt;

To begin, &lt;a href=&quot;http://static.raibledesigns.com/downloads/ajax-login-javaee-tutorial-1.0.zip&quot;&gt;download the application&lt;/a&gt; you&apos;ll be implementing security in. This app is a stripped-down version of the Ajax Login application I wrote for my article on &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery&quot;&gt;Implementing Ajax Authentication using jQuery, Spring Security and HTTPS&lt;/a&gt;. You&apos;ll need Java 6 and Maven installed to run the app. Run it using &lt;strong&gt;mvn jetty:run&lt;/strong&gt; and open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; in your browser. You&apos;ll see it&apos;s a simple CRUD application for users and there&apos;s no login required to add or delete users.&lt;/p&gt;

&lt;p id=&quot;secure-basic&quot;&gt;&lt;strong&gt;Implement Basic Authentication&lt;/strong&gt;&lt;br/&gt;
  
The first step is to protect the list screen so people have to login to view users. To do this, add the following to the bottom of &lt;em&gt;src/main/webapp/WEB-INF/web.xml&lt;/em&gt;:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;security-constraint&amp;gt;
    &amp;lt;web-resource-collection&amp;gt;
        &amp;lt;web-resource-name&amp;gt;users&amp;lt;/web-resource-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/users&amp;lt;/url-pattern&amp;gt;
        &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;
        &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;
    &amp;lt;/web-resource-collection&amp;gt;
    &amp;lt;auth-constraint&amp;gt;
        &amp;lt;role-name&amp;gt;ROLE_ADMIN&amp;lt;/role-name&amp;gt;
    &amp;lt;/auth-constraint&amp;gt;
&amp;lt;/security-constraint&amp;gt;

&amp;lt;login-config&amp;gt;
    &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;
    &amp;lt;realm-name&amp;gt;Java EE Login&amp;lt;/realm-name&amp;gt;
&amp;lt;/login-config&amp;gt;

&amp;lt;security-role&amp;gt;
    &amp;lt;role-name&amp;gt;ROLE_ADMIN&amp;lt;/role-name&amp;gt;
&amp;lt;/security-role&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
At this point, if you restart Jetty (Ctrl+C and jetty:run again), you&apos;ll get an error about a missing LoginService. This happens because Jetty doesn&apos;t know where the &quot;Java EE Login&quot; realm is located. Add the following to &lt;em&gt;pom.xml&lt;/em&gt;, just after &amp;lt;/webAppConfig&gt; in the Jetty plugin&apos;s configuration.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;loginServices&amp;gt;
    &amp;lt;loginService implementation=&quot;org.eclipse.jetty.security.HashLoginService&quot;&amp;gt;
        &amp;lt;name&amp;gt;Java EE Login&amp;lt;/name&amp;gt;
        &amp;lt;config&amp;gt;${basedir}/src/test/resources/realm.properties&amp;lt;/config&amp;gt;
    &amp;lt;/loginService&amp;gt;
&amp;lt;/loginServices&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The realm.properties file already exists in the project and contains user names and passwords. Start the app again using &lt;strong&gt;mvn jetty:run&lt;/strong&gt; and you should be prompted to login when you click on the &quot;Users&quot; tab. Enter admin/admin to login.
&lt;/p&gt;
&lt;p&gt;After logging in, you can try to logout by clicking the &quot;Logout&quot; link in the top-right corner. This calls a LogoutController with the following code that logs the user out.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public void logout(HttpServletResponse response) throws ServletException, IOException {
    request.getSession().invalidate();
    response.sendRedirect(request.getContextPath());
}
&lt;/pre&gt; 
&lt;p&gt;You&apos;ll notice that clicking this link doesn&apos;t log you out, even though the session is invalidated. The only way to logout with basic authentication is to close the browser. In order to get the ability to logout, as well as to have more control over the look-and-feel of the login, you can implement form-based authentication.
&lt;/p&gt;
&lt;p id=&quot;form-authentication&quot;&gt;&lt;strong&gt;Implement Form-based Authentication&lt;/strong&gt;&lt;br/&gt;
To change from basic to form-based authentication, you simply have to replace the &amp;lt;login-config&amp;gt; in your web.xml with the following:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;login-config&amp;gt;
    &amp;lt;auth-method&amp;gt;FORM&amp;lt;/auth-method&amp;gt;
    &amp;lt;form-login-config&amp;gt;
        &amp;lt;form-login-page&amp;gt;/login.jsp&amp;lt;/form-login-page&amp;gt;
        &amp;lt;form-error-page&amp;gt;/login.jsp?error=true&amp;lt;/form-error-page&amp;gt;
    &amp;lt;/form-login-config&amp;gt;
&amp;lt;/login-config&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The login.jsp page already exists in the project, in the &lt;em&gt;src/main/webapp&lt;/em&gt; directory. This JSP has 3 important elements: 1) a form that submits to &quot;${contextPath}/j_security_check&quot;, 2) an input element named &quot;j_username&quot; and 3) an input element named &quot;j_password&quot;. If you restart Jetty, you&apos;ll now be prompted to login with this JSP instead of the basic authentication dialog.
&lt;/p&gt;
&lt;p id=&quot;ssl&quot;&gt;&lt;strong&gt;Force SSL&lt;/strong&gt;&lt;br/&gt;
Another thing you might want to implement to secure your application is forcing SSL for certain URLs. To do this on the same &amp;lt;security-constraint&amp;gt; you already have in web.xml, add the following after &amp;lt;/auth-constraint&gt;:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;user-data-constraint&amp;gt;
    &amp;lt;transport-guarantee&amp;gt;CONFIDENTIAL&amp;lt;/transport-guarantee&amp;gt;
&amp;lt;/user-data-constraint&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To configure Jetty to listen on an SSL port, add the following just after &amp;lt;/loginServices&amp;gt; in your pom.xml:
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;connectors&amp;gt;
    &amp;lt;connector implementation=&quot;org.eclipse.jetty.server.nio.SelectChannelConnector&quot;&amp;gt;
        &amp;lt;forwarded&amp;gt;true&amp;lt;/forwarded&amp;gt;
        &amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;
    &amp;lt;/connector&amp;gt;
    &amp;lt;connector implementation=&quot;org.eclipse.jetty.server.ssl.SslSelectChannelConnector&quot;&amp;gt;
        &amp;lt;forwarded&amp;gt;true&amp;lt;/forwarded&amp;gt;
        &amp;lt;port&amp;gt;8443&amp;lt;/port&amp;gt;
        &amp;lt;maxIdleTime&amp;gt;60000&amp;lt;/maxIdleTime&amp;gt;
        &amp;lt;keystore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/keystore&amp;gt;
        &amp;lt;password&amp;gt;appfuse&amp;lt;/password&amp;gt;
        &amp;lt;keyPassword&amp;gt;appfuse&amp;lt;/keyPassword&amp;gt;
    &amp;lt;/connector&amp;gt;
&amp;lt;/connectors&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The keystore must be generated for Jetty to start successfully, so add the keytool-maven-plugin just above the jetty-maven-plugin in pom.xml.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;keytool-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;
            &amp;lt;id&amp;gt;clean&amp;lt;/id&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;clean&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;
            &amp;lt;id&amp;gt;genkey&amp;lt;/id&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;genkey&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;keystore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/keystore&amp;gt;
        &amp;lt;dname&amp;gt;cn=localhost&amp;lt;/dname&amp;gt;
        &amp;lt;keypass&amp;gt;appfuse&amp;lt;/keypass&amp;gt;
        &amp;lt;storepass&amp;gt;appfuse&amp;lt;/storepass&amp;gt;
        &amp;lt;alias&amp;gt;appfuse&amp;lt;/alias&amp;gt;
        &amp;lt;keyalg&amp;gt;RSA&amp;lt;/keyalg&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now if you restart Jetty, go to http://localhost:8080 and click on the &quot;Users&quot; tab, you&apos;ll get a 403. What the heck?! When this first happened to me, it took me a while to figure out. It turns out that Jetty doesn&apos;t redirect to HTTPS when using Java EE authentication, so you have to manually type in &lt;a href=&quot;https://localhost:8443/&quot;&gt;https://localhost:8443/&lt;/a&gt; (or add a filter to redirect for you). If you deployed this same application on Tomcat (after &lt;a href=&quot;http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html&quot;&gt;enabling SSL&lt;/a&gt;), it would redirect for you.
&lt;/p&gt;
&lt;p id=&quot;jdbc&quot;&gt;&lt;strong&gt;Store Users in a Database&lt;/strong&gt;&lt;br/&gt;
Finally, to store your users in a database instead of file, you&apos;ll need to change the &amp;lt;loginService&amp;gt; in the Jetty plugin&apos;s configuration. Replace the existing &amp;lt;loginService&amp;gt; element with the following:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;loginServices&amp;gt;
    &amp;lt;loginService implementation=&quot;org.eclipse.jetty.security.JDBCLoginService&quot;&amp;gt;
        &amp;lt;name&amp;gt;Java EE Login&amp;lt;/name&amp;gt;
        &amp;lt;config&amp;gt;${basedir}/src/test/resources/jdbc-realm.properties&amp;lt;/config&amp;gt;
    &amp;lt;/loginService&amp;gt;
&amp;lt;/loginServices&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The jdbc-realm.properties file already exists in the project and contains the database settings and table/column names for the user and role information.
&lt;/p&gt;
&lt;pre&gt;
jdbcdriver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost/appfuse
username = root
password =
usertable = app_user
usertablekey = id
usertableuserfield = username
usertablepasswordfield = password
roletable = role
roletablekey = id
roletablerolefield = name
userroletable = user_role
userroletableuserkey = user_id
userroletablerolekey = role_id
cachetime = 300
&lt;/pre&gt;
&lt;p&gt;Of course, you&apos;ll need to &lt;a href=&quot;http://dev.mysql.com/downloads/mysql/5.5.html&quot;&gt;install MySQL&lt;/a&gt; for this to work. After installing it, you should be able to create an &quot;appfuse&quot; database and populate it using the following commands:
&lt;/p&gt;
&lt;pre&gt;
mysql -u root -p -e &apos;create database appfuse&apos;
curl https://gist.github.com/raw/958091/ceecb4a6ae31c31429d5639d0d1e6bfd93e2ea42/create-appfuse.sql &gt; create-appfuse.sql
mysql -u root -p appfuse &amp;lt; create-appfuse.sql
&lt;/pre&gt;
&lt;p&gt;Next you&apos;ll need to configure Jetty so it has MySQL&apos;s JDBC Driver in its classpath. To do this, add the following dependency just after the &amp;lt;configuration&amp;gt; element (before &amp;lt;executions&amp;gt;) in pom.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependencies&amp;gt;
    &amp;lt;!-- MySQL for JDBC Realm --&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;5.1.14&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now run the &lt;em&gt;jetty-password.sh&lt;/em&gt; file in the root directory of the project to generate a password of your choosing. For example:&lt;/p&gt;
&lt;pre&gt;
$ sh jetty-password.sh javaeelogin
javaeelogin
OBF:1vuj1t2v1wum1u9d1ugo1t331uh21ua51wts1t3b1vur
MD5:53b176e6ce1b5183bc970ef1ebaffd44
&lt;/pre&gt;&lt;p&gt;The last two lines are obfuscated and MD5 versions of the password. Update the &lt;strong&gt;admin&lt;/strong&gt; user&apos;s password to this new value. You can do this with the following SQL statement.
&lt;/p&gt;
&lt;pre&gt;
UPDATE app_user SET password=&apos;MD5:53b176e6ce1b5183bc970ef1ebaffd44&apos; WHERE username = &apos;admin&apos;;
&lt;/pre&gt;
&lt;p&gt;Now if you restart Jetty, you should be able to login with admin/javaeelogin and view the list of users.
&lt;/p&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
In this tutorial, you learned how to implement authentication using standard Java EE 6. In addition to the basic XML configuration, there&apos;s also some new methods in HttpServletRequest for Java EE 6 and Servlet 3.0:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;authenticate(response)&lt;/li&gt;
&lt;li&gt;login(user, pass)&lt;/li&gt;
&lt;li&gt;logout()&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;This tutorial doesn&apos;t show you how to use them, but I did play with them a bit as part of my UJUG demo when implementing Ajax authentication. I found that login() did work, but it didn&apos;t persist the authentication for the users session. I also found that after calling logout(), I still needed to invalidate the session to completely logout the user. There are some additional limitations I found with Java EE authentication, namely:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;No error messages for failed logins&lt;/li&gt;
&lt;li&gt;No Remember Me&lt;/li&gt;
&lt;li&gt;No auto-redirect from HTTP to HTTPS&lt;/li&gt;
&lt;li&gt;Container has to be configured&lt;/li&gt;
&lt;li&gt;Doesn&#8217;t support regular expressions for URLs&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Of course, no error messages indicating why login failed is probably a good thing (you don&apos;t want to tell users why their credentials failed). However, when you&apos;re trying to figure out if your container is configured properly, the lack of container logging can be a pain.
  &lt;/p&gt;
  &lt;p&gt;In the next couple weeks, I&apos;ll post &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part1&quot;&gt;Part II&lt;/a&gt; of this series, where I&apos;ll show you how to implement this same set of features using Spring Security. In the meantime, please let me know if you have any questions.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_1_released</id>
        <title type="html">AppFuse 2.1 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_1_released"/>
        <published>2011-04-04T09:38:05-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse-light" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are JPA 2, JSF 2, Tapestry 5 and Spring 3. In addition, we&apos;ve migrated from XFire to CXF and enabled REST for web services. There&apos;s even a new &lt;b&gt;appfuse-ws&lt;/b&gt; archetype that leverages &lt;a href=&quot;http://enunciate.codehaus.org&quot;&gt;Enunciate&lt;/a&gt; to generate web service endpoints, documentation and downloadable clients. This release fixes many issues with archetypes, improving startup time and allowing jetty:run to be used for quick turnaround while developing. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0&quot; title=&quot;Release Notes 2.1.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;AppFuse is an open source project and application that uses open source frameworks to help you develop Web applications with Java quickly and efficiently. It was originally developed to eliminate the ramp-up time when building new web applications. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project. If you use &lt;a href=&quot;http://appfuse.org/display/APF/Using+JRebel+with+IntelliJ+IDEA&quot;&gt;JRebel with IntelliJ&lt;/a&gt;, you can achieve zero-turnaround in your project and develop features without restarting the server.
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Release Details&lt;/b&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.appfuse.org/archetypes.html&quot;&gt;Archetypes&lt;/a&gt; now include all the source for the web modules so using jetty:run and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose with persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &quot;appfuse:full-source&quot;. &lt;/p&gt;

&lt;p&gt;AppFuse comes in a number of different flavors. It offers &quot;light&quot;, &quot;basic&quot; and &quot;modular&quot; and archetypes. Light archetypes use an embedded H2 database and contain a simple CRUD example. Light archetypes allow code generation and full-source features, but do not currently support Stripes or Wicket. Basic archetypes have web services using CXF, authentication from Spring Security and features including signup, login, file upload and CSS theming. Modular archetypes are similar to basic archetypes, except they have multiple modules which allows you to separate your services from your web project.&lt;/p&gt;

&lt;p&gt;AppFuse provides archetypes for JSF, Spring MVC, Struts 2 and Tapestry 5. The light archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket. You can see demos of these archetypes at &lt;a href=&quot;http://demo.appfuse.org&quot;&gt;http://demo.appfuse.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any issues, please report them on the mailing list or &lt;a href=&quot;http://issues.appfuse.org/secure/CreateIssue%21default.jspa&quot;&gt;create an issue in JIRA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot; style=&quot;color: #666&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; style=&quot;color: #666&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot; style=&quot;color: #666&quot;&gt;Contegix&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com&quot; style=&quot;color: #666&quot;&gt;JetBrains&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot; style=&quot;color: #666&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project.&lt;/p&gt;&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/upgrading_to_jsf_2</id>
        <title type="html">Upgrading to JSF 2</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/upgrading_to_jsf_2"/>
        <published>2011-03-07T13:24:53-07:00</published>
        <updated>2011-03-07T19:30:33-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="urlrewritefilter" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="richfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tomahawk" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="facelets" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last week, I spent a few hours upgrading &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; from JSF 1.2 to JSF 2.0. In reality, I upgraded from &lt;a href=&quot;http://myfaces.apache.org&quot;&gt;MyFaces&lt;/a&gt; 1.2.7 to 2.0.4, but all JSF implementations should be the same, right? All in all, it was a pretty easy upgrade with a few minor AppFuse-specific things. My goal in upgrading was to do the bare minimum to get things working and to leave integration of JSF 2 features for a later date.&lt;/p&gt;

&lt;p&gt;In addition to upgrading MyFaces, I had to upgrade Tomahawk by changing the dependency&apos;s artifactId to &lt;strong&gt;tomahawk20&lt;/strong&gt;. I was also able to remove the following listener from my web.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;listener&gt;
    &amp;lt;listener-class&gt;org.apache.myfaces.webapp.StartupServletContextListener&amp;lt;/listener-class&gt;
&amp;lt;listener&gt;
&lt;/pre&gt;
&lt;p&gt;After that, I discovered that MyFaces uses a new URI (/javax.faces.resource/) for serving up some of its resource files. I kindly asked Spring Security to ignore these requests by adding the following to my security.xml file.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;intercept-url pattern=&quot;/javax.faces.resource/**&quot; filters=&quot;none&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;Since JSF 2 includes Facelets by default, I tried removing Facelets as a dependency. After doing this, I received the following error:
&lt;/p&gt;
&lt;pre&gt;
ERROR [308855416@qtp-120902214-7] ViewHandlerWrapper.fillChain(158) | Error instantiation parent Faces ViewHandler
java.lang.ClassNotFoundException: com.sun.facelets.FaceletViewHandler
        at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:401)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
        at org.ajax4jsf.framework.ViewHandlerWrapper.fillChain(ViewHandlerWrapper.java:144)
        at org.ajax4jsf.framework.ViewHandlerWrapper.calculateRenderKitId(ViewHandlerWrapper.java:68)
        at org.apache.myfaces.lifecycle.DefaultRestoreViewSupport.isPostback(DefaultRestoreViewSupport.java:179)
        at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:113)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
&lt;/pre&gt;
&lt;p&gt;Figuring this was caused by the following element in my web.xml ...
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;context-param&amp;gt;
    &amp;lt;param-name&amp;gt;org.ajax4jsf.VIEW_HANDLERS&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;com.sun.facelets.FaceletViewHandler&amp;lt;/param-value&amp;gt;
&amp;lt;/context-param&amp;gt;
&lt;/pre&gt;
&lt;p&gt;... I removed it and tried again. This time I received a NoClassDefFoundError:&lt;/p&gt;
&lt;pre&gt;
java.lang.NoClassDefFoundError: com/sun/facelets/tag/TagHandler
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:392)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at org.apache.myfaces.shared_impl.util.ClassUtils.classForName(ClassUtils.java:184)
        at org.apache.myfaces.view.facelets.util.ReflectionUtil.forName(ReflectionUtil.java:67)
&lt;/pre&gt;
&lt;p&gt;Since everything seemed to work with Facelets in the classpath, I decided to save this headache for a later date. I entered two issues in AppFuse&apos;s JIRA, one for &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1234&quot;&gt;removing Facelets&lt;/a&gt; and one for &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1233&quot;&gt;replacing Ajax4JSF with RichFaces&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;The next issue I encountered was redirecting from AppFuse&apos;s password hint page. The navigation-rule for this page is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;navigation-rule&amp;gt;
    &amp;lt;from-view-id&amp;gt;/passwordHint.xhtml&amp;lt;/from-view-id&amp;gt;
    &amp;lt;navigation-case&amp;gt;
        &amp;lt;from-outcome&amp;gt;success&amp;lt;/from-outcome&amp;gt;
        &amp;lt;to-view-id&amp;gt;/login&amp;lt;/to-view-id&amp;gt;
        &amp;lt;redirect/&amp;gt;
    &amp;lt;/navigation-case&amp;gt;
&amp;lt;/navigation-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;With JSF 2.0, the rule changes the URL to /login.xhtml when redirecting (where it was left as /login with 1.2) and it was caught by the security setting in my web.xml that prevents users from viewing raw templates.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;security-constraint&amp;gt;
    &amp;lt;web-resource-collection&amp;gt;
        &amp;lt;web-resource-name&amp;gt;Protect XHTML Templates&amp;lt;/web-resource-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;*.xhtml&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/web-resource-collection&amp;gt;
    &amp;lt;auth-constraint/&amp;gt;
&amp;lt;/security-constraint&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To solve this issue, I had to make a couple of changes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment out the security-constraint in web.xml and move it to Spring Security&apos;s security.xml file.
&lt;pre class=&quot;brush: xml; toolbar: false&quot; style=&quot;margin: 5px 0 0 0&quot;&gt;
&amp;lt;intercept-url pattern=&quot;/**/*.xhtml&quot; access=&quot;ROLE_NOBODY&quot;/&gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Add a rule to urlrewrite.xml that redirects back to login (since login.xhtml doesn&apos;t exist and I&apos;m using extensionless URLs).
&lt;pre class=&quot;brush: xml&quot; style=&quot;margin: 5px 0 0 0&quot;&gt;
&amp;lt;rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^/login.xhtml$&amp;lt;/from&amp;gt;
    &amp;lt;to type=&quot;redirect&quot;&amp;gt;%{context-path}/login&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After getting the Password Hint feature passing in the browser, I tried running the integration tests (powered by &lt;a href=&quot;http://webtest.canoo.com&quot;&gt;Canoo WebTest&lt;/a&gt;). The Password Hint test kept failing with the following error:
&lt;/p&gt;
&lt;pre&gt;
[ERROR] /Users/mraible/dev/appfuse/web/jsf/src/test/resources/web-tests.xml:51: JavaScript error loading
page http://localhost:9876/appfuse-jsf-2.1.0-SNAPSHOT/passwordHint?username=admin: syntax error (http://
localhost:9876/appfuse-jsf-2.1.0-SNAPSHOT/javax.faces.resource/oamSubmit.js.jsf?ln=org.apache.myfaces#122)
&lt;/pre&gt;
&lt;p&gt;Figuring this was caused by my hack to &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/passwordHint.xhtml?r=2866&quot;&gt;submit the form when the page was loaded&lt;/a&gt;, I turned to &lt;a href=&quot;http://ocpsoft.com/prettyfaces/&quot;&gt;Pretty Faces&lt;/a&gt;, which allows you to call a method directly from a URL. After adding the Pretty Faces dependencies to my pom.xml, I created a src/main/webapp/WEB-INF/pretty-config.xml file with the following XML:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;url-mapping&amp;gt;
    &amp;lt;pattern value=&quot;/editProfile&quot;/&amp;gt;
    &amp;lt;view-id value=&quot;/userForm.jsf&quot;/&amp;gt;
    &amp;lt;action&amp;gt;#{userForm.edit}&amp;lt;/action&amp;gt;
&amp;lt;/url-mapping&amp;gt;

&amp;lt;url-mapping&amp;gt;
    &amp;lt;pattern value=&quot;/passwordHint/#{username}&quot;/&amp;gt;
    &amp;lt;view-id value=&quot;/passwordHint.jsf&quot;/&amp;gt;
    &amp;lt;action&amp;gt;#{passwordHint.execute}&amp;lt;/action&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This allowed me to remove both editProfile.xhtml and passwordHint.xhtml, both of which simply auto-submitted forms.&lt;/p&gt;
&lt;p&gt;At this point, I figured I&apos;d be good to go and ran my integration tests again. The first thing I discovered was that &quot;.jsf&quot; was being tacked onto my pretty URL, most likely by the UrlRewriteFilter. Adding the following to my PasswordHint.java class solved this.
&lt;/p&gt;
&lt;pre class=&quot;brush: java; toolbar: false&quot;&gt;
if (username.endsWith(&quot;.jsf&quot;)) {
    username = username.substring(0, username.indexOf(&quot;.jsf&quot;));
}
&lt;/pre&gt;
&lt;p&gt;The next thing was a cryptic error that took me a while to figure out.&lt;/p&gt;
&lt;pre&gt;
DEBUG [1152467051@qtp-144702232-0] PasswordHint.execute(38) | Processing Password Hint...
2011-03-05 05:48:52.471:WARN::/passwordHint/admin
com.ocpsoft.pretty.PrettyException: Exception occurred while processing &amp;lt;:#{passwordHint.execute}&gt; null
        at com.ocpsoft.pretty.faces.beans.ActionExecutor.executeActions(ActionExecutor.java:71)
        at com.ocpsoft.pretty.faces.event.PrettyPhaseListener.processEvent(PrettyPhaseListener.java:214)
        at com.ocpsoft.pretty.faces.event.PrettyPhaseListener.afterPhase(PrettyPhaseListener.java:108)
        at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:111)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:185)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
&lt;/pre&gt;
&lt;p&gt;Digging into the bowels of MyFaces, I discovered a class was looking for a viewId with an extension and no view-id was being set. Adding the following to the top of my execute() method solved this.
&lt;/p&gt;
&lt;pre class=&quot;brush: java; toolbar: false&quot;&gt;
getFacesContext().getViewRoot().setViewId(&quot;/passwordHint.xhtml&quot;);
&lt;/pre&gt;
&lt;p&gt;After making this change, all AppFuse&apos;s integration tests are passing and the upgrade seems complete. The only other issues I encountered were logging-related. The first is an error about Tomahawk that doesn&apos;t seem to affect anything.
&lt;/p&gt;
&lt;pre&gt;
Mar 5, 2011 6:44:01 AM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
SEVERE: Error Loading Library: jar:file:/Users/mraible/.m2/repository/org/apache/myfaces/tomahawk/tomahawk20/1.1.10/tomahawk20-1.1.10.jar!/META-INF/tomahawk.taglib.xml
java.io.IOException: Error parsing [jar:file:/Users/mraible/.m2/repository/org/apache/myfaces/tomahawk/tomahawk20/1.1.10/tomahawk20-1.1.10.jar!/META-INF/tomahawk.taglib.xml]: 
        at com.sun.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:410)
        at com.sun.facelets.compiler.TagLibraryConfig.loadImplicit(TagLibraryConfig.java:431)
        at com.sun.facelets.compiler.Compiler.initialize(Compiler.java:87)
        at com.sun.facelets.compiler.Compiler.compile(Compiler.java:104)
&lt;/pre&gt;
&lt;p&gt;The second is excessive logging from MyFaces. As far as I can tell, this is because MyFaces switched to java.util.logging instead of commons logging. With all the frameworks that AppFuse leverages, I think it has all the logging frameworks in its classpath now. I was hoping to fix this by &lt;a href=&quot;http://old.nabble.com/Turn-down-logging-in-2.0.4--td31068698.html&quot;&gt;posting a message to the mailing list&lt;/a&gt;, but haven&apos;t received a reply yet.
&lt;/p&gt;
&lt;pre&gt;
[WARNING] [talledLocalContainer] Mar 5, 2011 6:50:25 AM org.apache.myfaces.config.annotation.TomcatAnnotationLifecycleProvider newInstance
[WARNING] [talledLocalContainer] INFO: Creating instance of org.appfuse.webapp.action.BasePage
[WARNING] [talledLocalContainer] Mar 5, 2011 6:50:25 AM org.apache.myfaces.config.annotation.TomcatAnnotationLifecycleProvider destroyInstance
[WARNING] [talledLocalContainer] INFO: Destroy instance of org.appfuse.webapp.action.BasePage
&lt;/pre&gt;
&lt;p&gt;After successfully upgrading AppFuse, I turned to AppFuse Light, where things were &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse-light/?cs=243&quot;&gt;much easier&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Now that AppFuse uses JSF 2, I hope to start leveraging some of its &lt;a href=&quot;http://www.ibm.com/developerworks/java/library/j-jsf2fu1/index.html&quot;&gt;new features&lt;/a&gt;. If you&apos;re yearning to get started with them today, I invite you to &lt;a href=&quot;http://appfuse.org/display/APF/Source+Repository&quot;&gt;grab the source&lt;/a&gt; and start integrating them yourself.</content>
    </entry>
</feed>

