<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/rss.xsl" media="screen"?><rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
  <title>Raible Designs</title>
  <link>https://raibledesigns.com/rd/</link>
      <atom:link rel="self" type="application/rss+xml" href="https://raibledesigns.com/rd/feed/entries/rss?cat=%2FJava" />
    <description>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.</description>
  <language>en-us</language>
  <copyright>Copyright 2026</copyright>
  <lastBuildDate>Mon, 30 Mar 2026 03:31:45 -0600</lastBuildDate>
  <generator>Apache Roller (incubating) 5.0.3 (1388864191739:dave)</generator>
        <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/my_marvelous_road_trip_to</guid>
    <title>My Marvelous Road Trip to the Utah JUG</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/my_marvelous_road_trip_to</link>
        <pubDate>Wed, 22 May 2024 09:35:09 -0600</pubDate>
    <category>Java</category>
    <category>skiing</category>
    <category>jhipster</category>
    <category>java</category>
    <category>utahjug</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_delightful_trip_to_devnexus</guid>
    <title>A Delightful Trip to Devnexus</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_delightful_trip_to_devnexus</link>
        <pubDate>Sat, 11 May 2024 10:27:21 -0600</pubDate>
    <category>Java</category>
    <category>community</category>
    <category>java</category>
    <category>jhipster</category>
    <category>devnexus</category>
    <atom: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;</atom:summary>        <description>&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!</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_jhipster_mini_book_v7</guid>
    <title>The JHipster Mini-Book v7.0 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_jhipster_mini_book_v7</link>
        <pubDate>Tue, 7 Mar 2023 15:43:37 -0700</pubDate>
    <category>Java</category>
    <category>infoq</category>
    <category>writing</category>
    <category>jhipster-mini-book</category>
    <category>jhipster</category>
    <category>book</category>
            <description>&lt;p&gt;The JHipster Mini-Book v7.0 is &lt;a href=&quot;https://www.infoq.com/minibooks/jhipster-mini-book-7&quot;&gt;now available as a free download from InfoQ&lt;/a&gt;. Get it while it&apos;s hot! &amp;#128293; You can read more about this release on the &lt;a href=&quot;https://www.jhipster-book.com/#!/news/entry/jhipster-mini-book-v7&quot;&gt;JHipster Mini-Book blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://live.staticflickr.com/65535/52733117829_c47b74d73f_b.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/52733117829/&quot; title=&quot;JHipster Mini-Book v7.0 Cover&quot; rel=&quot;lightbox[jmb7]&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/52733117829_c47b74d73f.jpg&quot; width=&quot;500&quot; alt=&quot;JHipster Mini-Book v5.0 Cover&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The source code for the application developed in the book (21-Points Health) is &lt;a href=&quot;https://github.com/mraible/21-points&quot;&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to the &lt;a href=&quot;http://www.infoq.com&quot;&gt;InfoQ&lt;/a&gt; publishing team, &lt;a href=&quot;https://twitter.com/jeetgajjarr&quot;&gt;Jeet Gajjar&lt;/a&gt; for tech editing, Maureen Spencer for copy editing, and Ana Ciobotaru for publishing it to production.&lt;/p&gt;
&lt;p&gt;And most of all, thank you &lt;a href=&quot;http://asciidoctor.org/&quot;&gt;Asciidoctor&lt;/a&gt; for making the publishing process so easy!&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/questions_about_jhipster_jhipster_lite</guid>
    <title>Questions about JHipster, JHipster Lite, and Spring Boot 3</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/questions_about_jhipster_jhipster_lite</link>
        <pubDate>Wed, 14 Dec 2022 08:07:27 -0700</pubDate>
    <category>Java</category>
    <category>jhipsterlite</category>
    <category>opensource</category>
    <category>jhipster</category>
    <category>springboot3</category>
    <atom:summary type="html">I&apos;m a big fan of &lt;a href=&quot;https://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt;. I&apos;m biased because I worked there from 2007-8, have alumni privileges like a free pro account, and learned how to unsubscribe from all their emails over a decade ago. 
&lt;/p&gt;
&lt;p&gt;
I communicate with a lot of developers via LinkedIn. I recently received a message from &lt;a href=&quot;https://www.linkedin.com/in/raymond-meester-475b79147/&quot;&gt;Raymond Meester&lt;/a&gt; about the &lt;a href=&quot;https://www.jhipster.tech&quot;&gt;JHipster&lt;/a&gt; project. Raymond asked many poignant questions, and I thought it&apos;d be helpful to share my responses with y&apos;all. Of course, I got permission from Raymond before posting this. You can find &lt;a href=&quot;https://raymondmeester.medium.com/&quot;&gt;his blog on Medium&lt;/a&gt;.
&lt;/p&gt;</atom:summary>        <description>I&apos;m a big fan of &lt;a href=&quot;https://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt;. I&apos;m biased because I worked there from 2007-8, have alumni privileges like a free pro account, and learned how to unsubscribe from all their emails over a decade ago. 
&lt;/p&gt;
&lt;p&gt;
I communicate with a lot of developers via LinkedIn. I recently received a message from &lt;a href=&quot;https://www.linkedin.com/in/raymond-meester-475b79147/&quot;&gt;Raymond Meester&lt;/a&gt; about the &lt;a href=&quot;https://www.jhipster.tech&quot;&gt;JHipster&lt;/a&gt; project. Raymond asked many poignant questions, and I thought it&apos;d be helpful to share my responses with y&apos;all. Of course, I got permission from Raymond before posting this. You can find &lt;a href=&quot;https://raymondmeester.medium.com/&quot;&gt;his blog on Medium&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Hi Matt,
&lt;br/&gt;&lt;br/&gt;
I was reading through some threads on the dev mailing list:
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;https://groups.google.com/g/jhipster-dev&quot;&gt;https://groups.google.com/g/jhipster-dev&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
I&apos;m not part of the dev team, but I thought I just share some of my thoughts with you. &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;
&lt;br/&gt;&lt;br/&gt;
On the mailing list, there is an interesting discussion about JHipster vs JHipster Lite. Personally, I don&apos;t fully understand the debate. In my opinion, there could be one base that could be used for several kinds of generators. Say:
&lt;br/&gt;&lt;br/&gt;
- Catered (default)&lt;br/&gt;
- A la carte (lite)
&lt;br/&gt;&lt;br/&gt;
As far as I can see (at least that&apos;s the case for myself), I have more use cases for the first than the second. Just a generator with a few questions on what type of application and then the frameworks to choose (like Spring/Quarkus/Micronaut for the backend and Angular/React/Vue for the frontend) is enough in most cases.
&lt;br/&gt;&lt;br/&gt;
Now that I am more experienced, I definitely want to use lite as well. It&apos;s an exciting project with some smart choices, but I don&apos;t think that it will become the majority of the users.
&lt;br/&gt;&lt;br/&gt;
I do think JHL can be a new base for the normal JHipster as well. Only the generator (whether it&apos;s the CLI or GUI) on top of it will be different.
&lt;br/&gt;&lt;br/&gt;
JHL could also provide a simple generator where I have the top three choices for a specific technology. Of course, when the architecture of JHipster Lite is set up well, it will be easy to add other choices (by blueprints) or change the default top 3 when popularity of a frameworks changes.
&lt;br/&gt;&lt;br/&gt;
Currently, as far as I can see, there are two separate teams improving both JHipster and JHipster Lite. Good to try out different directions, but in the end, a waste of resources.
&lt;br/&gt;&lt;br/&gt;
What I currently miss in JHipster (the main project) is regular updates. As an end user, I just want the latest versions when generating a new application, but lately there are huge gaps of three months between releases.
&lt;br/&gt;&lt;br/&gt;
I really would like to see a monthly minor version with just dependencies updates (I understand that there is more to be done for major versions like the transition to Spring Boot 3. But even when nothing big changes it is good to have the latest libraries).
&lt;br/&gt;&lt;br/&gt;
I agree with how Julien originally set up JHipster as simple as possible for end-users. But currently, Deepu seems one of the few that still stresses this point.
&lt;br/&gt;&lt;br/&gt;
JHipster as it evolved is not only practicable to try out different frameworks, but also as a base for further development. Contrary to what seems to be the current belief about JHipster, it&apos;s not the speed, ease of use or the choices of generation that is the most important feature, but more that for the generated application the architecture is sound, a lot of best practices are used and the code is clean. This saves so much time for me as developer later on.
&lt;br/&gt;&lt;br/&gt;
I also have a question about JHipster Native now that Spring Boot 3 has arrived. Spring removed the Spring Native library, which is not part of the framework itself. What does this mean for JHipster Native?
&lt;br/&gt;&lt;br/&gt;
Keep up the good work!
&lt;/p&gt;
&lt;p&gt;This was a heavy message to receive early on a Tuesday morning. It was heavy because Raymond&apos;s questions were exact, and I thought they deserved a similar response.&lt;/p&gt;
&lt;p class=&quot;smokey&quot; style=&quot;background-color: #ffd&quot;&gt;
&lt;strong&gt;&gt; Currently, as far as I can see, two separate teams are improving both JHipster and JHipster Lite. Good to try out different directions, but in the end, a waste of resources.&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
Possibly, but as far as I can tell, the same people aren&apos;t working on the same project. I believe that JHipster Lite was created because Pascal and others understand Java better than JavaScript, and they were lost in the JHipster codebase and wanted a Java version. JHL also emphasizes DDD and is not interested in CRUD, AFAICT.
&lt;br/&gt;&lt;br/&gt;
In reality, I think many of the contributors have had difficulty figuring out how things work. However, we&apos;ve always had JavaScript heroes to bail us out. In the beginning, Julien knew everything, so he could fix things quickly. Then, it was Deepu - who has admitted to me he rewrote the JHipster core a few times when he was super active. Now it&apos;s Marcelo, and I think he&apos;s doing a great job.
&lt;br/&gt;&lt;br/&gt;
I don&apos;t really look at the JHipster Lite project. I haven&apos;t even watched &lt;a href=&quot;https://www.youtube.com/watch?v=RnLGnY-vzLI&quot;&gt;Julien&apos;s video from Devoxx&lt;/a&gt;, though I&apos;ve been meaning to.
&lt;br/&gt;&lt;br/&gt;
Marcelo, myself, and many others have done a lot with JHipster in 2022. I&apos;ve focused on getting popular blueprints in good shape rather than the core. We&apos;ve released the Spring Native blueprint this year and updates for Ionic and React Native. There&apos;s also been quite a bit of work done on the Quarkus and Micronaut blueprints, and I believe those are just a few hours away from new releases.
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;&gt; What I currently miss in JHipster (the main project) is regular updates. As an end user, I just want the latest versions when generating a new application, but lately, there are huge gaps of three months between releases.
&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
Three months between releases seems pretty good to me! If you&apos;re just looking for dependency updates, you should be able to do some of those in your project w/o relying on a new version of JHipster. 
&lt;br/&gt;&lt;br/&gt;
I started updating the JHipster Mini-Book in March of this year, and the current 7.9.3 version is the first version that&apos;s bug-free enough for me to complete the updates.
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;&gt; What does this mean for JHipster Native?&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
It means it&apos;s only necessary for JHipster apps with Spring Boot 2.x. JHipster 8 apps will have native support by default since it&apos;s built-in to Spring Boot 3. Related to Spring Boot 3: we started upgrading in late September, and I believe we&apos;ve made great progress. In the past, it&apos;s taken us six months to a year to upgrade between major Spring versions. I &lt;a href=&quot;https://twitter.com/mraible/status/1597248481596706816&quot;&gt;tweeted our current status&lt;/a&gt; recently.
&lt;/p&gt;
&lt;p&gt;Raymond and I had a bit of back and forth regarding upgrades.&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
I also think you missed my point on upgrading JHipster on a regular basis (say, a monthly interval).
&lt;br/&gt;&lt;br/&gt;
My idea behind this is as follows:
&lt;br/&gt;&lt;br/&gt;
1. Creating/Generating a new project happens only once, while upgrading happens dozens of times over the lifecycle of the software.&lt;br/&gt;
2. Applications (and also JHipster-generated apps) have a lot of dependencies. I rather don&apos;t want to manage those dependencies by hand (even with stuff like Dependabot).&lt;br/&gt;
3. It&apos;s important to be on the latest version for security, fixes, and to make dependencies work with modern frameworks (say JDK17).&lt;br/&gt;
4. Dependencies must work together well, and this must be tested.
&lt;br/&gt;&lt;br/&gt;
I work mostly alone on my open source projects. It&apos;s my goal to work as much as I can on the &apos;business code/specific use cases and not be bothered too much about technologies and dependencies.
&lt;br/&gt;&lt;br/&gt;
That&apos;s why I think it&apos;s so critical to start a project with the latest available dependencies when starting a new project, but also for using the latest versions when upgrading.
&lt;br/&gt;&lt;br/&gt;
I let JHipster upgrade hundreds of dependencies for me. By this I am ensured that they work together and are safe to use, while I only need to focus on upgrading JHipster, instead of single dependencies.
&lt;br/&gt;&lt;br/&gt;
Upgrading JHipster is btw not always that easy. Though I developed some scripts for it now. That&apos;s also why I discussed this topic at the beginning of the year on the discussion board of JHipster Lite:
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;https://github.com/jhipster/jhipster-lite/discussions/512&quot;&gt;https://github.com/jhipster/jhipster-lite/discussions/512&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
For now, both JH and JHL focus on generating new projects and not so much on upgrading projects made with older versions. That&apos;s fair, but I believe there is still a gap in the market here, just as significant as JHipster once filled for generating projects.
&lt;br/&gt;&lt;br/&gt;
For me, the monthly releases could be just patch releases with only upgrades of minor dependencies (so nothing fancy like a major upgrade to Spring Framework 6/Spring Boot 3). Those major or even minor upgrades (with some added functionality and fixes) could be every three months (minor) or yearly (major).
&lt;br/&gt;&lt;br/&gt;
I know JHipster is a community project, but I think that, for example the predictability of a release every six months with LTS releases is very nice.
&lt;/p&gt;
&lt;p&gt;I agreed that making upgrades seamless is not our strong suit. I&apos;ve struggled many times when trying to upgrade &lt;a href=&quot;https://www.21-points.com&quot;&gt;21-Points Health&lt;/a&gt; with &lt;code&gt;npx jhipster upgrade&lt;/code&gt;. Sometimes, it works. Often, it does not. I think this is difficult to test because it can only be done after releases have happened. I wish I had a better answer. I suggested Raymond use some of his learnings to improve our upgrade sub-generator.&lt;/p&gt;
&lt;p&gt;My responses are my opinions. I wanted to see what the &lt;a href=&quot;https://www.jhipster.tech/team/&quot;&gt;JHipster project leads&lt;/a&gt; thought of my perspective, so I sent them a draft of this blog post. Pascal Grimaud responded with several excellent points.&lt;/p&gt;
&lt;p class=&quot;smokey&quot; style=&quot;background-color: #cfc&quot;&gt;
&lt;strong&gt;&gt; Possibly, but as far as I can tell, the same people aren&apos;t working on the same project. I believe that JHipster Lite
was created because Pascal and others understand Java better than JavaScript, and they were lost in the JHipster codebase and
wanted a Java version. JHL also emphasizes DDD and is not interested in CRUD, AFAICT.&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
Sorry Matt, but it&apos;s wrong.
I didn&apos;t start JHLite because of technologies, Java or Javascript. It&apos;s the same; I don&apos;t care.
I started JHLite to solve &lt;a href=&quot;https://docs.google.com/presentation/d/1i0LOJ0GSWNG2-x0zY220IbQc0PVQ2pndQWEuQKGu8n0&quot;&gt;these problems I mentioned more than one year ago&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
Problem #1: too many generated files.&lt;br/&gt;
Problem #2: hard to customize. Only a few users (less than 10) in the world maintain a blueprint. I know dozens of companies using JHipster (generator-jhipster). And none of them uses a blueprint.&lt;br/&gt;
Problem #3: too many options, too hard to maintain, so no new contributors for months. For an open source project, it&apos;s really sad.&lt;br/&gt;
Problem #4: complex templates.&lt;br/&gt;
&lt;br/&gt;
A real story between a dev and me:&lt;br/&gt;
- dev: I found a bug in the SecurityConfiguration class. There is a missing line of code --&gt; &quot;xxxxx&quot;.&lt;br/&gt;
- me: Nice! We should apply it to our projects. Can you contribute back to generator-jhipster, too, please?&lt;br/&gt;
- dev: Good idea, it will be my first contribution to an open-source project! Let me try.&lt;br/&gt;
(hours later ...)&lt;br/&gt;
- dev: I don&apos;t understand. What&apos;s this f*cking &lt;a href=&quot;https://github.com/jhipster/generator-jhipster/blob/main/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs&quot;&gt;SecurityConfiguration.java.ejs&lt;/a&gt; file?&lt;br/&gt;
- me: It&apos;s the template for managing security configuration for all existing options.&lt;br/&gt;
- dev: Should I apply it for JWT, too? for Session? Should I apply it for reactive too? Should I apply it for microservice?&lt;br/&gt;
- me: Yes, and you should test each config, please.&lt;br/&gt;
- dev: I don&apos;t care about these options, and as it&apos;s too complex, I gave up. As you&apos;re in the core team, you can do it yourself.&lt;br/&gt;
- me: OK, let&apos;s apply it only to our projects.&lt;br/&gt;
&lt;br/&gt;
Problem #5: Too many projects, resulting in complex releases.&lt;br/&gt;
Problem #6: Yeoman, maintained only by Marcelo.&lt;br/&gt;
&lt;br/&gt;
I started JHLite because:&lt;br/&gt;
- I don&apos;t use generator-jhipster anymore for my real projects, for real customers, because it doesn&apos;t fit.&lt;br/&gt;
- JHLite allows me to design my applications around BUSINESS instead of infrastructure.&lt;br/&gt;
- Modular approach, so it fits my needs.&lt;br/&gt;
- The quality of code, as each module is small, it&apos;s easy to have the best quality possible.&lt;br/&gt;
&lt;br/&gt;
&lt;strong&gt;&gt; In reality, I think many of the contributors have had difficulty figuring out how things work. However, we&apos;ve always had
JavaScript heroes to bail us out. In the beginning, Julien knew everything, so he could fix things quickly. Then, it was Deepu -
who has admitted to me he rewrote the JHipster core a few times when he was super active. Now it&apos;s Marcelo, and I think he&apos;s
doing a great job.&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
It&apos;s a big single point of failure!
A big open source project like JHipster needs a community + contributors, not a hero.
&lt;/p&gt;
&lt;p&gt;Related to JHipster, I recently &lt;a href=&quot;https://twitter.com/mraible/status/1599156653785780224&quot;&gt;asked&lt;/a&gt; &lt;a href=&quot;https://chat.openai.com/chat&quot;&gt;ChatGPT&lt;/a&gt; to write a poem about it.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://www.flickr.com/photos/mraible/52558039836/in/dateposted-public/&quot; title=&quot;JHipster Poem&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/52558039836_7395e9ff4e_z.jpg&quot; width=&quot;400&quot; alt=&quot;JHipster Poem&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I also asked it to compare JHipster versus JHipster Lite.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://www.flickr.com/photos/mraible/52558334644/in/dateposted-public/&quot; title=&quot;JHipster vs JHipster Lite&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/52558334644_a63a53cf25_z.jpg&quot; width=&quot;640&quot; alt=&quot;JHipster vs JHipster Lite&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Wow, I&apos;m impressed with both answers! &amp;#x1F929;&lt;/p&gt;
&lt;p&gt;If you have additional questions about JHipster, hit me up on &lt;a href=&quot;https://www.linkedin.com/in/mraible/&quot;&gt;LinkedIn&lt;/a&gt; or ask your question on Stack Overflow with a &lt;a href=&quot;https://stackoverflow.com/questions/tagged/jhipster&quot;&gt;jhipster&lt;/a&gt; tag.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/secure_by_design_book_review</guid>
    <title>Secure by Design Book Review</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/secure_by_design_book_review</link>
        <pubDate>Mon, 25 May 2020 20:11:22 -0600</pubDate>
    <category>Java</category>
    <category>architecture</category>
    <category>securebydesign</category>
    <category>bookreview</category>
    <category>security</category>
    <category>java</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at</guid>
    <title>A Fantastically Fun February at Jfokus 2020 and the Rocky Mountain JUGs</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at</link>
        <pubDate>Sun, 15 Mar 2020 14:24:25 -0600</pubDate>
    <category>Java</category>
    <category>utahjug</category>
    <category>jhipster</category>
    <category>jfokus2020</category>
    <category>denverjug</category>
    <category>bouderjug</category>
    <category>skiing</category>
    <category>java</category>
    <category>jfokus</category>
    <atom: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;</atom:summary>        <description>&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;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/my_journey_to_jhipster_conf</guid>
    <title>My Journey to JHipster Conf 2019</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/my_journey_to_jhipster_conf</link>
        <pubDate>Wed, 3 Jul 2019 12:00:09 -0600</pubDate>
    <category>Java</category>
    <category>okta</category>
    <category>jhipster</category>
    <category>paris</category>
    <category>oauth</category>
    <category>ippon</category>
    <category>community</category>
    <category>oss</category>
    <atom:summary type="html">&lt;p&gt;Last week was quite the whirlwind for me. On Monday, I released &lt;a href=&quot;https://developer.okta.com/blog/2019/06/24/ionic-4-angular-spring-boot-jhipster&quot;&gt;Ionic for JHipster 4.0&lt;/a&gt;, updated my &lt;a href=&quot;https://github.com/mraible/jhipster6-demo&quot;&gt;get started with JHipster 6 tutorial&lt;/a&gt;, and recorded a matching screencast. Within an hour of recording, I was on my way to the airport to fly to &lt;a href=&quot;https://jhipster-conf.github.io/&quot;&gt;JHipster Conf&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48160669171_cf6e812925_c.jpg&quot; title=&quot;Leaving Denver&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160669171/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160669171_cf6e812925.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Leaving Denver&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  I edited the screencast on my flight and published it &lt;a href=&quot;https://youtu.be/uQqlO3IGpTU&quot;&gt;to YouTube&lt;/a&gt; on my layover in Reykjav&#237;k. I was impressed that it uploaded just fine over airport Wi-Fi.
&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/uQqlO3IGpTU&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;Last week was quite the whirlwind for me. On Monday, I released &lt;a href=&quot;https://developer.okta.com/blog/2019/06/24/ionic-4-angular-spring-boot-jhipster&quot;&gt;Ionic for JHipster 4.0&lt;/a&gt;, created a &lt;a href=&quot;https://github.com/mraible/jhipster6-demo&quot;&gt;get started with JHipster 6 tutorial&lt;/a&gt;, and recorded a matching screencast. Within an hour of recording, I was on my way to the airport to fly to &lt;a href=&quot;https://jhipster-conf.github.io/&quot;&gt;JHipster Conf&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48160669171_cf6e812925_c.jpg&quot; title=&quot;Leaving Denver&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160669171/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160669171_cf6e812925.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Leaving Denver&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  I edited the screencast on my flight and &lt;a href=&quot;https://youtu.be/uQqlO3IGpTU&quot;&gt;published it to YouTube&lt;/a&gt; on my layover in Reykjav&#237;k. I was impressed that it uploaded just fine over airport Wi-Fi.
&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/uQqlO3IGpTU&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
  I took a long stroll that evening to &lt;a href=&quot;https://www.heberestaurant.com/&quot;&gt;H&#233;b&#233; Restaurant&lt;/a&gt; and had a delicious late night meal.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a data-flickr-embed=&quot;true&quot; data-header=&quot;true&quot; data-footer=&quot;true&quot; href=&quot;https://live.staticflickr.com/65535/48160673971_e235d6c2f8_c.jpg&quot; title=&quot;Dinner at H&#233;b&#233; Restaurant&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160673971/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160673971_e235d6c2f8_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Dinner at H&#233;b&#233; Restaurant&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/48160745737_393fc3e705_c.jpg&quot; title=&quot;Dessert at H&#233;b&#233; Restaurant&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160745737/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160745737_393fc3e705_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Dessert at H&#233;b&#233; Restaurant&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  On Wednesday, I worked in the morning, then found a good lunch spot at &lt;a href=&quot;http://www.panamebrewingcompany.com/&quot;&gt;Paname Brewing Company&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;To celebrate the summer heat ?? in Paris, I searched for &#8220;breweries near me&#8221;, then walked to the one that looked the best. Worth it! ?? &lt;a href=&quot;https://t.co/RgU5fbVuME&quot;&gt;pic.twitter.com/RgU5fbVuME&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1143861976004812801?ref_src=twsrc%5Etfw&quot;&gt;June 26, 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;That evening, I journeyed to &lt;a href=&quot;https://www.julien-dubois.com/&quot;&gt;Julien Dubois&lt;/a&gt;&apos;s home and met his wonderful family. From there, we headed to the JHipster Conf speaker&apos;s dinner and experienced a marvelous evening. Thanks to &lt;a href=&quot;https://twitter.com/codefinger&quot;&gt;Joe Kutner&lt;/a&gt; and &lt;a href=&quot;https://www.heroku.com/home&quot;&gt;Heroku&lt;/a&gt; for sponsoring!
&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 many faces of &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&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/jhipsterconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jhipsterconf&lt;/a&gt; &lt;a href=&quot;https://t.co/hTPvOcjqOV&quot;&gt;pic.twitter.com/hTPvOcjqOV&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1144115034533978113?ref_src=twsrc%5Etfw&quot;&gt;June 27, 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;
  Thursday was the big day of the conference. I woke up early, walked to La D&#233;fense in Paris, got lost a bit, and ended up arriving on time. 
&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/48160770782_1ee03dbcbd_c.jpg&quot; title=&quot;Arc de Triomphe&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160770782/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160770782_1ee03dbcbd_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Arc de Triomphe&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/48160771767_7b8b413fbb_c.jpg&quot; title=&quot;River on my walk to JHipster Conf&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160771767/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160771767_7b8b413fbb_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;River on my walk to JHipster Conf&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://live.staticflickr.com/65535/48160772992_3fd6af1fc7_c.jpg&quot; title=&quot;Entering the land of bad GPS&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160772992/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160772992_3fd6af1fc7_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Entering the land of bad GPS&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I was pumped to meet some local &lt;a href=&quot;https://www.okta.com&quot;&gt;Okta&lt;/a&gt; folks and have them sponsor the event. I enjoyed quite a few talks throughout the day and &lt;a href=&quot;https://twitter.com/mraible/status/1144643581858242560&quot;&gt;learned how to add a CLI to your JHipster module&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/48160703756_cdfbd0e354_c.jpg&quot; title=&quot;Cindy Marion and Ernesto Butto at JHipster Conf&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160703756/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160703756_cdfbd0e354_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Cindy Marion and Ernesto Butto at JHipster Conf&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/48160668586_764031c6c1_c.jpg&quot; title=&quot;Jon Ruddell at JHipster Conf&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160668586/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160668586_764031c6c1_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Jon Ruddell at JHipster Conf&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I spoke about OAuth and OIDC just after lunch and &lt;a href=&quot;https://speakerdeck.com/mraible/what-the-heck-are-oauth-and-oidc-jhipster-conf-2019&quot;&gt;published my slides to Speaker Deck&lt;/a&gt;. You can view my presentation below.&lt;/p&gt;
&lt;div style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;88f1d4fc7d6949a1b33ff45bf3f8a806&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;After the conference ended at 7pm, a bunch of folks attended a party at &lt;a href=&quot;https://ippon.tech/&quot;&gt;Ippon&lt;/a&gt;. They have an excellent location with a gorgeous views from their rooftop patio.&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/48160667211_cc5c4b1263_c.jpg&quot; title=&quot;JHipster Conf After Party at Ippon&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160667211/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160667211_cc5c4b1263_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;JHipster Conf After Party at Ippon&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/48160737307_315bc11699_c.jpg&quot; title=&quot;JHipster Conf After Party at Ippon&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160737307/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160737307_315bc11699_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;JHipster Conf After Party at Ippon&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://live.staticflickr.com/65535/48160736502_0e1d9e6e68_c.jpg&quot; title=&quot;JHipster Conf After Party at Ippon&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160736502/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160736502_0e1d9e6e68_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;JHipster Conf After Party at Ippon&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/48160735942_0640b4c6d8_c.jpg&quot; title=&quot;JHipster Conf After Party at Ippon&quot; rel=&quot;lightbox[jhipsterconf2019]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/48160735942/in/album-72157709338100441/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/48160735942_0640b4c6d8_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;JHipster Conf After Party at Ippon&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
  I agree with Cindy and Deepu&apos;s tweets about the conference. It was a fantastic experience!
&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;I&amp;#39;m so grateful for this &lt;a href=&quot;https://twitter.com/jhipsterconf?ref_src=twsrc%5Etfw&quot;&gt;@jhipsterconf&lt;/a&gt; experience! You are a very special family! Thank you so much for bringing us together! ?? &lt;a href=&quot;https://t.co/yTkPQNlLJA&quot;&gt;pic.twitter.com/yTkPQNlLJA&lt;/a&gt;&lt;/p&gt;&amp;mdash; Cindy Marin (@laslorma) &lt;a href=&quot;https://twitter.com/laslorma/status/1144554471361601537?ref_src=twsrc%5Etfw&quot;&gt;June 28, 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;Wow &lt;a href=&quot;https://twitter.com/hashtag/jhipsterconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jhipsterconf&lt;/a&gt; was such fun and such success. I hope everyone who attended enjoyed it. We had twice number of attendees from last year. I&amp;#39;m so glad I got to meet lot of core team IRL again. &lt;br&gt;So proud of the &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; community. One of the few real &lt;a href=&quot;https://twitter.com/hashtag/OSS?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#OSS&lt;/a&gt; community.&lt;br&gt;thread ?? &lt;a href=&quot;https://t.co/i5UoepeINo&quot;&gt;pic.twitter.com/i5UoepeINo&lt;/a&gt;&lt;/p&gt;&amp;mdash; ?????????? ?? ???????????????????? (@deepu105) &lt;a href=&quot;https://twitter.com/deepu105/status/1144533511652741120?ref_src=twsrc%5Etfw&quot;&gt;June 28, 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 style=&quot;font-size: .9em; font-style: italic; text-align: right&quot;&gt;For more pictures, see my &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157709338100441&quot;&gt;journey to JHipster Conf 2019 on Flickr&lt;/a&gt;.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_beautiful_adventure_to_jbcnconf</guid>
    <title>A Beautiful Adventure to JBCNConf, Barcelona, and Boston</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_beautiful_adventure_to_jbcnconf</link>
        <pubDate>Sat, 29 Jun 2019 09:33:15 -0600</pubDate>
    <category>Java</category>
    <category>travel</category>
    <category>barcelona</category>
    <category>abbie</category>
    <category>boston</category>
    <category>java</category>
    <category>trish</category>
    <category>jbcnconf</category>
    <category>jack</category>
    <category>family</category>
    <category>vacation</category>
    <atom: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;</atom:summary>        <description>&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;

</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/gids_2019_adventures_in_india</guid>
    <title>GIDS 2019: Adventures in India</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/gids_2019_adventures_in_india</link>
        <pubDate>Thu, 2 May 2019 09:54:15 -0600</pubDate>
    <category>Java</category>
    <category>india</category>
    <category>kalin</category>
    <category>bangalore</category>
    <category>gids19</category>
    <category>travel</category>
    <category>bengaluru</category>
    <category>family</category>
    <category>java</category>
    <atom: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;</atom:summary>        <description>&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;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_jhipster_mini_book_v5</guid>
    <title>The JHipster Mini-Book v5.0 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_jhipster_mini_book_v5</link>
        <pubDate>Wed, 14 Nov 2018 09:48:11 -0700</pubDate>
    <category>Java</category>
    <category>jhipster</category>
    <category>book</category>
    <category>infoq</category>
    <category>jhipster-mini-book</category>
    <category>writing</category>
            <description>&lt;p&gt;The JHipster Mini-Book v5.0 is &lt;a href=&quot;https://www.infoq.com/minibooks/jhipster-mini-book-5&quot;&gt;now available as a free download from InfoQ&lt;/a&gt;. Get it while it&apos;s &amp;#128293;! You can also &lt;a href=&quot;http://www.lulu.com/shop/matt-raible/the-jhipster-mini-book/paperback/product-23871310.html&quot;&gt;buy a print copy from Lulu&lt;/a&gt;. You can read more about this release on the &lt;a href=&quot;http://www.jhipster-book.com/#!/news/entry/jhipster-mini-book-v5-now-available&quot;&gt;JHipster Mini-Book blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://farm5.staticflickr.com/4904/32008028858_0be121f1b5_b.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32008028858/&quot; title=&quot;JHipster Mini-Book v5.0 Cover&quot; rel=&quot;lightbox[jmb5]&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4904/32008028858_0be121f1b5.jpg&quot; width=&quot;500&quot; alt=&quot;JHipster Mini-Book v5.0 Cover&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The source code for the application developed in the book (21-Points Health) is &lt;a href=&quot;https://github.com/mraible/21-points&quot;&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to the &lt;a href=&quot;http://www.infoq.com&quot;&gt;InfoQ&lt;/a&gt; publishing team, &lt;a href=&quot;https://twitter.com/sharpedennis&quot;&gt;Dennis Sharpe&lt;/a&gt;/&lt;a href=&quot;https://twitter.com/jeetgajjarr&quot;&gt;Jeet Gajjar&lt;/a&gt; for tech editing, and Lawrence Nyveen for copy editing. And most of all, thank you &lt;a href=&quot;http://asciidoctor.org/&quot;&gt;Asciidoctor&lt;/a&gt; for making the publishing process so easy!&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/jhipsterconf_2018_summer_solstice_in</guid>
    <title>JHipster Conf 2018: Summer Solstice in Paris</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/jhipsterconf_2018_summer_solstice_in</link>
        <pubDate>Thu, 28 Jun 2018 10:13:27 -0600</pubDate>
    <category>Java</category>
    <category>angular</category>
    <category>jhipster</category>
    <category>jhipsterconf2018</category>
    <category>spring</category>
    <category>paris</category>
    <category>ippon</category>
    <category>react</category>
    <category>jhipsterconf</category>
    <category>spring-boot</category>
            <description>&lt;p&gt;
Last week, I journeyed to Paris with my son, Jack. It was his first time in Europe and I brought him along for good reason. I&#8217;d been invited to the first ever JHipster Conf, and I was eager to attend. We were both pretty excited when we left Denver last Monday.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/BkLwcPPHvGt/&quot; data-instgrm-version=&quot;8&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:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:37.5% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/BkLwcPPHvGt/&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;Our adventure to Paris begins! #jhipsterconf&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;2018-06-18T23:01:22+00:00&quot;&gt;Jun 18, 2018 at 4:01pm PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async defer src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;h3 id=&quot;background&quot;&gt;My Background with JHipster&lt;/h3&gt;
&lt;p&gt;
I&#8217;ve been a part of the &lt;a href=&quot;https://www.jhipster.tech&quot;&gt;JHipster&lt;/a&gt; community for a few years now. I joined by accident, really. I was trying to market myself as an independent consultant by spouting my knowledge of Spring Boot and Angular with an InfoQ mini-book. Since JHipster leveraged both to jumpstart app development, it seemed like a perfect fit. I&#8217;ve been a long-time fan of app jumpstarts, having developed my own called AppFuse in days long gone.
&lt;/p&gt;
&lt;p&gt;
Through the process of writing the mini-book, finding issues, and submitting pull requests, I eventually found myself to be a member of the JHipster development team. Through my relationship with JHipster, and it&#8217;s 3.0 release, I found myself intrigued my microservices and how to develop them with Spring Boot, Spring Cloud, all through the generation expertise of JHipster.
&lt;/p&gt;
&lt;p&gt;
I&#8217;ve learned a ton by being part of the project and trying to figure out how all of its options work.
&lt;/p&gt;
&lt;p&gt;
    When I found myself with a &lt;a href=&quot;//raibledesigns.com/rd/entry/life_update_a_summer_to&quot;&gt;full-time job at Stormpath&lt;/a&gt;, I did my best to create a Stormpath module for JHipster. When Okta acquired Stormpath, I added a similar module to my list of things I wanted to write.
&lt;/p&gt;
&lt;p&gt;
When it came time to implement an Okta module, I discovered JHipster&#8217;s OAuth support only worked internally, not with an external OAuth provider, also known as an Identity Provider, or IdP. I mentioned to the JHipster team I thought we could do better and add support for external providers instead. They agreed, and I went to work.
&lt;/p&gt;
&lt;p&gt;
    In hindsight, it was a great decision and not terribly difficult to implement thanks to Spring Security, Keycloak, and Docker. We had a ton of help from the community along the way, and as of last October, &lt;a href=&quot;https://developer.okta.com/blog/2017/10/20/oidc-with-jhipster&quot;&gt;JHipster added support for single sign-on with OIDC&lt;/a&gt; (tested with Keycloak and Okta).
&lt;/p&gt;
&lt;h3 id=&quot;jhipster5&quot;&gt;JHipster 5.0: Spring Boot 2.0, Angular 6, and React&lt;/h3&gt;
&lt;p&gt;It&#8217;s been a fabulous adventure on the JHipster train and it&#8217;s still going strong. We just &lt;a href=&quot;https://www.jhipster.tech/2018/06/20/jhipster-release-5.0.0.html&quot;&gt;released version 5.0&lt;/a&gt; with React and Spring Boot 2.0 support, there&#8217;s client generators for &lt;a href=&quot;https://github.com/oktadeveloper/generator-jhipster-ionic&quot;&gt;Ionic&lt;/a&gt; and &lt;a href=&quot;https://github.com/oktadeveloper/generator-jhipster-ionic&quot;&gt;React Native&lt;/a&gt;, and &lt;a href=&quot;https://jhipster-conf.github.io/&quot;&gt;we just hosted a kick-ass conference about JHipster in Paris&lt;/a&gt;.
&lt;/p&gt;
&lt;h3 id=&quot;jhipsterconf-2018&quot;&gt;JHipster Conf 2018&lt;/h3&gt;
&lt;p&gt;
The conference featured members of the core team, the well-dressed and fit &lt;a href=&quot;https://twitter.com/codefinger&quot;&gt;Joe Kutner&lt;/a&gt; from Heroku, as well as Java celebrities like &lt;a href=&quot;https://twitter.com/saturnism&quot;&gt;Ray Tsang&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt;. You can &lt;a href=&quot;https://blog.ippon.tech/jhipster-conf-2018/&quot;&gt;read about the festivities and presentations from JHipster&apos;s founder&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/juliendubois&quot;&gt;Julien Dubois&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    The conference was a little over 24 hours long, starting with a speaker&#8217;s dinner on Wednesday evening. Before attending, Jack and I spent the day strolling around Versailles. Versailles is a special place in my life since &lt;a href=&quot;https://raibledesigns.com/rd/entry/our_engaging_trip_to_paris&quot;&gt;I proposed to my double rainbow there&lt;/a&gt; after Devoxx Belgium in 2011.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/BkQLlMnnsJo/&quot; data-instgrm-version=&quot;8&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:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:50% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/BkQLlMnnsJo/&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;?? Versailles #working #jhipsterconf&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;2018-06-20T16:15:29+00:00&quot;&gt;Jun 20, 2018 at 9:15am PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;The conference kicked off with &lt;a href=&quot;https://www.slideshare.net/julien.dubois/jhipster-conf-2018-keynote&quot;&gt;a keynote by the JHipster&apos;s co-leads: Julien and Deepu&lt;/a&gt;. 
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&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;Full house at &lt;a href=&quot;https://twitter.com/hashtag/JHipsterConf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JHipsterConf&lt;/a&gt; &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/paris?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#paris&lt;/a&gt; &lt;a href=&quot;https://t.co/nnZ6JmlXrW&quot;&gt;pic.twitter.com/nnZ6JmlXrW&lt;/a&gt;&lt;/p&gt;&amp;mdash; Deepu K Sasidharan (@deepu105) &lt;a href=&quot;https://twitter.com/deepu105/status/1009729525071187969?ref_src=twsrc%5Etfw&quot;&gt;June 21, 2018&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;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/wdZWHmGx3zJHnK&quot; width=&quot;500&quot; height=&quot;319&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 style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/julien.dubois/jhipster-conf-2018-keynote&quot; title=&quot;JHipster Conf 2018 keynote&quot; target=&quot;_blank&quot;&gt;JHipster Conf 2018 keynote&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/julien.dubois&quot; target=&quot;_blank&quot;&gt;Julien Dubois&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
During my talk, I had Jack join me on stage for an intro, and tried to give him a taste of public speaking in front of hundreds.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/BkTWAN2HhU-/&quot; data-instgrm-version=&quot;8&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:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:50% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/BkTWAN2HhU-/&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;After a fabulous day at #JHipsterConf and a fun rooftop party at @ippon_technologies , Jack and I enjoyed a romantic dinner and a bit of F&#234;te de la Musique. ??&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;2018-06-21T21:44:16+00:00&quot;&gt;Jun 21, 2018 at 2:44pm PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;
My talk went well, with some successful and some failed demos. Hopefully people got the point that it&#8217;s cool to store your users outside of JHipster so you can share them between apps. I also tried to show that &lt;a href=&quot;https://developer.okta.com/books/api-security/&quot;&gt;OAuth and OIDC are excellent for securing APIs&lt;/a&gt;. You can &lt;a href=&quot;https://speakerdeck.com/mraible/add-sso-to-your-jhipster-apps-with-oidc-jhipsterconf-2018&quot;&gt;download my presentation from Add JHipster to Your JHipster Apps with OIDC&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 class=&quot;speakerdeck-embed&quot; data-id=&quot;255494c7d9024d99a5ca260cd65085b2&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;I created a tutorial of the app I showed in my talk and published it to the Okta developer blog: &lt;a href=&quot;https://developer.okta.com/blog/2018/06/25/react-spring-boot-photo-gallery-pwa&quot;&gt;Build a Photo Gallery PWA with React, Spring Boot, and JHipster&lt;/a&gt;. If you like React and OAuth, you&apos;re gonna love this guide!
&lt;/p&gt;
&lt;p&gt;
Jack and I had a day in Paris after the conference, so we made the most of it. We hit the Eiffel Tower, hiked the stairs, and marveled at the view. After, we waited in a long line for The Catacombs and walked among the dead.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&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 wonderful time this week in Paris and at &lt;a href=&quot;https://twitter.com/jhipsterconf?ref_src=twsrc%5Etfw&quot;&gt;@jhipsterconf&lt;/a&gt;. Many thanks to the &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; developers, community, &lt;a href=&quot;https://twitter.com/juliendubois?ref_src=twsrc%5Etfw&quot;&gt;@juliendubois&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/deepu105?ref_src=twsrc%5Etfw&quot;&gt;@deepu105&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/ippontech?ref_src=twsrc%5Etfw&quot;&gt;@ippontech&lt;/a&gt; for making it all possible! &lt;a href=&quot;https://twitter.com/hashtag/JHipsterConf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JHipsterConf&lt;/a&gt; &lt;a href=&quot;https://t.co/61ZfRZxg8G&quot;&gt;pic.twitter.com/61ZfRZxg8G&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1010477663943909377?ref_src=twsrc%5Etfw&quot;&gt;June 23, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h3 id=&quot;kudos&quot;&gt;Kudos to the JHipster Community!&lt;/h3&gt;
&lt;p&gt;
What a trip! It&#8217;s so much fun to be a part of JHipster&#8217;s thriving open source community. It&#8217;s not just the project itself; it&#8217;s all the projects we build upon, from Java to TypeScript to Spring Boot to Spring Data to Spring Security to Angular to React to webpack to Bootstrap. It&#8217;s a conglomeration of all of my favorite tools and open source developers encompassed in several awesome projects!
&lt;/p&gt;
&lt;p&gt;
Life as an open source developer is pretty fun. I encourage you to get involved in open source too! I started way back in the early 2000s with Struts and Ant, and it&#8217;s done wonders for my career.
&lt;/p&gt;
&lt;p&gt;
    &lt;em&gt;Viva La Open Source!&lt;/em&gt;
&lt;/p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/springone_the_rich_web_experience</guid>
    <title>SpringOne, The Rich Web Experience, and Being Home for the Holidays</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/springone_the_rich_web_experience</link>
        <pubDate>Fri, 22 Dec 2017 13:44:25 -0700</pubDate>
    <category>Java</category>
    <category>speaking</category>
    <category>home</category>
    <category>okta</category>
    <category>richweb17</category>
    <category>holidays</category>
    <category>springone</category>
    <category>travel</category>
    <atom:summary type="html">&lt;p&gt;A few weeks ago, I had the pleasure of hitting two excellent conferences in one week: &lt;a href=&quot;https://springoneplatform.io/&quot;&gt;SpringOne&lt;/a&gt; and &lt;a href=&quot;https://therichwebexperience.com/conference/clearwater/2017/12/home&quot;&gt;The Rich Web Experience&lt;/a&gt;. The primary reason I like both conferences so much is that there are so many familiar faces. 
&lt;/p&gt;
&lt;p&gt;
I had a gas hanging out with folks from Pivotal after I arrived on Monday night. On Tuesday, I thoroughly enjoyed the &lt;a href=&quot;https://twitter.com/mraible/status/938093395519537152&quot;&gt;opening&lt;/a&gt; &lt;a href=&quot;https://twitter.com/mraible/status/938110624613068801&quot;&gt;keynote&lt;/a&gt;. Seeing the unveiling of Spring Boot 2.0&apos;s most impressive feature was spectacular too!
&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;Started as a dare, ended as a feature in &lt;a href=&quot;https://twitter.com/springboot?ref_src=twsrc%5Etfw&quot;&gt;@springboot&lt;/a&gt; 2.0! Animated Banners ?? &lt;a href=&quot;https://twitter.com/hashtag/SpringOne?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#SpringOne&lt;/a&gt; &lt;a href=&quot;https://t.co/PqSDSWHMze&quot;&gt;pic.twitter.com/PqSDSWHMze&lt;/a&gt;&lt;/p&gt;&amp;mdash; Brian Clozel (@bclozel) &lt;a href=&quot;https://twitter.com/bclozel/status/938116061332770816?ref_src=twsrc%5Etfw&quot;&gt;December 5, 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;I walked to the Okta office for some swag that afternoon, then proceeded to the &lt;a href=&quot;https://atomist.com/&quot;&gt;Atomist&lt;/a&gt; happy hour. I talked with Rod Johnson about how Atomist might be able to help update our &lt;a href=&quot;https://github.com/oktadeveloper&quot;&gt;example apps&lt;/a&gt; and the &lt;a href=&quot;https://developer.okta.com/blog/&quot;&gt;Okta Developer blog&lt;/a&gt;. Since keeping our posts and examples up-to-date is a maintenance burden, I think Atomist could be a huge help.
&lt;/p&gt;
&lt;p&gt;After happy hour, a bunch of us joined Heroku for a delicious dinner and fun conversations.&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;Great night with &lt;a href=&quot;https://twitter.com/heroku?ref_src=twsrc%5Etfw&quot;&gt;@heroku&lt;/a&gt; friends &lt;a href=&quot;https://twitter.com/mraible?ref_src=twsrc%5Etfw&quot;&gt;@mraible&lt;/a&gt; &lt;a href=&quot;https://twitter.com/speakjava?ref_src=twsrc%5Etfw&quot;&gt;@speakjava&lt;/a&gt; &lt;a href=&quot;https://twitter.com/starbuxman?ref_src=twsrc%5Etfw&quot;&gt;@starbuxman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/afitnerd?ref_src=twsrc%5Etfw&quot;&gt;@afitnerd&lt;/a&gt; &lt;a href=&quot;https://twitter.com/Lspacewalker?ref_src=twsrc%5Etfw&quot;&gt;@Lspacewalker&lt;/a&gt; &lt;a href=&quot;https://t.co/JUVz0Ak2sH&quot;&gt;pic.twitter.com/JUVz0Ak2sH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Joe Kutner (@codefinger) &lt;a href=&quot;https://twitter.com/codefinger/status/938298764342767616?ref_src=twsrc%5Etfw&quot;&gt;December 6, 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;On Wednesday, I delivered my talk on &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;. You can &lt;a href=&quot;https://speakerdeck.com/mraible/bootiful-development-with-spring-boot-and-react-springone-2017&quot;&gt;find my slides on Speaker Deck&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;9adf4aa0b6ae47a98dbd52e0fc88e20f&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;
It was recorded and &lt;a href=&quot;https://youtu.be/P6rwKHnXUJI&quot;&gt;published to YouTube&lt;/a&gt; as well.
&lt;/p&gt;
&lt;div style=&quot;max-width: 560px; margin: 0 auto&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/P6rwKHnXUJI&quot; gesture=&quot;media&quot; allow=&quot;encrypted-media&quot; allowfullscreen=&quot;&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;After my talk ended, I only had 70 minutes before my flight took off for Florida and the Rich Web Experience. Luckily, there was hardly any traffic and I found myself boarding with &lt;a href=&quot;https://twitter.com/mraible/status/938520431861968896&quot;&gt;23 minutes to spare&lt;/a&gt;.&lt;/p&gt;
</atom:summary>        <description>&lt;p&gt;A few weeks ago, I had the pleasure of hitting two excellent conferences in one week: &lt;a href=&quot;https://springoneplatform.io/&quot;&gt;SpringOne&lt;/a&gt; and &lt;a href=&quot;https://therichwebexperience.com/conference/clearwater/2017/12/home&quot;&gt;The Rich Web Experience&lt;/a&gt;. The primary reason I like both conferences so much is that there are so many familiar faces. 
&lt;/p&gt;
&lt;p&gt;
I had a gas hanging out with folks from Pivotal after I arrived on Monday night. On Tuesday, I thoroughly enjoyed the &lt;a href=&quot;https://twitter.com/mraible/status/938093395519537152&quot;&gt;opening&lt;/a&gt; &lt;a href=&quot;https://twitter.com/mraible/status/938110624613068801&quot;&gt;keynote&lt;/a&gt;. Seeing the unveiling of Spring Boot 2.0&apos;s most impressive feature was spectacular too!
&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;Started as a dare, ended as a feature in &lt;a href=&quot;https://twitter.com/springboot?ref_src=twsrc%5Etfw&quot;&gt;@springboot&lt;/a&gt; 2.0! Animated Banners ?? &lt;a href=&quot;https://twitter.com/hashtag/SpringOne?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#SpringOne&lt;/a&gt; &lt;a href=&quot;https://t.co/PqSDSWHMze&quot;&gt;pic.twitter.com/PqSDSWHMze&lt;/a&gt;&lt;/p&gt;&amp;mdash; Brian Clozel (@bclozel) &lt;a href=&quot;https://twitter.com/bclozel/status/938116061332770816?ref_src=twsrc%5Etfw&quot;&gt;December 5, 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;I walked to the Okta office for some swag that afternoon, then proceeded to the &lt;a href=&quot;https://atomist.com/&quot;&gt;Atomist&lt;/a&gt; happy hour. I talked with Rod Johnson about how Atomist might be able to help update our &lt;a href=&quot;https://github.com/oktadeveloper&quot;&gt;example apps&lt;/a&gt; and the &lt;a href=&quot;https://developer.okta.com/blog/&quot;&gt;Okta Developer blog&lt;/a&gt;. Since keeping our posts and examples up-to-date is a maintenance burden, I think Atomist could be a huge help.
&lt;/p&gt;
&lt;p&gt;After happy hour, a bunch of us joined Heroku for a delicious dinner and fun conversations.&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;Great night with &lt;a href=&quot;https://twitter.com/heroku?ref_src=twsrc%5Etfw&quot;&gt;@heroku&lt;/a&gt; friends &lt;a href=&quot;https://twitter.com/mraible?ref_src=twsrc%5Etfw&quot;&gt;@mraible&lt;/a&gt; &lt;a href=&quot;https://twitter.com/speakjava?ref_src=twsrc%5Etfw&quot;&gt;@speakjava&lt;/a&gt; &lt;a href=&quot;https://twitter.com/starbuxman?ref_src=twsrc%5Etfw&quot;&gt;@starbuxman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/afitnerd?ref_src=twsrc%5Etfw&quot;&gt;@afitnerd&lt;/a&gt; &lt;a href=&quot;https://twitter.com/Lspacewalker?ref_src=twsrc%5Etfw&quot;&gt;@Lspacewalker&lt;/a&gt; &lt;a href=&quot;https://t.co/JUVz0Ak2sH&quot;&gt;pic.twitter.com/JUVz0Ak2sH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Joe Kutner (@codefinger) &lt;a href=&quot;https://twitter.com/codefinger/status/938298764342767616?ref_src=twsrc%5Etfw&quot;&gt;December 6, 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;On Wednesday, I delivered my talk on &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;. You can &lt;a href=&quot;https://speakerdeck.com/mraible/bootiful-development-with-spring-boot-and-react-springone-2017&quot;&gt;find my slides on Speaker Deck&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;9adf4aa0b6ae47a98dbd52e0fc88e20f&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;
It was recorded and &lt;a href=&quot;https://youtu.be/P6rwKHnXUJI&quot;&gt;published to YouTube&lt;/a&gt; as well.
&lt;/p&gt;
&lt;div style=&quot;max-width: 560px; margin: 0 auto&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/P6rwKHnXUJI&quot; gesture=&quot;media&quot; allow=&quot;encrypted-media&quot; allowfullscreen=&quot;&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;After my talk ended, I only had 70 minutes before my flight took off for Florida and the Rich Web Experience. Luckily, there was hardly any traffic and I found myself boarding with &lt;a href=&quot;https://twitter.com/mraible/status/938520431861968896&quot;&gt;23 minutes to spare&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The Rich Web Experience&lt;/h3&gt;
&lt;p&gt;At the Rich Web Experience, I had two back-to-back talks on Thursday morning. The first was on OAuth and is modeled off my &lt;a href=&quot;https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth&quot;&gt;What the Heck is OAuth&lt;/a&gt; blog post. I was surprised to have a packed room and appreciated the enthusiastic audience. You can find &lt;a href=&quot;https://speakerdeck.com/mraible/what-the-heck-is-oauth-and-openid-connect-rwx-2017&quot;&gt;my slides on Speaker Deck&lt;/a&gt; or view them below.
&lt;/p&gt;
&lt;div style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;cfa8d9c1ef5444aa884e1ad845f6d8c5&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;I had an extra half-hour (compared to SpringOne) to deliver my Bootiful React talk, but I still managed to run out of time. The good news is it was largely because of audience interaction and questions. I feel like presentations are a lot more enjoyable when conversations happen during them. I &lt;a href=&quot;https://speakerdeck.com/mraible/bootiful-development-with-spring-boot-and-react-rwx-2017&quot;&gt;published my slides&lt;/a&gt; afterward. The major difference between this deck and the one at SpringOne is I included &lt;a href=&quot;https://twitter.com/kentcdodds&quot;&gt;Kent Dodds&apos;&lt;/a&gt; &lt;a href=&quot;https://blog.kentcdodds.com/learn-react-fundamentals-and-advanced-patterns-eac90341c9db&quot;&gt;free React courses on egghead.io&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;max-width: 600px; margin: 0 auto&quot;&gt;
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;50802ddcf06549959e4ecb760cf91ae1&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;I took a nice stroll along the Clearwater beaches that afternoon. I felt like a huge weight had been lifted off my shoulders since I was done speaking for the year.&lt;/p&gt;
&lt;p&gt;On Friday, I flew back to Denver and spent the afternoon polishing all the READMEs in our &lt;a href=&quot;https://github.com/oktadeveloper&quot;&gt;developer example apps&lt;/a&gt;. We recently discovered that a lot of folks were trying our examples without reading our blog posts. As a developer, I know it&apos;s nice to clone a project, configure it, and run it. This should be much easier now. For example, if you look at the &lt;a href=&quot;https://github.com/oktadeveloper/okta-spring-boot-2-angular-5-example/blob/master/README.md&quot;&gt;README for the okta-spring-boot-2-angular-5-example&lt;/a&gt;, you should be able to modify and run without reading its associated blog post.
&lt;/p&gt;
&lt;h3&gt;Devoxx4Kids Denver&lt;/h3&gt;
&lt;p&gt;The next day, I helped organize a &lt;a href=&quot;https://www.meetup.com/Devoxx4Kids-Denver/&quot;&gt;Devoxx4Kids Denver&lt;/a&gt; on &lt;a href=&quot;https://www.meetup.com/Devoxx4Kids-Denver/events/245437411/&quot;&gt;building Fruit Ninja with Scratch&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/melissajmckay&quot;&gt;Melissa McKay&lt;/a&gt; was the class instructor and the kids had a blast. The workshop was hosted at &lt;a href=&quot;https://www.thriveworkplace.com/ballpark/&quot;&gt;Thrive Ballpark&lt;/a&gt; and they published a blog post about how &lt;a href=&quot;https://www.thriveworkplace.com/devoxx4kids-teaching-kids-thrive/&quot;&gt;Devoxx4Kids is Teaching Kids to Thrive&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; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/Devoxx4Kids?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Devoxx4Kids&lt;/a&gt; Denver in full swing with &lt;a href=&quot;https://twitter.com/melissajmckay?ref_src=twsrc%5Etfw&quot;&gt;@melissajmckay&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/ThriveWorkplace?ref_src=twsrc%5Etfw&quot;&gt;@ThriveWorkplace&lt;/a&gt;. Fruit Ninja with &lt;a href=&quot;https://twitter.com/scratch?ref_src=twsrc%5Etfw&quot;&gt;@scratch&lt;/a&gt;! &lt;a href=&quot;https://t.co/ZqruHtVk0u&quot;&gt;pic.twitter.com/ZqruHtVk0u&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/939548914763554816?ref_src=twsrc%5Etfw&quot;&gt;December 9, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h3&gt;Team Building and Denver JUG&lt;/h3&gt;
&lt;p&gt;The following week, I traveled to San Francisco to meet with my team and do some team building activities. I thouroughly enjoyed the stroll to work on Tuesday morning, and bowling that afternoon.
&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 feel very fortunate to have such a beautiful walk to the &lt;a href=&quot;https://twitter.com/okta?ref_src=twsrc%5Etfw&quot;&gt;@okta&lt;/a&gt; SF office. &lt;a href=&quot;https://twitter.com/hashtag/lifeatokta?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#lifeatokta&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/embarcadero?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#embarcadero&lt;/a&gt; &lt;a href=&quot;https://t.co/NBaUmHtiFy&quot;&gt;pic.twitter.com/NBaUmHtiFy&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/940644949250359298?ref_src=twsrc%5Etfw&quot;&gt;December 12, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;I flew back Wednesday and made it just in time for the &lt;a href=&quot;https://www.meetup.com/DenverJavaUsersGroup/events/244805856/&quot;&gt;Denver JUG Holiday party&lt;/a&gt;. We had a pretty good turnout, announced some awards, voted on Venkat&apos;s talk in January, and gave out a few prizes. You can read more about the festivities &lt;a href=&quot;http://www.denverjug.org/?p=1155&quot;&gt;on the Denver JUG blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;When I drove home that night, I felt like George Bailey rushing home at the end of It&apos;s a Wonderful Life! The joy of being home without travel on the horizon is a wonderful feeling.
&lt;/p&gt;
&lt;p&gt;At the end of that week, I was able to find time to work on the &lt;a href=&quot;https://github.com/oktadeveloper/generator-jhipster-ionic&quot;&gt;Ionic Module for JHipster&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/mraible/status/942099681907171328&quot;&gt;release it&lt;/a&gt;.
&lt;/p&gt;
&lt;h3&gt;Home for the Holidays&lt;/h3&gt;
&lt;p&gt;It&apos;s a great feeling to be home for the holidays. It was Trish&apos;s birthday weekend last weekend, so we watched her compete in a couple horse shows with Tucker. They sure do look good together, don&apos;t they?&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;Happy Birthday to my lovely wife, &lt;a href=&quot;https://twitter.com/TrishPhoto?ref_src=twsrc%5Etfw&quot;&gt;@TrishPhoto&lt;/a&gt;! She started the day at 5am so she could do one of her favorite things - competing with Tucker. ???? &lt;a href=&quot;https://t.co/XvLd81VRcz&quot;&gt;pic.twitter.com/XvLd81VRcz&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/942495794195677184?ref_src=twsrc%5Etfw&quot;&gt;December 17, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;I&apos;m done traveling for the year and I don&apos;t have any overnight travel scheduled until mid-February. My TripIt stats show I traveled quite a bit this year, and I&apos;m looking forward to speaking at more JUGs and less conferences next year. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://farm5.staticflickr.com/4588/39195736632_44d08a364e_c.jpg&quot; title=&quot;2017 TripIt Stats&quot; rel=&quot;lightbox[springone-rwx-2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/39195736632/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4588/39195736632_44d08a364e.jpg&quot; alt=&quot;2017 TripIt Stats&quot; style=&quot;border: 1px solid black;&quot; width=&quot;359&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I spent 141 days on the road, but I&apos;m grateful for getting to attend so many cool conferences in many exotic locations. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://farm5.staticflickr.com/4634/38516035974_9910bd1df0_c.jpg&quot; title=&quot;2017 Conferences&quot; rel=&quot;lightbox[springone-rwx-2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/38516035974/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4634/38516035974_9910bd1df0.jpg&quot; alt=&quot;2017 Conferences&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you want to tinker with some code over the break, you can checkout my blog post on how to use &lt;a href=&quot;https://developer.okta.com/blog/2017/12/18/spring-security-5-oidc&quot;&gt;Spring Security 5.0 with OIDC&lt;/a&gt; or my buddy Nate&apos;s &lt;a href=&quot;https://developer.okta.com/blog/2017/12/21/spread-serverless-holiday-cheer&quot;&gt;Spread Serverless Holiday Cheer with Lambda and API Gateway&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Happy Holidays everyone!&lt;/em&gt; &amp;#128522;&lt;/p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_stressful_but_rewarding_trip</guid>
    <title>A Stressful, but Rewarding, Trip to Devoxx Belgium and Morocco</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_stressful_but_rewarding_trip</link>
        <pubDate>Mon, 27 Nov 2017 08:37:50 -0700</pubDate>
    <category>Java</category>
    <category>speaking</category>
    <category>ionic</category>
    <category>belgium</category>
    <category>okta</category>
    <category>devoxx</category>
    <category>pwa</category>
    <category>jhipster</category>
    <category>travel</category>
    <category>devoxxma</category>
    <category>cloudnative</category>
    <category>springboot</category>
    <category>devoxxbe</category>
    <category>angular</category>
    <atom:summary type="html">&lt;p&gt;
    One of my favorite conferences in the world is &lt;a href=&quot;https://devoxx.be&quot;&gt;Devoxx Belgium&lt;/a&gt;. First of all, it tends to have one of the most enthusiastic audiences I&apos;ve ever seen. Secondly, its organizers are super awesome and challenge you to give great talks. Third, it was the &lt;a href=&quot;//raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam&quot;&gt;first conference I ever took my Trish to&lt;/a&gt;.
    In 2011, I took her a second time and &lt;a href=&quot;//raibledesigns.com/rd/entry/our_engaging_trip_to_paris&quot;&gt;proposed to
    her in Paris afterward&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    This year, I traveled to Devoxx Belgium for the first time without Trish. It was stressful because I didn&apos;t prepare well beforehand. However, it was also gratifying because I was able to make everything work, even it all happened at the last minute. Furthermore, I did the majority of my talks with good friends, which is always a
    pleasant experience.
&lt;/p&gt;
&lt;p&gt;The purpose of this blog post is to document my experience this year, so I can look back and say WTF was I
    thinking?! &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;
    I left Denver on Monday (November 6) afternoon and flew to Brussels, Belgium. My flight landed in Brussels at 9 am and Josh and my (three hour) talk was at 1:30 pm. I made it in time, but it was one of the first times we didn&#8217;t have a lot of time to prepare face-to-face beforehand. I learned that getting t-shirts printed in the US to save $500 is a good idea, but having to take two suitcases to carry them all is a bad idea.
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4532/37700216965_c12dbbb856_c.jpg&quot; title=&quot;Cloud Native PWAs with Josh Long at Devoxx Belgium&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700216965/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4532/37700216965_c12dbbb856_q.jpg&quot; width=&quot;150&quot; class=&quot;picture&quot; alt=&quot;Cloud Native PWAs with Josh Long at Devoxx Belgium&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    We did our usual talk and I used Okta&apos;s new &lt;a href=&quot;https://www.npmjs.com/package/@okta%2Fokta-angular&quot;&gt;Angular SDK&lt;/a&gt;
    instead of the Sign-In Widget to showcase authentication. Even
    though the crucial step I needed was contained in my notes, I failed. One simple line to add an &lt;code&gt;HttpInterceptor&lt;/code&gt; and
    I missed it!
&lt;/p&gt;
&lt;p&gt;
    I think I followed up well with a tweet that showed how to fix it. But who knows how many people use Twitter. One things for sure, people tweet more at Devoxx Belgium than any other conference I&#8217;ve ever been too! In fact, the
    #Devoxx hashtag got &lt;a href=&quot;https://www.linkedin.com/pulse/twitter-spam-bots-from-russia-stephan-janssen/&quot;&gt;hijacked by some porn sites&lt;/a&gt; and their tweets started showing up on the Twitter wall. &#157;&#157;
&lt;/p&gt;
&lt;p&gt;
    I tweeted about what I forgot to do after our talk.
&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;Thanks to everyone who attended &lt;a href=&quot;https://twitter.com/starbuxman?ref_src=twsrc%5Etfw&quot;&gt;@starbuxman&lt;/a&gt; and my session on Cloud Native PWAs at &lt;a href=&quot;https://twitter.com/Devoxx?ref_src=twsrc%5Etfw&quot;&gt;@Devoxx&lt;/a&gt;! &lt;br&gt;&lt;br&gt;Slides: &lt;a href=&quot;https://t.co/3uyn4KUbm2&quot;&gt;https://t.co/3uyn4KUbm2&lt;/a&gt;&lt;br&gt;&lt;br&gt;Source code: &lt;a href=&quot;https://t.co/6deOtoHeeg&quot;&gt;https://t.co/6deOtoHeeg&lt;/a&gt;&lt;br&gt;&lt;br&gt;FWIW, I figured out why my &lt;a href=&quot;https://twitter.com/okta?ref_src=twsrc%5Etfw&quot;&gt;@okta&lt;/a&gt; demo failed. I forgot to add the AuthInterceptor as a provider. Doh! &lt;a href=&quot;https://twitter.com/hashtag/Devoxx?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Devoxx&lt;/a&gt; &lt;a href=&quot;https://t.co/HxdYp6CetZ&quot;&gt;pic.twitter.com/HxdYp6CetZ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/928194420910051328?ref_src=twsrc%5Etfw&quot;&gt;November 8, 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;
    Josh and my talk was &lt;a href=&quot;https://youtu.be/tCyLDzhz_mg&quot;&gt;published on YouTube&lt;/a&gt; the very next day, which is awesome.
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
    One of my favorite conferences in the world is &lt;a href=&quot;https://devoxx.be&quot;&gt;Devoxx Belgium&lt;/a&gt;. First of all, it tends to have one of the most enthusiastic audiences I&apos;ve ever seen. Secondly, its organizers are super awesome and challenge you to give great talks. Third, it was the &lt;a href=&quot;//raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam&quot;&gt;first conference I ever took my Trish to&lt;/a&gt;.
    In 2011, I took her a second time and &lt;a href=&quot;//raibledesigns.com/rd/entry/our_engaging_trip_to_paris&quot;&gt;proposed to
    her in Paris afterward&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    This year, I traveled to Devoxx Belgium for the first time without Trish. It was stressful because I didn&apos;t prepare well beforehand. However, it was also gratifying because I was able to make everything work, even it all happened at the last minute. Furthermore, I did the majority of my talks with good friends, which is always a
    pleasant experience.
&lt;/p&gt;
&lt;p&gt;The purpose of this blog post is to document my experience this year, so I can look back and say WTF was I
    thinking?! &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;
    I left Denver on Monday (November 6) afternoon and flew to Brussels, Belgium. My flight landed in Brussels at 9 am and Josh and my (three hour) talk was at 1:30 pm. I made it in time, but it was one of the first times we didn&#8217;t have a lot of time to prepare face-to-face beforehand. I learned that getting t-shirts printed in the US to save $500 is a good idea, but having to take two suitcases to carry them all is a bad idea.
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4532/37700216965_c12dbbb856_c.jpg&quot; title=&quot;Cloud Native PWAs with Josh Long at Devoxx Belgium&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700216965/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4532/37700216965_c12dbbb856_q.jpg&quot; width=&quot;150&quot; class=&quot;picture&quot; alt=&quot;Cloud Native PWAs with Josh Long at Devoxx Belgium&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    We did our usual talk and I used Okta&apos;s new &lt;a href=&quot;https://www.npmjs.com/package/@okta%2Fokta-angular&quot;&gt;Angular SDK&lt;/a&gt;
    instead of the Sign-In Widget to showcase authentication. Even
    though the crucial step I needed was contained in my notes, I failed. One simple line to add an &lt;code&gt;HttpInterceptor&lt;/code&gt; and
    I missed it!
&lt;/p&gt;
&lt;p&gt;
    I think I followed up well with a tweet that showed how to fix it. But who knows how many people use Twitter. One things for sure, people tweet more at Devoxx Belgium than any other conference I&#8217;ve ever been too! In fact, the
    #Devoxx hashtag got &lt;a href=&quot;https://www.linkedin.com/pulse/twitter-spam-bots-from-russia-stephan-janssen/&quot;&gt;hijacked by some porn sites&lt;/a&gt; and their tweets started showing up on the Twitter wall. ??
&lt;/p&gt;
&lt;p&gt;
    I tweeted about what I forgot to do after our talk.
&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;Thanks to everyone who attended &lt;a href=&quot;https://twitter.com/starbuxman?ref_src=twsrc%5Etfw&quot;&gt;@starbuxman&lt;/a&gt; and my session on Cloud Native PWAs at &lt;a href=&quot;https://twitter.com/Devoxx?ref_src=twsrc%5Etfw&quot;&gt;@Devoxx&lt;/a&gt;! &lt;br&gt;&lt;br&gt;Slides: &lt;a href=&quot;https://t.co/3uyn4KUbm2&quot;&gt;https://t.co/3uyn4KUbm2&lt;/a&gt;&lt;br&gt;&lt;br&gt;Source code: &lt;a href=&quot;https://t.co/6deOtoHeeg&quot;&gt;https://t.co/6deOtoHeeg&lt;/a&gt;&lt;br&gt;&lt;br&gt;FWIW, I figured out why my &lt;a href=&quot;https://twitter.com/okta?ref_src=twsrc%5Etfw&quot;&gt;@okta&lt;/a&gt; demo failed. I forgot to add the AuthInterceptor as a provider. Doh! &lt;a href=&quot;https://twitter.com/hashtag/Devoxx?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Devoxx&lt;/a&gt; &lt;a href=&quot;https://t.co/HxdYp6CetZ&quot;&gt;pic.twitter.com/HxdYp6CetZ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/928194420910051328?ref_src=twsrc%5Etfw&quot;&gt;November 8, 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;
    Josh and my talk was &lt;a href=&quot;https://youtu.be/tCyLDzhz_mg&quot;&gt;published on YouTube&lt;/a&gt; the very next day, which is awesome.
&lt;/p&gt;
&lt;p&gt;
    Tuesday night was the speaker&#8217;s reception, so I attended that and turned in around 10 pm. I worked on my next presentation (Angular vs. React) for a few hours after getting back to my hotel.
&lt;/p&gt;
&lt;p&gt;
    On Wednesday, I worked all day with my co-speaker (&lt;a href=&quot;https://twitter.com/deepu105&quot;&gt;Deepu&lt;/a&gt;, co-lead of
    JHipster) on our Angular vs. React presentation. We worked for eight hours at the conference venue that day and
    parted ways around 6 pm.
&lt;/p&gt;
&lt;p&gt;
    On Wednesday night, I attended a dinner with Ray Tsang (Google Cloud Advocate). We were invited (along with Josh) to a dinner with JDriven. Josh couldn&#8217;t make it, but Ray and I attended and &lt;a href=&quot;https://twitter.com/mraible/status/928397708049739777&quot;&gt;had a great time&lt;/a&gt;. I got home at 10 pm that night and worked on my next day&#8217;s
    presentation until 3 am.
&lt;/p&gt;
&lt;p&gt;
    Thursday, I worked with Deepu for a couple hours to polish and practice our presentation and we delivered it that
    afternoon. We also advertised &lt;a href=&quot;https://twitter.com/mraible/status/928574165380198402&quot;&gt;the t-shirts we brought&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4543/26811844159_1b82a326bf_c.jpg&quot; title=&quot;Angular vs React Smackdown with Deepu&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26811844159/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4543/26811844159_1b82a326bf.jpg&quot; width=&quot;500&quot; alt=&quot;Angular vs React Smackdown with Deepu&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    There were lots of tweets about our talk, but I think &lt;a href=&quot;https://twitter.com/danielbryantuk/status/928660651785850880&quot;&gt;
    this from Daniel Bryant&lt;/a&gt; with our recommendations for Angular vs React was one of my favorites.
&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;The results of the web framework smackdown are in...&lt;br&gt;&lt;br&gt;via &lt;a href=&quot;https://twitter.com/mraible?ref_src=twsrc%5Etfw&quot;&gt;@mraible&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/deepu105?ref_src=twsrc%5Etfw&quot;&gt;@deepu105&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/hashtag/Devoxx?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Devoxx&lt;/a&gt; &lt;a href=&quot;https://t.co/MBYfZ2Fli4&quot;&gt;pic.twitter.com/MBYfZ2Fli4&lt;/a&gt;&lt;/p&gt;&#8212; Daniel Bryant (@danielbryantuk) &lt;a href=&quot;https://twitter.com/danielbryantuk/status/928660651785850880?ref_src=twsrc%5Etfw&quot;&gt;November 9, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;
    Our session went well, even thought it wasn&#8217;t super technical, and it was published to YouTube.
&lt;/p&gt;
&lt;div style=&quot;max-width: 560px; margin: 0 auto&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/qYEEuiI4l10&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I also &lt;a href=&quot;https://speakerdeck.com/mraible/angular-vs-react-smackdown-devoxx-be-2017&quot;&gt;published our slides on Speaker Deck&lt;/a&gt;.
&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;3e7a2bbd5eed40518bf4cb6cf3822c6c&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;
    We had the JHipster BOF late that night (during the conference movie) and only had three people show up. With five
    committers there, we still had a great time, and it was fun to give Julien the Duke&#8217;s Choice Award trophy since he
    started the project.
&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;&lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; team rocking &lt;a href=&quot;https://twitter.com/Devoxx?ref_src=twsrc%5Etfw&quot;&gt;@Devoxx&lt;/a&gt; &lt;a href=&quot;https://twitter.com/mraible?ref_src=twsrc%5Etfw&quot;&gt;@mraible&lt;/a&gt; &lt;a href=&quot;https://twitter.com/juliendubois?ref_src=twsrc%5Etfw&quot;&gt;@juliendubois&lt;/a&gt; &lt;a href=&quot;https://twitter.com/sendilkumarn?ref_src=twsrc%5Etfw&quot;&gt;@sendilkumarn&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/DukesChoiceAward?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#DukesChoiceAward&lt;/a&gt; &lt;a href=&quot;https://t.co/gaNpnJtBYR&quot;&gt;pic.twitter.com/gaNpnJtBYR&lt;/a&gt;&lt;/p&gt;&#8212; Deepu K Sasidharan (@deepu105) &lt;a href=&quot;https://twitter.com/deepu105/status/928679012343402498?ref_src=twsrc%5Etfw&quot;&gt;November 9, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;Duke might&apos;ve had a little too much to drink during our BOF. :D&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4572/37700211975_2be2fc9bf4_c.jpg&quot; title=&quot;Duke at the JHipster BOF&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700211975/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4572/37700211975_2be2fc9bf4.jpg&quot; width=&quot;500&quot; alt=&quot;Duke at the JHipster BOF&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I thought our ratings (~4.2) for the two sessions were &#8220;good enough&#8221; to call the conference a success. Thanks to the conference organizers for delivering such an awesome experience once again.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4536/37700221155_9aa2e516d9_c.jpg&quot; title=&quot;The Devoxx Belgium Team&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700221155/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4536/37700221155_9aa2e516d9.jpg&quot; width=&quot;500&quot; alt=&quot;The Devoxx Belgium Team&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&quot;devoxx-morocco&quot;&gt;Devoxx Morocco&lt;/h3&gt;
&lt;p&gt;
    I spent the weekend in Bruges and had a lovely time staying at an Airbnb and visiting some local breweries.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4524/37700211025_17406959ff_c.jpg&quot; title=&quot;Brugge&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700211025/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4524/37700211025_17406959ff_q.jpg&quot; width=&quot;150&quot;  alt=&quot;Brugge&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4524/24716006538_7acb95faa4_c.jpg&quot; title=&quot;Brugge&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/24716006538/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4524/24716006538_7acb95faa4_q.jpg&quot; width=&quot;150&quot; alt=&quot;Brugge&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4551/37700207885_d3b0c87135_c.jpg&quot; title=&quot;Kwak in Brugge&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700207885/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4551/37700207885_d3b0c87135_q.jpg&quot; width=&quot;150&quot; alt=&quot;Kwak in Brugge&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://farm5.staticflickr.com/4521/24716004808_d9c6eb8986_c.jpg&quot; title=&quot;Brugge by night&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/24716004808/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4521/24716004808_d9c6eb8986_m.jpg&quot; width=&quot;240&quot; alt=&quot;Brugge by night&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4580/37700206205_fab269d774_c.jpg&quot; title=&quot;The streets of Brugge&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700206205/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4580/37700206205_fab269d774_m.jpg&quot; width=&quot;240&quot; alt=&quot;The streets of Brugge&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://farm5.staticflickr.com/4568/24716003048_8af41b6f48_c.jpg&quot; title=&quot;Life is good in Bruges, and it just got a little bit better.&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/24716003048/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4568/24716003048_8af41b6f48_z.jpg&quot; width=&quot;480&quot; alt=&quot;Life is good in Bruges, and it just got a little bit better.&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    On Saturday night, I worked for several hours on the Ionic module for JHipster that I needed for my talk at Devoxx Morocco. That&#8217;s where the (self-inflicted) drama began. Here&#8217;s the timeline of events that I
    documented in my presentation after my talk:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;After Devoxx Belgium, tried to finish Ionic module over the weekend.&lt;/li&gt;
    &lt;li&gt;Late night of hacking, couldn&#8217;t figure out why what worked last week didn&#8217;t work this week.&lt;/li&gt;
    &lt;li&gt;Discovered Ionic &#8220;super&#8221; starter was upgraded to Angular 5 in the last week.&lt;/li&gt;
    &lt;li&gt;Realized I needed to version the starter or write my own.&lt;/li&gt;
    &lt;li&gt;Tried to make OAuth work, because Okta.&lt;/li&gt;
    &lt;li&gt;Discovered OAuth wouldn&#8217;t work, because JHipster implementation uses cookies, and Cordova&#8217;s web view won&#8217;t work
        with cookies.
    &lt;/li&gt;
    &lt;li&gt;Sunday evening (my talk was on Wednesday morning): refactored everything into an Ionic starter.&lt;/li&gt;
    &lt;li&gt; Monday: finished starter, couldn&#8217;t get it to work in iOS emulator because CORS.&lt;/li&gt;
    &lt;li&gt;Found bugs about CORS doesn&#8217;t work over http. Spent hours trying to make it work over https. Couldn&#8217;t get a local certificate to be trusted, couldn&#8217;t deploy a JHipster app to the cloud (b/c of slow wifi). Even tried cloud-to-cloud, but
        ran into frontend-maven-plugin on Linux issues.
    &lt;/li&gt;
    &lt;li&gt;Monday afternoon: discovered real issue was that emulator runs on port 8080. Changed JHipster/Spring Boot&#8217;s port to 9000, and it worked!
    &lt;/li&gt;&lt;li&gt;Tuesday: delivered talk on Cloud Native PWAs with Josh Long.
    (https://twitter.com/mraible/status/930477708022337536)
&lt;/li&gt;
    &lt;li&gt;Tuesday after dinner: started working on entity generator for Ionic.&lt;/li&gt;
    &lt;li&gt;Wednesday 4am: Got it working!&lt;/li&gt;
    &lt;li&gt;Wednesday 8-11:25am: wrote presentation.&lt;/li&gt;
    &lt;li&gt;Wednesday 11:30am: delivered talk, showed demo that worked!!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    I &lt;a href=&quot;https://speakerdeck.com/mraible/developing-pwas-and-mobile-apps-with-ionic-angular-and-jhipster-devoxx-morocco-2017&quot;&gt;published the slides&lt;/a&gt; from &quot;Developing PWAs and Mobile Apps with Ionic, Angular, and JHipster&quot; to Speaker Deck.
&lt;/p&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;92b706a743634ccdbfea67e441726b13&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
    I also &lt;a href=&quot;https://www.youtube.com/watch?v=B7TjR_rJVeU&quot;&gt;made a 5 minute video&lt;/a&gt;, because I recorded a lot of my development experience along the way.
&lt;/p&gt;
&lt;div style=&quot;max-width: 560px; margin: 0 auto&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/B7TjR_rJVeU&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;
    Phew! It was an exhausting couple of weeks. I learned something I already knew - you should have your presentation finished before you leave for the conference, especially when traveling overseas!
&lt;/p&gt;
&lt;p&gt;
    Nevertheless, I had a great time. At Devoxx Belgium, it was announced that Josh and I both won Devoxx Champion awards. This award is given to speakers that attend all the Devoxx conferences in a year. Unfortunately, they never told either of us that we got it, so we missed it in the keynote. Luckily, &lt;a href=&quot;https://youtu.be/6ethbpVl4eo?t=12m52s&quot;&gt;it was recorded&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    At Devoxx Morocco, they notified me five minutes before the keynote that &#8220;I should come&#8221; and that they had a
    surprise for me. I was in the midst of my last-minute scramble to get code working and write my presentation, but I
    went anyway. I&#8217;m glad I did because it was a very cool opening keynote and I was honored to receive a Devoxx Champion award.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4537/26811841789_85bc9ea4a8_c.jpg&quot; title=&quot;Devoxx Morocco Keynote&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26811841789/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4537/26811841789_85bc9ea4a8_m.jpg&quot; width=&quot;240&quot; alt=&quot;Devoxx Morocco Keynote&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4545/37700212615_a544f02282_c.jpg&quot; title=&quot;Devoxx Morocco Keynote&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700212615/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4545/37700212615_a544f02282_m.jpg&quot; width=&quot;240&quot; alt=&quot;Devoxx Morocco Keynote&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://farm5.staticflickr.com/4562/37700212995_9b7bf52f74_c.jpg&quot; title=&quot;Devoxx Champion!&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/37700212995/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4562/37700212995_9b7bf52f74.jpg&quot; width=&quot;500&quot; alt=&quot;Devoxx Champion!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I made sure to get my picture with Josh, and his girlfriend Tammie, after lunch.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4528/26811841249_2cf6c7ab1b_c.jpg&quot; title=&quot;Devoxx Champions!&quot; rel=&quot;lightbox[devoxx2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/26811841249/in/album-72157690880978696/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4528/26811841249_2cf6c7ab1b.jpg&quot; width=&quot;500&quot; alt=&quot;Devoxx Champions!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    There are two new Okta open source projects as part of my efforts, but they&#8217;ll require some polishing before they&#8217;re ready for general consumption. I hope to do that before the end of the year, but the end of January is probably more realistic.
    Below are links to their repos on GitHub:
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/oktadeveloper/ionic-jhipster-starter&quot;&gt;https://github.com/oktadeveloper/ionic-jhipster-starter&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/oktadeveloper/generator-jhipster-ionic&quot;&gt;https://github.com/oktadeveloper/generator-jhipster-ionic&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more photos from these events, see &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157690880978696&quot;&gt;my album on Flickr&lt;/a&gt;.
    Devoxx Belgium posted their photos to &lt;a href=&quot;https://www.flickr.com/photos/bejug/albums/72157688379343341&quot;&gt;a Devoxx2017 album&lt;/a&gt;, as well
    as albums for each day: &lt;a href=&quot;https://www.flickr.com/photos/bejug/albums/72157688133612441&quot;&gt;day 1&lt;/a&gt;, &lt;a href=&quot;https://www.flickr.com/photos/bejug/albums/72157687122938352&quot;&gt;day 2&lt;/a&gt;, &lt;a href=&quot;https://www.flickr.com/photos/bejug/albums/72157688224388621&quot;&gt;day 3&lt;/a&gt;,
    &lt;a href=&quot;https://www.flickr.com/photos/bejug/albums/72157687279078222&quot;&gt;day 4&lt;/a&gt;, and &lt;a href=&quot;https://www.flickr.com/photos/bejug/albums/72157690510945366&quot;&gt;day 5&lt;/a&gt;. Devoxx Morocco posted all of their photos in three separate albums: &lt;a href=&quot;https://www.flickr.com/photos/127834083@N04/albums/72157690630170846&quot;&gt;day 1&lt;/a&gt;, &lt;a href=&quot;https://www.flickr.com/photos/127834083@N04/albums/72157687428585142&quot;&gt;day 2&lt;/a&gt;, and &lt;a href=&quot;https://www.flickr.com/photos/127834083@N04/albums/72157689733960115&quot;&gt;day 3&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    I want to thank the organizers from Devoxx Belgium and Devoxx Morocco for accepting my talks and allow me to fulfill one of my goals for the year: becoming a Devoxx Champion. In 2018, I plan to slow down a bit and speak more in the US,
    concentrating on Java User Groups.
&lt;/p&gt;
&lt;p&gt;
    However, 2017 isn&apos;t over! I&apos;ll be speaking at &lt;a href=&quot;https://springoneplatform.io/&quot;&gt;SpringOne&lt;/a&gt; and
    &lt;a href=&quot;https://therichwebexperience.com/conference/clearwater/2017/12/home&quot;&gt;The Rich Web Experience&lt;/a&gt; next week.
    We&apos;re also planning a &lt;a href=&quot;https://www.meetup.com/Devoxx4Kids-Denver/events/245437411/&quot;&gt;Devoxx4Kids Denver&lt;/a&gt; meetup in December and
    a &lt;a href=&quot;https://www.meetup.com/DenverJavaUsersGroup/events/gbcxxmywqbrb/&quot;&gt;Denver JUG Holiday Party&lt;/a&gt; as well.
&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_jhipster_mini_book_v4</guid>
    <title>The JHipster Mini-Book v4.0 Now Available for Download!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_jhipster_mini_book_v4</link>
        <pubDate>Fri, 22 Sep 2017 08:22:04 -0600</pubDate>
    <category>Java</category>
    <category>book</category>
    <category>writing</category>
    <category>infoq</category>
    <category>jhipster-mini-book</category>
    <category>jhipster</category>
            <description>&lt;p&gt;The JHipster Mini-Book v4.0 is &lt;a href=&quot;https://www.infoq.com/minibooks/jhipster-4-mini-book&quot;&gt;now available as a free download from InfoQ&lt;/a&gt;. Get it while it&apos;s hot! You&apos;ll also be able to buy a print version in a week or two. You can read all about what&#8217;s changed since v2.0 on the &lt;a href=&quot;http://www.jhipster-book.com/#!/news/entry/jhipster-mini-book-v4-released&quot;&gt;JHipster Mini-Book blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The source code for the application developed in the book (21-Points Health) is &lt;a href=&quot;https://github.com/mraible/21-points&quot;&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to the &lt;a href=&quot;http://www.infoq.com&quot;&gt;InfoQ&lt;/a&gt; publishing team, &lt;a href=&quot;https://twitter.com/sharpedennis&quot;&gt;Dennis Sharpe&lt;/a&gt; for tech editing, and Lawrence Nyveen for copy editing. And most of all, thank you &lt;a href=&quot;http://asciidoctor.org/&quot;&gt;Asciidoctor&lt;/a&gt; for making the publishing process so easy! &lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/devoxx_poland_a_huge_conference</guid>
    <title>Devoxx Poland: A Huge Conference in a Beautiful City</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/devoxx_poland_a_huge_conference</link>
        <pubDate>Tue, 27 Jun 2017 08:44:31 -0600</pubDate>
    <category>Java</category>
    <category>krakow</category>
    <category>jhipster</category>
    <category>devoxx</category>
    <category>devoxxpl</category>
    <category>ionic</category>
    <category>okta</category>
    <category>angular</category>
    <category>poland</category>
    <category>spring-boot</category>
    <atom:summary type="html">&lt;p&gt;It&apos;s been a little over six years since I &lt;a href=&quot;//raibledesigns.com/rd/entry/two_opening_days_with_a&quot;&gt;
    first ventured to Krak&#243;w, Poland&lt;/a&gt;. I have fond memories of that trip,
    mostly because Trish was with me and we explored lots of sites. Last month,
    I &lt;a href=&quot;//raibledesigns.com/rd/entry/speaking_adventures_at_j_spring&quot;&gt;
        visited Krak&#243;w for GeeCON&lt;/a&gt;, but only stayed for one night.
&lt;/p&gt;
&lt;p&gt;Last week, I had the pleasure of visiting a third time for my first
    &lt;a href=&quot;http://devoxx.pl&quot;&gt;Devoxx Poland&lt;/a&gt;. I was excited to travel
    internationally again with my favorite travel shirt on. This caused a &lt;a href=&quot;https://twitter.com/mraible/status/877295134294945792&quot;&gt;funny conversation with TSA&lt;/a&gt; just
    before my departure.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c1.staticflickr.com/5/4230/35389832432_51e0fe03fb_c.jpg&quot; title=&quot;Heading to the airport in my favorite travel shirt&quot; rel=&quot;lightbox[devoxxpoland2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/35389832432/in/album-72157685455292516/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4230/35389832432_51e0fe03fb_n.jpg&quot; width=&quot;320&quot; alt=&quot;Heading to the airport in my favorite travel shirt&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    I arrived in Krakow on a beautiful day and took an Ub&#235;r to my hotel next to the &lt;a href=&quot;http://www.icekrakow.com/&quot;&gt;venue&lt;/a&gt;.
    I took a stroll along the Vistula River to enjoy the sunshine.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c1.staticflickr.com/5/4213/34716670334_4dc1e72a8c_c.jpg&quot; title=&quot;A beautiful day in Krakow&quot; rel=&quot;lightbox[devoxxpoland2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/34716670334/in/album-72157685455292516/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4213/34716670334_4dc1e72a8c.jpg&quot; width=&quot;500&quot; alt=&quot;A beautiful day in Krakow&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;It&apos;s been a little over six years since I &lt;a href=&quot;//raibledesigns.com/rd/entry/two_opening_days_with_a&quot;&gt;
    first ventured to Krak&#243;w, Poland&lt;/a&gt;. I have fond memories of that trip,
    mostly because Trish was with me and we explored lots of sites. Last month,
    I &lt;a href=&quot;//raibledesigns.com/rd/entry/speaking_adventures_at_j_spring&quot;&gt;
        visited Krak&#243;w for GeeCON&lt;/a&gt;, but only stayed for one night.
&lt;/p&gt;
&lt;p&gt;Last week, I had the pleasure of visiting a third time for my first
    &lt;a href=&quot;http://devoxx.pl&quot;&gt;Devoxx Poland&lt;/a&gt;. I was excited to travel
    internationally again with my favorite travel shirt on. This caused a &lt;a href=&quot;https://twitter.com/mraible/status/877295134294945792&quot;&gt;funny conversation with TSA&lt;/a&gt; just
    before my departure.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c1.staticflickr.com/5/4230/35389832432_51e0fe03fb_c.jpg&quot; title=&quot;Heading to the airport in my favorite travel shirt&quot; rel=&quot;lightbox[devoxxpoland2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/35389832432/in/album-72157685455292516/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4230/35389832432_51e0fe03fb_n.jpg&quot; width=&quot;320&quot; alt=&quot;Heading to the airport in my favorite travel shirt&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
    I arrived in Krakow on a beautiful day and took an Ub&#235;r to my hotel next to the &lt;a href=&quot;http://www.icekrakow.com/&quot;&gt;venue&lt;/a&gt;.
    I took a stroll along the Vistula River to enjoy the sunshine.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c1.staticflickr.com/5/4241/34748919143_9672c64024_c.jpg&quot; title=&quot;Along the Vistula River&quot; rel=&quot;lightbox[devoxxpoland2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/34748919143/in/album-72157685455292516/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4241/34748919143_9672c64024_m.jpg&quot; width=&quot;240&quot; alt=&quot;Along the Vistula River&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;https://c1.staticflickr.com/5/4235/35389825542_fba39c9668_c.jpg&quot; title=&quot;Gorgeous day for a stroll in Krakow&quot; rel=&quot;lightbox[devoxxpoland2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/35389825542/in/album-72157685455292516/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4235/35389825542_fba39c9668_m.jpg&quot; width=&quot;240&quot; alt=&quot;Gorgeous day for a stroll in Krakow&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://c1.staticflickr.com/5/4213/34716670334_4dc1e72a8c_c.jpg&quot; title=&quot;A beautiful day in Krakow&quot; rel=&quot;lightbox[devoxxpoland2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/34716670334/in/album-72157685455292516/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/5/4213/34716670334_4dc1e72a8c.jpg&quot; width=&quot;500&quot; alt=&quot;A beautiful day in Krakow&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I attended the conference happy hour that evening, then journeyed to a local restaurant for some delicious food and
   fun conversations. There&apos;s a chance one of those conversations inspires
    &lt;a href=&quot;https://twitter.com/mraible/status/879148355837808640&quot;&gt;a speaking tour in South Africa next year&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    On Thursday, I attended a couple sessions on application and microservices security, and delivered my talk on PWAs
    with Ionic, Angular, and Spring Boot. You can check out my presentation below or &lt;a href=&quot;https://speakerdeck.com/mraible/pwas-with-ionic-angular-and-spring-boot-devoxx-poland-2017&quot;&gt;on Speaker
    Deck&lt;/a&gt;. 
&lt;/p&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;e37f9244883b4319a2650633446313a9&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
I was amazed at the sheer size of Devoxx Poland! Not only was the venue massive, but its 2500 attendees filled it up quickly.
    Thursday evening was the speaker&apos;s dinner, on a boat no less! It was a great location, with lots of familiar faces.
&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;&lt;a href=&quot;https://twitter.com/hashtag/DevoxxPL?src=hash&quot;&gt;#DevoxxPL&lt;/a&gt; Speakers and Heroes &lt;a href=&quot;https://t.co/nat8xCS27F&quot;&gt;pic.twitter.com/nat8xCS27F&lt;/a&gt;&lt;/p&gt;&#8212; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/878004406049832961&quot;&gt;June 22, 2017&lt;/a&gt;&lt;/blockquote&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;&lt;a href=&quot;https://twitter.com/hashtag/DevoxxPL?src=hash&quot;&gt;#DevoxxPL&lt;/a&gt; Speakers and Heroes, Part II &lt;a href=&quot;https://t.co/5wNpoFweeZ&quot;&gt;pic.twitter.com/5wNpoFweeZ&lt;/a&gt;&lt;/p&gt;&#8212; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/878005090208014338&quot;&gt;June 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;
    Friday, I spoke about &lt;a href=&quot;https://speakerdeck.com/mraible/whats-new-in-jhipsterland-devoxx-poland-2017&quot;&gt;What&apos;s
    New in JHipsterLand&lt;/a&gt;. My presentation can be viewed below or &lt;a href=&quot;https://speakerdeck.com/mraible/whats-new-in-jhipsterland-devoxx-poland-2017&quot;&gt;on Speaker Deck&lt;/a&gt;.
    You can &lt;a href=&quot;https://speakerd.s3.amazonaws.com/presentations/ead4ec7cb572489ab67865f61767fa7c/What_s_New_in_JHipsterLand_-_Devoxx_Poland_2017.pdf&quot;&gt;download the PDF from Speaker Deck&lt;/a&gt; for clickable links.
&lt;/p&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;ead4ec7cb572489ab67865f61767fa7c&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&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;Thanks &lt;a href=&quot;https://twitter.com/hashtag/DevoxxPL?src=hash&quot;&gt;#DevoxxPL&lt;/a&gt; - I had a blast! &lt;a href=&quot;https://t.co/Iho4HqTBYE&quot;&gt;pic.twitter.com/Iho4HqTBYE&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/878213036523126785&quot;&gt;June 23, 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;
    In other news, I&apos;ve been busy writing blog posts for the &lt;a href=&quot;https://twitter.com/oktadev&quot;&gt;@OktaDev&lt;/a&gt; blog.
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://developer.okta.com/blog/2017/06/13/add-authentication-angular-pwa&quot;&gt;Add Authentication to Your
        Angular PWA&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://developer.okta.com/blog/2017/06/15/build-microservices-architecture-spring-boot&quot;&gt;Build a
        Microservices Architecture for Microbrews with Spring Boot&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://developer.okta.com/blog/2017/06/20/develop-microservices-with-jhipster&quot;&gt;Develop and Deploy
        Microservices with JHipster&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth&quot;&gt;What the Heck is OAuth?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also wrote an article for &lt;a href=&quot;https://scotch.io&quot;&gt;scotch.io&lt;/a&gt; titled &quot;&lt;a href=&quot;https://scotch.io/tutorials/the-ultimate-guide-to-progressive-web-applications&quot;&gt;The Ultimate Guide to
    Progressive Web Applications&lt;/a&gt;.&quot;&lt;/p&gt;
&lt;p&gt;For the next couple of weeks, I&apos;ll be on vacation in Montana. Then it&apos;s time for
    &lt;a href=&quot;https://uberconf.com/conference/denver/2017/07/home&quot;&gt;&#220;berConf&lt;/a&gt;, &lt;a href=&quot;https://virtualjug.com/&quot;&gt;vJUG&lt;/a&gt; (with &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt;!), and
    &lt;a href=&quot;https://www.okta.com/oktane17/&quot;&gt;Oktane17&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If I don&apos;t see you on the rivers in Montana or at an upcoming conference, I hope you have a great summer!
&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/speaking_adventures_at_j_spring</guid>
    <title>Speaking Adventures at J-Spring, Devoxx UK, GeeCON, and Spring I/O</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/speaking_adventures_at_j_spring</link>
        <pubDate>Wed, 24 May 2017 09:50:55 -0600</pubDate>
    <category>Java</category>
    <category>geecon</category>
    <category>springio17</category>
    <category>okta</category>
    <category>microservices</category>
    <category>java</category>
    <category>angular</category>
    <category>jspring</category>
    <category>spring</category>
    <category>devoxxuk</category>
    <category>springboot</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/angular_and_cloud_native_pwas</guid>
    <title>Angular and Cloud Native PWAs at Devoxx France</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/angular_and_cloud_native_pwas</link>
        <pubDate>Mon, 10 Apr 2017 11:53:42 -0600</pubDate>
    <category>Java</category>
    <category>spring-boot</category>
    <category>angular</category>
    <category>pwa</category>
    <category>spring-cloud</category>
    <category>java</category>
    <atom: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; </atom:summary>        <description>&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; </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/let_the_okta_and_devoxx</guid>
    <title>Let the Okta and Devoxx Journeys Begin!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/let_the_okta_and_devoxx</link>
        <pubDate>Thu, 16 Mar 2017 11:43:59 -0600</pubDate>
    <category>Java</category>
    <category>okta</category>
    <category>vws</category>
    <category>devoxxfr</category>
    <category>hefe</category>
    <category>stout</category>
    <category>devoxxus</category>
            <description>&lt;p&gt;
It&apos;s been almost a month since &lt;a href=&quot;https://stormpath.com/blog/stormpaths-new-path&quot;&gt;Stormpath joined forces with Okta&lt;/a&gt;. My first day at Okta was on February 27, and I was only briefly in the San Francisco headquarters. I had to fly out at noon on my second day, so I hunkered down in the Okta Pub and cranked out a presentation for a &lt;a href=&quot;https://www.meetup.com/kc-spring/events/237347674/&quot;&gt;talk with Micah Silverman&lt;/a&gt; at the Kansas City Spring User Group.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://www.flickr.com/photos/mraible/32660168943/&quot; title=&quot;The Okta Pub&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/597/32660168943_760470f40f.jpg&quot; width=&quot;500&quot; alt=&quot;The Okta Pub&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
That&apos;s right, Okta has a &lt;em&gt;pub&lt;/em&gt; in their SF HQ. When I first heard about this, I knew it&apos;d be a good fit for me!
&lt;/p&gt;

&lt;p&gt;Now properly fortified, I finished the presentation and headed for the airport, where I rejoiced in my clothing choices for the day.&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 love wearing this &lt;a href=&quot;https://twitter.com/goStormpath&quot;&gt;@goStormpath&lt;/a&gt; t-shirt when going through security at the airport. ?? &lt;a href=&quot;https://t.co/4oOGiaXEd9&quot;&gt;pic.twitter.com/4oOGiaXEd9&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/836650699962236928&quot;&gt;February 28, 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;
The whirlwind of ramping up at Okta hasn&apos;t died down yet. Last week, I figured out how to authenticate with Okta&apos;s API using Spring Boot and SAML. I also got an OAuth 2.0 example working. Then I moved onto Angular and got an example working with OpenID Connect (OIDC), &lt;a href=&quot;https://github.com/okta/okta-signin-widget&quot;&gt;Okta&apos;s Sign-In Widget&lt;/a&gt;, and the &lt;a href=&quot;https://github.com/okta/okta-auth-js&quot;&gt;Okta Auth SDK&lt;/a&gt;. I was especially pumped when I got an Angular client working with OIDC and a Spring Boot + Spring Security backend. This week, I wrote up my findings as tutorials and recorded a couple screencasts to accompany them. These will likely show up as blogs posts on &lt;a href=&quot;http://developer.okta.com/blog/&quot;&gt;Okta Developer Blog&lt;/a&gt; over the next few weeks.
&lt;/p&gt;
&lt;p&gt;
While the first couple of weeks at Okta has been exciting, I&apos;m more excited about the upcoming Devoxx conferences I&apos;ll be speaking at.
&lt;/p&gt; 
&lt;p&gt;Next week, &lt;a href=&quot;http://devoxx.us/&quot;&gt;Devoxx US&lt;/a&gt; will be happening for the first time! As a member of the program committee, I  promise you this is going to be a great show! We had an incredible number of high quality submissions and it shows in the &lt;a href=&quot;http://cfp.devoxx.us/2017/talks&quot;&gt;agenda&lt;/a&gt;. I&apos;m especially looking forward to &lt;a href=&quot;https://twitter.com/janellekz&quot;&gt;Janelle Klein&apos;s&lt;/a&gt; &lt;a href=&quot;http://cfp.devoxx.us/2017/talk/NAN-8167/What_is_%22Identity%22%3F&quot;&gt;What is Identity?&lt;/a&gt; keynote. I&apos;ll be doing talks on &lt;a href=&quot;http://cfp.devoxx.us/2017/speaker/matt_raible&quot;&gt;JHipster, Asciidoctor, and how NOT to restore a VW Bus&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Speaking of the bus, Hefe sure looks good, doesn&apos;t he? &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;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-version=&quot;7&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:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:34.76851851851852% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&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;&lt;a href=&quot;https://www.instagram.com/p/BRqXnjwBck-/&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;&quot; target=&quot;_blank&quot;&gt;A post shared by Matt Raible (@vwsforlife)&lt;/a&gt; on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2017-03-15T14:24:26+00:00&quot;&gt;Mar 15, 2017 at 7:24am PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async defer src=&quot;//platform.instagram.com/en_US/embeds.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;After returning from Devoxx US, Trish and I are taking Abbie and Jack on the spring break trip of a lifetime. I&apos;ve never been to &lt;a href=&quot;http://bigskyresort.com/&quot;&gt;Big Sky&lt;/a&gt;, so we&apos;re heading there for a week of skiing, frolicking, and playing in the snow. I might even go phoneless for the week to fully embrace the serenity that Montana provides.
&lt;/p&gt;
&lt;p&gt;I&apos;m off to &lt;a href=&quot;http://devoxx.fr/&quot;&gt;Devoxx France&lt;/a&gt; the following week. I&apos;m really looking forward to this conference because &lt;a href=&quot;http://cfp.devoxx.fr/2017/speaker/matt_raible&quot;&gt;my talks&lt;/a&gt; are all about Angular. I&apos;ll be doing a hands-on lab on getting started with Angular, as well as developing a &lt;abbr title=&quot;Progressive Web App&quot;&gt;PWA&lt;/a&gt; with Josh Long.
&lt;/p&gt;
&lt;p&gt;To make things even better while I&apos;m on the road, I&apos;m getting some work done on both VWs. We&apos;re getting Stout the Syncro painted and having a stereo installed in Hefe. With any luck, Stout 5.0 and Hefe 3.0 will be released in April, just in time for the car show season.&lt;/p&gt;
&lt;p&gt;So yeah, life is pretty darn good right now. Let me know if you&apos;ll be in Tahoe, San Jose, Big Sky, or Paris when I&apos;m there. I&apos;d love to chat about authentication, open source technologies, VWs, or good beer.
&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_jolly_good_time_at</guid>
    <title>A Jolly Good Time at Jfokus 2017</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_jolly_good_time_at</link>
        <pubDate>Thu, 16 Feb 2017 17:21:23 -0700</pubDate>
    <category>Java</category>
    <category>skiing</category>
    <category>stormpath</category>
    <category>spring-boot</category>
    <category>angular</category>
    <category>sweden</category>
    <category>jfokus</category>
    <category>fun</category>
    <category>speakerdeck</category>
    <category>ionic</category>
    <category>speaking</category>
    <atom:summary type="html">&lt;p&gt;
  I like speaking at conferences. I don&apos;t enjoy the stress of creating a new talk and delivering it for the first time, but I do enjoy delivering talks, and I love the feeling after. It&apos;s even better when the conference provides an atmosphere that creates lasting memories.
&lt;/p&gt;
&lt;p&gt;
  I&apos;ve been to many conferences in my career. A conference with a sense of community provides one of my favorite experiences. Not just for the people that attend, but for the people that speak. I&apos;ve been to several conferences that provide this experience and I&apos;m happy to say I just attended one of my favorites: &lt;a href=&quot;http://www.jfokus.se/jfokus/&quot;&gt;Jfokus 2017&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
  I flew from Denver to Stockholm last Monday and performed my first talk on Testing Angular Applications just a few hours after I arrived on Tuesday. Usually, I take a day or two to recover from jet lag, but this time I figured I could &lt;em&gt;clutch up&lt;/em&gt; and make it work. Going to sleep on the plane at 6pm Denver time certainly helped and I think the talk went well. For the live coding part of the presentation, I used the second half of my &lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible/ng-demo//README.adoc&quot;&gt;Angular and Angular CLI tutorial&lt;/a&gt;. I posted my slides for this talk to &lt;a href=&quot;https://www.slideshare.net/mraible/testing-angular-applications-jfokus-2017&quot;&gt;SlideShare&lt;/a&gt; and &lt;a href=&quot;https://speakerdeck.com/mraible/testing-angular-applications-jfokus-2017&quot;&gt;Speaker Deck&lt;/a&gt;. You can also view them below.
&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;a7a26351937e43c28726ee54e41b8c3a&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;
  Tuesday night, there was a conference party. I met many new people and put some names to faces with a vibrant community of conference attendees and speakers.
&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;Late night &lt;a href=&quot;https://twitter.com/hashtag/Jfokus?src=hash&quot;&gt;#Jfokus&lt;/a&gt; party! &lt;a href=&quot;https://t.co/IqjczVXuP6&quot;&gt;pic.twitter.com/IqjczVXuP6&lt;/a&gt;&lt;/p&gt;&#8212; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/829107799883935748&quot;&gt;February 7, 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;</atom:summary>        <description>&lt;p&gt;
  I like speaking at conferences. I don&apos;t enjoy the stress of creating a new talk and delivering it for the first time, but I do enjoy delivering talks, and I love the feeling after. It&apos;s even better when the conference provides an atmosphere that creates lasting memories.
&lt;/p&gt;
&lt;p&gt;
  I&apos;ve been to many conferences in my career. A conference with a sense of community provides one of my favorite experiences. Not just for the people that attend, but for the people that speak. I&apos;ve been to several conferences that provide this experience and I&apos;m happy to say I just attended one of my favorites: &lt;a href=&quot;http://www.jfokus.se/jfokus/&quot;&gt;Jfokus 2017&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
  I flew from Denver to Stockholm last Monday and performed my first talk on Testing Angular Applications just a few hours after I arrived on Tuesday. Usually, I take a day or two to recover from jet lag, but this time I figured I could &lt;em&gt;clutch up&lt;/em&gt; and make it work. Going to sleep on the plane at 6pm Denver time certainly helped and I think the talk went well. For the live coding part of the presentation, I used the second half of my &lt;a href=&quot;http://gist.asciidoctor.org/?github-mraible/ng-demo//README.adoc&quot;&gt;Angular and Angular CLI tutorial&lt;/a&gt;. I posted my slides for this talk to &lt;a href=&quot;https://www.slideshare.net/mraible/testing-angular-applications-jfokus-2017&quot;&gt;SlideShare&lt;/a&gt; and &lt;a href=&quot;https://speakerdeck.com/mraible/testing-angular-applications-jfokus-2017&quot;&gt;Speaker Deck&lt;/a&gt;. You can also view them below.
&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;a7a26351937e43c28726ee54e41b8c3a&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;
  Tuesday night, there was a conference party. I met many new people and put some names to faces with a vibrant community of conference attendees and speakers.
&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;Late night &lt;a href=&quot;https://twitter.com/hashtag/Jfokus?src=hash&quot;&gt;#Jfokus&lt;/a&gt; party! &lt;a href=&quot;https://t.co/IqjczVXuP6&quot;&gt;pic.twitter.com/IqjczVXuP6&lt;/a&gt;&lt;/p&gt;&#8212; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/829107799883935748&quot;&gt;February 7, 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;
  I enjoyed Juergen Hoeller&apos;s &lt;a href=&quot;http://www.jfokus.se/jfokus/talks.jsp#SpringFramework5%3AThe&quot;&gt;talk about Spring 5&lt;/a&gt; on Wednesday morning. There&apos;s a lot of innovation still happening within Spring and it was nice to get a sense of when releases will be happening.
&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;Spring Framework 5.0 RC1 in April 2017, GA in May. &lt;a href=&quot;https://twitter.com/springboot&quot;&gt;@springboot&lt;/a&gt; 2.0 M1 in April too. Spring 5.1 with Servlet 4, Spring Boot 2.0 GA in Q4.&lt;/p&gt;&#8212; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/829251588824952832&quot;&gt;February 8, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;

I attended a talk on &lt;a href=&quot;http://slides.com/gerardsans/jfokus-amazing-ng2-router#/&quot;&gt;The Amazing Angular Router&lt;/a&gt; with &lt;a href=&quot;https://twitter.com/gerardsans&quot;&gt;Gerard Sans&lt;/a&gt; and then took a stroll around Stockholm in the crisp, cool sunshine.

&lt;p style=&quot;text-align: center&quot;&gt;

  &lt;a href=&quot;https://c1.staticflickr.com/1/590/32901142996_b0f48b2b45_c.jpg&quot; title=&quot;Nice day for a stroll around Stockholm.&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32901142996/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/590/32901142996_b0f48b2b45_q.jpg&quot; width=&quot;150&quot; alt=&quot;Nice day for a stroll around Stockholm.&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

  &lt;a href=&quot;https://c1.staticflickr.com/1/749/32901134576_9e7f16c9ea_c.jpg&quot; title=&quot;Nice day for a stroll around Stockholm.&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32901134576/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/749/32901134576_9e7f16c9ea_q.jpg&quot; width=&quot;150&quot; alt=&quot;Nice day for a stroll around Stockholm.&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

  &lt;a href=&quot;https://c1.staticflickr.com/3/2662/32098301434_4a8318a3c5_c.jpg&quot; title=&quot;Nice day for a stroll around Stockholm.&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32098301434/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2662/32098301434_4a8318a3c5_q.jpg&quot; width=&quot;150&quot; alt=&quot;Nice day for a stroll around Stockholm.&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  I gave my talk on PWAs with &lt;a href=&quot;https://blog.ionic.io/announcing-ionic-2-0-0-final/&quot;&gt;Ionic 2&lt;/a&gt;, Angular, and Spring Boot on Wednesday afternoon. It was my first time doing the talk. I really enjoyed this talk because it inspired me to create &lt;a href=&quot;https://github.com/stormpath/stormpath-sdk-angular-ionic&quot;&gt;Ionic pages for Stormpath&lt;/a&gt; to simplify the demo. Also, developing a mobile app with Ionic 2 has been on my technology bucket list for the last year. You can find my slides for this presentation on &lt;a href=&quot;https://www.slideshare.net/mraible/testing-angular-applications-jfokus-2017&quot;&gt;SlideShare&lt;/a&gt; and &lt;a href=&quot;https://speakerdeck.com/mraible/testing-angular-applications-jfokus-2017&quot;&gt;Speaker Deck&lt;/a&gt;. The app I wrote during the presentation is &lt;a href=&quot;https://github.com/stormpath/stormpath-spring-boot-ionic-example&quot;&gt;available on GitHub&lt;/a&gt;, as is &lt;a href=&quot;https://github.com/stormpath/stormpath-spring-boot-ionic-example/blob/master/TUTORIAL.md&quot;&gt;the tutorial I used to create it&lt;/a&gt;.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;bfe7647b20fe42889c869955c7899e8c&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;
  Little did I know, the community aspect of Jfokus was just getting started. When I was invited to the post-Jfokus Speaker&apos;s Conference, I leapt at the opportunity. I didn&apos;t do it because I thought I&apos;d learn a bunch of stuff, I did it because it offered skiing - one of my favorite activities.
&lt;/p&gt;&lt;p&gt;
  It turned out to be an incredible experience. I knew some of the other speakers, but I certainly didn&apos;t know all of them. Sharing a room with a stranger caused him to become a friend. The views while skiing were magical. The coziness of the lodge where we stayed and the beauty of its atrium were mesmerizing.
&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://c1.staticflickr.com/3/2212/32098286464_d3d55d7192_c.jpg&quot; title=&quot;Sunrise at Storhogna&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32098286464/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2212/32098286464_d3d55d7192_m.jpg&quot; width=&quot;240&quot; alt=&quot;Sunrise at Storhogna&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://c1.staticflickr.com/4/3869/32788113292_c7d359d8f2_c.jpg&quot; title=&quot;It was a beautiful day for skiing at Kl&#246;vsj&#246;!&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32788113292/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/4/3869/32788113292_c7d359d8f2_m.jpg&quot; width=&quot;240&quot; alt=&quot;It was a beautiful day for skiing at Kl&#246;vsj&#246;!&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://c1.staticflickr.com/4/3941/32098282014_079a52f4ce_c.jpg&quot; title=&quot;The Atrium at Storhogna&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32098282014/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/4/3941/32098282014_079a52f4ce_m.jpg&quot; width=&quot;240&quot; alt=&quot;The Atrium at Storhogna&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://c1.staticflickr.com/4/3866/32098275514_be8417729f_c.jpg&quot; title=&quot;The pool and hot tub&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32098275514/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/4/3866/32098275514_be8417729f_m.jpg&quot; width=&quot;240&quot; alt=&quot;The pool and hot tub&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://c1.staticflickr.com/1/754/32127083933_12ec190635_c.jpg&quot; title=&quot;Another beautiful sunrise on Saturday&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32127083933/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/754/32127083933_12ec190635.jpg&quot; width=&quot;500&quot; alt=&quot;Another beautiful sunrise on Saturday&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  I skied all three days, but I also had a blast sharing so many conversations with such a fun community of technology professionals. When I wasn&apos;t trying to catch up on email, Slack, and customer support tickets, we shared stories about how to best work with distributed development teams. Before enjoying the hot tub and roof-top sauna, we hacked games on Raspberry Pi&apos;s and make the zombie apocalypse possible with sensors and buttons.
&lt;/p&gt;
&lt;p&gt;On the bus ride back to Stockholm, I sat with &lt;a href=&quot;https://twitter.com/saturnism&quot;&gt;Ray Tsang&lt;/a&gt; and figured out how to do another tech bucket list item: deploying a &lt;a href=&quot;https://jhipster.github.io/microservices-architecture/&quot;&gt;JHipster microservices architecture&lt;/a&gt; to Google Cloud. It wasn&apos;t easy with the bumpy road, but we took breaks when we started to feel sick. The bus had wi-fi, making it possible to upload fat Docker images to &lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&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; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Hacking with &lt;a href=&quot;https://twitter.com/saturnism&quot;&gt;@saturnism&lt;/a&gt; on the &lt;a href=&quot;https://twitter.com/hashtag/Jfokus?src=hash&quot;&gt;#Jfokus&lt;/a&gt; bus ride. Got a &lt;a href=&quot;https://twitter.com/kubernetesio&quot;&gt;@kubernetesio&lt;/a&gt; cluster with &lt;a href=&quot;https://twitter.com/java_hipster&quot;&gt;@java_hipster&lt;/a&gt; microservices running on Google Cloud! ???? &lt;a href=&quot;https://t.co/wqest06HOu&quot;&gt;pic.twitter.com/wqest06HOu&lt;/a&gt;&lt;/p&gt;&#8212; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/830465662183153666&quot;&gt;February 11, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;
  Before I left Sweden on Sunday, I walked around &lt;a href=&quot;https://en.wikipedia.org/wiki/Gamla_stan&quot;&gt;The Old Town&lt;/a&gt; in Stockholm and took a few pictures.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://c1.staticflickr.com/3/2045/32901161866_6cba35e036_c.jpg&quot; title=&quot;A walk through Old Town Stockholm&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32901161866/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2045/32901161866_6cba35e036_q.jpg&quot; width=&quot;150&quot; alt=&quot;A walk through Old Town Stockholm&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://c1.staticflickr.com/3/2361/32788127212_ef3767f860_c.jpg&quot; title=&quot;A walk through Old Town Stockholm&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32788127212/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2361/32788127212_ef3767f860_q.jpg&quot; width=&quot;150&quot; alt=&quot;A walk through Old Town Stockholm&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

  &lt;a href=&quot;https://c1.staticflickr.com/1/310/32127089833_8216274747_c.jpg&quot; title=&quot;A walk through Old Town Stockholm&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32127089833/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/310/32127089833_8216274747_q.jpg&quot; width=&quot;150&quot; alt=&quot;A walk through Old Town Stockholm&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://c1.staticflickr.com/3/2054/32901166626_6de4876152_c.jpg&quot; title=&quot;A beautiful winter morning in Stockholm&quot; rel=&quot;lightbox[jfokus2017]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/32901166626/in/datetaken-public/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2054/32901166626_6de4876152.jpg&quot; width=&quot;500&quot; alt=&quot;A beautiful winter morning in Stockholm&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;#8594; &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157676824798794&quot;&gt;Jfokus 2017&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
Jfokus was a jolly good time! The conference, the community, a cozy mountain chalet, a fun time skiing and great stimulation for my learning-hungry brain. Thanks to all the organizers, especially &lt;a href=&quot;https://twitter.com/matkar&quot;&gt;Mattias&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/javaHelena&quot;&gt;Helena&lt;/a&gt;. Mattias is an excellent snowboarder and we had lots of fun racing down the mountain. Helena has a beautiful voice and it was super fun to hear her sing into the evening with the accompaniment of &lt;a href=&quot;https://twitter.com/javaHelena/status/830193880809209856&quot;&gt;Ola&apos;s guitar&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; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Singing with &lt;a href=&quot;https://twitter.com/gotoOla&quot;&gt;@gotoOla&lt;/a&gt; while &lt;a href=&quot;https://twitter.com/saturnism&quot;&gt;@saturnism&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/apnylle&quot;&gt;@apnylle&lt;/a&gt; is coding at &lt;a href=&quot;https://twitter.com/hashtag/jfokus?src=hash&quot;&gt;#jfokus&lt;/a&gt; speaker conf. The best mix! &lt;a href=&quot;https://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/matkar&quot;&gt;@matkar&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://twitter.com/pehrs&quot;&gt;@pehrs&lt;/a&gt; sing along! &lt;a href=&quot;https://t.co/Xy2ijTnYrF&quot;&gt;pic.twitter.com/Xy2ijTnYrF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Helena Hjert&#233;n (@javaHelena) &lt;a href=&quot;https://twitter.com/javaHelena/status/830193880809209856&quot;&gt;February 10, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;Lasting memories, I have many.&lt;/p&gt;
&lt;p id=&quot;update&quot;&gt;&lt;strong&gt;Update:&lt;/strong&gt; The good folks from &lt;a href=&quot;https://www.jfokus.se/jfokus/&quot;&gt;Jfokus&lt;/a&gt; have published videos of my talks.&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; width: 560px&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/C_V3Je7Iwso&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/TksyjxipM4M&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/upcoming_events_devoxx4kids_denver_testing</guid>
    <title>Upcoming Events: Devoxx4Kids Denver, Testing Angular 2, DevoxxUS CFP and VJUG24</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/upcoming_events_devoxx4kids_denver_testing</link>
        <pubDate>Fri, 12 Aug 2016 15:29:01 -0600</pubDate>
    <category>Java</category>
    <category>angular</category>
    <category>devoxx4kids</category>
    <category>vjug24</category>
    <category>devoxxus</category>
    <category>denver</category>
            <description>&lt;p&gt;It&apos;s been awhile since I&apos;ve posted anything on this here blog. That usually means one thing - I&apos;ve been off having fun! That couldn&apos;t be more true this summer. The day after my &lt;a href=&quot;//raibledesigns.com/rd/entry/a_delightful_trip_to_devoxx&quot;&gt;last post&lt;/a&gt;, I began traveling and haven&apos;t stopped since. In fact, this weekend will be the first weekend I&apos;ve been home &lt;em&gt;since&lt;/em&gt; writing that post. Hawaii, Montana, Denver, Montana, Colorado Springs and Utah - it&apos;s been a fabulous summer. I&apos;ll write more about those adventures soon.&lt;/p&gt;
&lt;p&gt;In the meantime, I wanted to mention some upcoming events you might be interested in:&lt;/p&gt;
&lt;ul&gt;
     &lt;li style=&quot;margin-bottom: 5px&quot;&gt;&lt;strong&gt;September 10:&lt;/strong&gt; Devoxx4Kids Denver has an upcoming workshop on &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/232720431/&quot;&gt;Exploring JavaScript&lt;/a&gt; with the world famous &lt;a href=&quot;https://twitter.com/venkat_s&quot;&gt;Dr. Venkat Subramaniam&lt;/a&gt;. If you know Venkat, you know this is a session you shouldn&apos;t miss. Your kids will love it, you&apos;ll get a lot of good laughs and everyone is sure to have a good time. Make sure and &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/232720431/&quot;&gt;RSVP&lt;/a&gt; soon so you get in before this baby fills up!&lt;/li&gt;
     &lt;li style=&quot;margin-bottom: 5px&quot;&gt;&lt;strong&gt;August 22:&lt;/strong&gt; HTML5 Denver has a sessions on &lt;a href=&quot;http://www.meetup.com/HTML5-Denver-Users-Group/events/228220656/&quot;&gt;ES6 vs. Typescript and Testing Angular 2 Applications&lt;/a&gt;. The first session will be delivered by my good friend Geoffrey Filippi and I&apos;ll be performing the second act with the help of &lt;a href=&quot;https://github.com/angular/angular-cli&quot;&gt;angular-cli&lt;/a&gt;.&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 5px&quot;&gt;
&lt;a class=&quot;picture&quot; href=&quot;https://c3.staticflickr.com/9/8576/28835656442_50394481d7_c.jpg&quot; rel=&quot;lightbox[devoxxus]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/28835656442/in/datetaken-public/&quot; title=&quot;Devoxx US&quot;&gt;&lt;img src=&quot;https://c3.staticflickr.com/9/8576/28835656442_50394481d7.jpg&quot; width=&quot;250&quot; alt=&quot;Devoxx US&quot; style=&quot;border: 1px solid black; margin: 10px; margin-top: 5px&quot;&gt;&lt;/a&gt;
&lt;strong&gt;September 1:&lt;/strong&gt; One of my favorite conferences, &lt;a href=&quot;https://devoxx.be/&quot;&gt;Devoxx&lt;/a&gt;, is coming to the US! &lt;a href=&quot;http://devoxx.us/&quot;&gt;DevoxxUS&lt;/a&gt; recently &lt;a href=&quot;http://us13.campaign-archive2.com/?u=ed850ea0ed618350b3fc5901f&amp;id=18fd4297cc&quot;&gt;announced&lt;/a&gt; that registration is open. Even more interesting is that the &lt;abbr title=&quot;Call For Papers&quot;&gt;CFP&lt;/abbr&gt; begins September 1st. I&apos;m biased because I&apos;m on the program committee, but I&apos;d love to see your ideas for great talks!&lt;/li&gt;
&lt;li style=&quot;margin-bottom: 5px&quot;&gt;&lt;strong&gt;September 27:&lt;/strong&gt; Our good friends from &lt;a href=&quot;http://virtualjug.com/&quot;&gt;vJUG&lt;/a&gt; are hosting the first &lt;a href=&quot;http://virtualjug.com/vjug24/&quot;&gt;24 hour Virtual Java Conference&lt;/a&gt; in the world! I&apos;ll be speaking about the &lt;a href=&quot;https://virtualjug.com/vjug24-session-the-art-of-angular-in-2016-by-matt-raible/&quot;&gt;Art of Angular in 2016&lt;/a&gt; at 10pm EDT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;September:&lt;/strong&gt; I&apos;m looking for new clients. My current contracts end on August 31 and I&apos;m searching for the next cool team to work with. My expertise: Java, JavaScript and I&apos;m &lt;em&gt;really&lt;/em&gt; good at CSS. This is a hard combination to find! &lt;a href=&quot;http://raibledesigns.com/rd/page/contact&quot;&gt;LMK if you have a need&lt;/a&gt;.
&lt;/ul&gt;
&lt;p&gt;I hope to see you at one of these events! </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_delightful_trip_to_devoxx</guid>
    <title>A Delightful Trip to Devoxx UK and GeekOut 2016</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_delightful_trip_to_devoxx</link>
        <pubDate>Sun, 12 Jun 2016 11:13:17 -0600</pubDate>
    <category>Java</category>
    <category>travel</category>
    <category>london</category>
    <category>devoxxuk</category>
    <category>tallinn</category>
    <category>jhipster</category>
    <category>mom</category>
    <category>angular2</category>
    <category>geekoutee</category>
    <category>speaking</category>
    <atom:summary type="html">&lt;p&gt;
    &lt;a data-href=&quot;https://www.flickr.com/photos/mraible/27617751605/in/album-72157666992992284/&quot; class=&quot;picture&quot; href=&quot;https://c2.staticflickr.com/8/7396/27617746825_9ff773434e_c.jpg&quot; title=&quot;We found a pub!&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot;&gt;&lt;img src=&quot;https://c2.staticflickr.com/8/7396/27617746825_9ff773434e_t.jpg&quot; width=&quot;100&quot; alt=&quot;We found a pub!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    I had the pleasure of traveling to London, England and Tallin, Estonia this past week. In London, I spoke at
    &lt;a href=&quot;http://www.devoxx.co.uk/&quot;&gt;Devoxx UK&lt;/a&gt;. In Tallin, I spoke at &lt;a href=&quot;http://2016.geekout.ee/&quot;&gt;GeekOut&lt;/a&gt;.
    I took my mom (or mum, if you
    prefer)
    and we explored the sights, enjoyed local cuisines and savored a few beverages. Our trip started with a direct
    flight from Denver to London. We arrived on Tuesday, June 7, around noon.
&lt;/p&gt;
&lt;p&gt;We were only in London for two nights, but it was enough time for us to savor excellent Indian food, fancy a walk
    through
    London, and order a bow tie. I forgot the bow tie for my &lt;a href=&quot;http://jhipster.github.io&quot;&gt;JHipster&lt;/a&gt; outfit. Luckily, I found &lt;a href=&quot;http://www.dobell.co.uk/heritage-blue-knitted-bow-tie/&quot;&gt;
        a good replacement&lt;/a&gt; and was able to order it for next-day delivery. I had to order it by 5pm and the site
    declined both my credit cards with time running out. I ended up using PayPal and got my order placed in the nick of
    time: 16:59:51.
&lt;/p&gt;

&lt;p&gt;The big news announced at Devoxx UK is that Devoxx is &lt;a href=&quot;https://devoxx.us&quot;&gt;coming to the United States in
    2017&lt;/a&gt;! I&apos;m on the program committee for this conference, so I look forward to helping make it spectacular.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c6.staticflickr.com/8/7402/27617748525_d75d56ec06_c.jpg&quot; title=&quot;Devoxx coming to US in 2017!&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27617748525/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c6.staticflickr.com/8/7402/27617748525_d75d56ec06.jpg&quot; width=&quot;500&quot; alt=&quot;Devoxx coming to US in 2017!&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;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The first ever &lt;a href=&quot;https://twitter.com/hashtag/DevoxxUS?src=hash&quot;&gt;#DevoxxUS&lt;/a&gt; is happening March 21-23, 2017 in San Jose, CA!
    &lt;a href=&quot;https://t.co/jtQe95LNOL&quot;&gt;https://t.co/jtQe95LNOL&lt;/a&gt;&lt;/p&gt;&#8212; Devoxx US (@devoxxus) &lt;a href=&quot;https://twitter.com/devoxxus/status/740466417703616512&quot;&gt;June 8, 2016&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;</atom:summary>        <description>&lt;p&gt;
    &lt;a data-href=&quot;https://www.flickr.com/photos/mraible/27617751605/in/album-72157666992992284/&quot; class=&quot;picture&quot; href=&quot;https://c2.staticflickr.com/8/7396/27617746825_9ff773434e_c.jpg&quot; title=&quot;We found a pub!&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot;&gt;&lt;img src=&quot;https://c2.staticflickr.com/8/7396/27617746825_9ff773434e_t.jpg&quot; width=&quot;100&quot; alt=&quot;We found a pub!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    I had the pleasure of traveling to London, England and Tallin, Estonia this past week. In London, I spoke at
    &lt;a href=&quot;http://www.devoxx.co.uk/&quot;&gt;Devoxx UK&lt;/a&gt;. In Tallin, I spoke at &lt;a href=&quot;http://2016.geekout.ee/&quot;&gt;GeekOut&lt;/a&gt;.
    I took my mom (or mum, if you
    prefer)
    and we explored the sights, enjoyed local cuisines and savored a few beverages. Our trip started with a direct
    flight from Denver to London. We arrived on Tuesday, June 7, around noon.
&lt;/p&gt;
&lt;p&gt;We were only in London for two nights, but it was enough time for us to savor excellent Indian food, fancy a walk
    through
    London, and order a bow tie. I forgot the bow tie for my &lt;a href=&quot;http://jhipster.github.io&quot;&gt;JHipster&lt;/a&gt; outfit. Luckily, I found &lt;a href=&quot;http://www.dobell.co.uk/heritage-blue-knitted-bow-tie/&quot;&gt;
        a good replacement&lt;/a&gt; and was able to order it for next-day delivery. I had to order it by 5pm and the site
    declined both my credit cards with time running out. I ended up using PayPal and got my order placed in the nick of
    time:
    16:59:51.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
        &lt;a href=&quot;https://c2.staticflickr.com/8/7725/27617750865_1e2f064928_c.jpg&quot; title=&quot;St. Paul&apos;s Cathedral&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27617750865/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c2.staticflickr.com/8/7725/27617750865_1e2f064928.jpg&quot; width=&quot;500&quot; alt=&quot;St. Paul&apos;s Cathedral&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://c6.staticflickr.com/8/7455/27617751605_8f634559e4_c.jpg&quot; title=&quot;River Thames&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27617751605/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c6.staticflickr.com/8/7455/27617751605_8f634559e4_m.jpg&quot; width=&quot;240&quot; alt=&quot;River Thames&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;


    &lt;a href=&quot;https://c2.staticflickr.com/8/7311/27008343553_edcb7f6ea9_c.jpg&quot; title=&quot;Sphynx&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27008343553/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c2.staticflickr.com/8/7311/27008343553_edcb7f6ea9_m.jpg&quot; width=&quot;240&quot; alt=&quot;Sphynx&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;The big news announced at Devoxx UK is that Devoxx is &lt;a href=&quot;https://devoxx.us&quot;&gt;coming to the United States in
    2017&lt;/a&gt;! I&apos;m on the program committee for this conference, so I look forward to helping make it spectacular.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c6.staticflickr.com/8/7402/27617748525_d75d56ec06_c.jpg&quot; title=&quot;Devoxx coming to US in 2017!&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27617748525/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c6.staticflickr.com/8/7402/27617748525_d75d56ec06.jpg&quot; width=&quot;500&quot; alt=&quot;Devoxx coming to US in 2017!&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;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The first ever &lt;a href=&quot;https://twitter.com/hashtag/DevoxxUS?src=hash&quot;&gt;#DevoxxUS&lt;/a&gt; is happening March 21-23, 2017 in San Jose, CA!
    &lt;a href=&quot;https://t.co/jtQe95LNOL&quot;&gt;https://t.co/jtQe95LNOL&lt;/a&gt;&lt;/p&gt;&#8212; Devoxx US (@devoxxus) &lt;a href=&quot;https://twitter.com/devoxxus/status/740466417703616512&quot;&gt;June 8, 2016&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;I thought both my talks went well, but I did have some issues during my Angular 2 talk. I used
    &lt;a href=&quot;https://github.com/angular/angular-cli&quot;&gt;Angular CLI&lt;/a&gt; to do the demo and IDEA kept indexing,
    which caused my live templates to fail. I later learned from an attendee (thanks!) that excluding the
    &lt;code&gt;dist&lt;/code&gt; and &lt;code&gt;tmp&lt;/code&gt;
    directories helps prevents this. You can find the &lt;a href=&quot;https://github.com/mraible/ng2-demo&quot;&gt;source code for my
        demo on GitHub&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;You can &lt;a href=&quot;www.slideshare.net/mraible/the-art-of-angular-in-2016-devoxx-uk-2016&quot;&gt;view my &quot;Art of Angular in 2016&quot; presentation on SlideShare&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=T4zsanOnKtk&quot;&gt;watch it on YouTube&lt;/a&gt;, or just click through it below.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
    &lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/4Axcf5U5cJiJev&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=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;
    I also did a &lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster-spring-boot-angularjs-bootstrap-devoxx-uk-2016&quot;&gt;presentation
    on JHipster&lt;/a&gt;, leveraging &lt;a href=&quot;https://jhipster.github.io/jdl-studio/&quot;&gt;JDL Studio&lt;/a&gt; heavily. You can
    &lt;a href=&quot;https://gist.github.com/mraible/8640fa406f32cb0f18e1aa7d73ab8022&quot;&gt;click here to see the JDL&lt;/a&gt; I used
    for my blog demo. A &lt;a href=&quot;https://www.youtube.com/watch?v=UKMn5UNaUM4&quot;&gt;video of this session is on YouTube&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/ztvafuoJSA4y9t&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=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;We closed out our visit to London with a fun speaker&apos;s dinner and an early morning flight to Helsinki, then Tallinn.
&lt;/p&gt;
&lt;p&gt;
    In Tallinn, we wandered through its Old Town, had some great meals and marveled at how late the sun set. We stopped
    in at the GeekOut conference&apos;s party on Thursday night. The &lt;a href=&quot;https://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt;
    guys did a heckuva job planning this conference.
    I loved how both the party and the conference were in large, industrial-but-modern buildings with great sound
    systems.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://c5.staticflickr.com/8/7387/27340321980_2438e8585b_c.jpg&quot; title=&quot;Tallin, Estonia&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27340321980/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c5.staticflickr.com/8/7387/27340321980_2438e8585b.jpg&quot; width=&quot;500&quot; alt=&quot;Tallin, Estonia&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://c7.staticflickr.com/8/7285/27340323510_94f77f5374_c.jpg&quot; title=&quot;GeekOut Party&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27340323510/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c7.staticflickr.com/8/7285/27340323510_94f77f5374_m.jpg&quot; width=&quot;240&quot; alt=&quot;GeekOut Party&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://c3.staticflickr.com/8/7366/27518144042_3335da602d_c.jpg&quot; title=&quot;Tallin Sunset&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/27518144042/in/album-72157666992992284/&quot;&gt;&lt;img src=&quot;https://c3.staticflickr.com/8/7366/27518144042_3335da602d_m.jpg&quot; width=&quot;240&quot; alt=&quot;Tallin Sunset&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    My JHipster talk went well on Friday (&lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster-geekout-2016&quot;&gt;slides here&lt;/a&gt;)
    and my mom and I celebrated at &lt;a href=&quot;http://rataskaevu16.ee/&quot;&gt;Rataskaevu 16&lt;/a&gt; that
    evening. Then we shared laughs and
    learned how to play &lt;a href=&quot;http://jackbox.tv/&quot;&gt;jackbox.tv&lt;/a&gt; at ZeroTurnaround&apos;s post-conference party.
&lt;/p&gt;
&lt;p&gt;
    Our last night was spent in Helsinki, a 20-minute flight from Tallinn. Since my grandparents are Finnish, my mom
    delighted in hearing words from her youth along the streets. We both took advantage and relaxed in our hotel&apos;s roof
    top saunas too. We indulged in a food/wine-paired dinner over three hours that evening.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;https://www.flickr.com/photos/mraible/27518153982/in/album-72157666992992284/&quot; href=&quot;//c7.staticflickr.com/8/7342/27518153982_3ae4a9f774_c.jpg&quot; title=&quot;Homeward bound with a stop for a sauna and dinner in Helsinki&quot; rel=&quot;lightbox[devoxxuk-geekout-2016]&quot;&gt;&lt;img src=&quot;//c7.staticflickr.com/8/7342/27518153982_3ae4a9f774_n.jpg&quot; width=&quot;320&quot; alt=&quot;Homeward bound with a stop for a sauna and dinner in Helsinki&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Thanks to the organizers and good friends from Devoxx UK and GeekOut. We had a great time and are still smiling about
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157666992992284&quot;&gt;all our new memories&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;&lt;strong&gt;Update on June 20, 2016:&lt;/strong&gt; Devoxx UK has posted &lt;a href=&quot;https://www.youtube.com/channel/UCxIamwHotqAAdmecaKT9WpA&quot;&gt;a channel on YouTube&lt;/a&gt; with all of its sessions. You can view my &lt;a href=&quot;https://www.youtube.com/watch?v=T4zsanOnKtk&quot;&gt;Art of Angular&lt;/a&gt; talk or &lt;a href=&quot;https://www.youtube.com/watch?v=UKMn5UNaUM4&quot;&gt;Get Hip with JHipster&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/moving_appfuse_into_the_attic</guid>
    <title>Moving AppFuse into the Attic</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/moving_appfuse_into_the_attic</link>
        <pubDate>Thu, 28 Apr 2016 15:40:16 -0600</pubDate>
    <category>Java</category>
    <category>opensource</category>
    <category>appfuse</category>
    <category>attic</category>
    <category>java</category>
    <category>jhipster</category>
            <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/devoxx_france_2016_springtime_in</guid>
    <title>Devoxx France 2016: Springtime in Paris</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/devoxx_france_2016_springtime_in</link>
        <pubDate>Tue, 26 Apr 2016 07:13:18 -0600</pubDate>
    <category>Java</category>
    <category>infoq</category>
    <category>javascript</category>
    <category>java</category>
    <category>devoxxfr</category>
    <category>paris</category>
    <category>asciidoctor</category>
    <category>devoxx</category>
    <category>jhipster</category>
    <category>travel</category>
    <category>france</category>
    <category>angular2</category>
    <category>angularjs</category>
    <atom: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;</atom:summary>        <description>&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;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/devoxx_2015_a_java_hipster</guid>
    <title>Devoxx 2015: A Java Hipster Visits Belgium</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/devoxx_2015_a_java_hipster</link>
        <pubDate>Tue, 17 Nov 2015 00:09:43 -0700</pubDate>
    <category>Java</category>
    <category>mcginityphoto</category>
    <category>springboot</category>
    <category>devoxx</category>
    <category>beer</category>
    <category>belgium</category>
    <category>jhipster</category>
    <category>java</category>
    <category>angularjs</category>
    <category>bootstrap</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/google_s_mirror_of_maven</guid>
    <title>Google&apos;s Mirror of Maven Central 25% Faster</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/google_s_mirror_of_maven</link>
        <pubDate>Tue, 10 Nov 2015 00:13:51 -0700</pubDate>
    <category>Java</category>
    <category>dependencies</category>
    <category>googlecloudstorage</category>
    <category>mavencentral</category>
    <category>infoq</category>
    <category>maven</category>
            <description>&lt;p&gt;
Last week, &lt;a href=&quot;http://takari.io/2015/10/28/google-maven-central.html&quot;&gt;Takari announced that Google is Maven Central&apos;s New Best Friend&lt;/a&gt;. While writing a
    &lt;a href=&quot;http://www.infoq.com/news/2015/11/maven-central-at-google&quot;&gt;news article about this&lt;/a&gt; for
InfoQ, I decided to run a small test to see the speed of the default Maven Central versus the new Google Cloud Storage instance. This
micro benchmark didn&apos;t seem worthy of including in the article, but I think it&apos;s interesting to see the speed improvements I found.
&lt;/p&gt;
&lt;p&gt;
I ran &lt;code&gt;rm -rf ~/.m2/repository&lt;/code&gt;, then &lt;code&gt;mvn install&lt;/code&gt; with the default repository configured. I ran the commands again with
Google Cloud Storage. I found that the downloading of dependencies, compilation and running unit tests on
    &lt;a href=&quot;https://github.com/appfuse/appfuse/tree/master/web&quot;&gt;AppFuse&apos;s web projects&lt;/a&gt; averaged 4 minutes, 30 seconds.
With Google Cloud Storage, the same process averaged 3 minutes and 37 seconds. By my calculations, this means you speed up artifact resolution
for your Maven projects by 25% by switching to Google. To do that, create a &lt;code&gt;~/.m2/settings.xml&lt;/code&gt; file with
    the following contents.
    &lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;settings&amp;gt;
  &amp;lt;mirrors&amp;gt;
    &amp;lt;mirror&amp;gt;
      &amp;lt;id&amp;gt;google-maven-central&amp;lt;/id&amp;gt;
      &amp;lt;name&amp;gt;Google Maven Central&amp;lt;/name&amp;gt;
      &amp;lt;url&amp;gt;https://maven-central.storage.googleapis.com&amp;lt;/url&amp;gt;
      &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;
    &amp;lt;/mirror&amp;gt;
  &amp;lt;/mirrors&amp;gt;
&amp;lt;/settings&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Benchmark Details&lt;/strong&gt;&lt;br&gt;
My tests were run on a Mac Pro (late 2013)
with a 3.5 GHz 6-Core Intel Xeon E5 processor and 32 GB of RAM. Bandwidth speeds during this test averaged 57 Mbps down,
6 Mbps up. Below are the timing numbers (in minutes) from my test:
&lt;/p&gt;
&lt;pre&gt;
Default: 4:33, 4:36, 4:32, 4:24, 4:09
Google: 5:13, 3:35, 2:15, 3:38, 3:39
&lt;/pre&gt;
&lt;p&gt;Google had some wide variances in its results, with five minutes and two minutes. Because of this, I dropped the
low and high numbers for each service before calculating the average. My math with raw numbers is below.
&lt;/p&gt;
&lt;pre&gt;
Default:
273, 276, 272, 264, 213 = 260, 4:20
276, 272, 264 = 270, 4:30

Google:
313, 215, 135, 218, 219 = 220, 3.66 = 3:40
215, 218, 219 = 3:37
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://www.infoq.com/news/2015/11/maven-central-at-google#anch129463&quot;&gt;Chen Eric commented on the InfoQ article&lt;/a&gt;
    to note that Chinese programmers are blocked from using Google.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Jason Swank of Sonatype has done some more extensive benchmarking and &lt;a href=&quot;//raibledesigns.com/rd/entry/google_s_mirror_of_maven#comment-1447442881000&quot;&gt;found different results&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
We found that average unprimed Google API (first mvn run) caching performed 30% slower than Maven Central. Primed Google API cache performance (second run) was 3% faster then Maven Central (second run). We also ran a number of cloud-based tests with similar results.
&lt;/blockquote&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_jhipster_mini_book_how</guid>
    <title>The JHipster Mini-Book: How We Did It and What&apos;s Next</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_jhipster_mini_book_how</link>
        <pubDate>Tue, 3 Nov 2015 10:13:40 -0700</pubDate>
    <category>Java</category>
    <category>html5</category>
    <category>infoq</category>
    <category>epub</category>
    <category>book</category>
    <category>pdf</category>
    <category>asciidoctor</category>
    <category>gradle</category>
    <category>browsersync</category>
    <category>mobi</category>
    <category>jhipster</category>
    <atom:summary type="html">&lt;p&gt;
&lt;a href=&quot;http://www.infoq.com/minibooks/jhipster-mini-book&quot;&gt;
&lt;img src=&quot;http://www.infoq.com/resource/minibooks/jhipster-mini-book/en/cover/Cover.jpg&quot; alt=&quot;The JHipster Mini-Book&quot; width=&quot;150&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
Last Friday, the &lt;a href=&quot;http://www.infoq.com/minibooks/jhipster-mini-book&quot;&gt;JHipster Mini-Book was published on
    InfoQ&lt;/a&gt;. I wrote about this milestone on the &lt;a
    href=&quot;http://www.jhipster-book.com/#!/news/entry/jhipster-mini-book-released&quot;&gt;book&apos;s blog&lt;/a&gt;. I&apos;m
    pumped to see this release happen, and I&apos;d like to give you a behind-the-scenes peak at how it went from idea to production.
&lt;/p&gt;
&lt;p id=&quot;the-idea&quot;&gt;&lt;strong&gt;The Idea&lt;/strong&gt;&lt;br&gt;
    At the end of last year, I wrote down my goals for 2015:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;21 Point Fitness App&lt;/li&gt;
    &lt;li&gt;JHipster Mini Book (InfoQ)&lt;/li&gt;
    &lt;li&gt;Finish Bus&lt;/li&gt;
    &lt;li&gt;New House&lt;/li&gt;
    &lt;li&gt;Good Blood Pressure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My reason for wanting to write a JHipster Mini-Book was simple: I knew AngularJS, Bootstrap and Spring Boot quite
    well. I&apos;d used them on several projects and I really liked how &lt;a href=&quot;http://jhipster.org&quot;&gt;JHipster&lt;/a&gt; married them all together. I often ran into
    people that used these technologies, but hadn&apos;t heard of JHipster. I was hoping to make more people aware of the
    project and market my development skills at the same time.
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
&lt;a href=&quot;http://www.infoq.com/minibooks/jhipster-mini-book&quot;&gt;
&lt;img src=&quot;http://www.infoq.com/resource/minibooks/jhipster-mini-book/en/cover/Cover.jpg&quot; alt=&quot;The JHipster Mini-Book&quot; width=&quot;150&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
Last Friday, the &lt;a href=&quot;http://www.infoq.com/minibooks/jhipster-mini-book&quot;&gt;JHipster Mini-Book was published on
    InfoQ&lt;/a&gt;. I wrote about this milestone on the &lt;a
    href=&quot;http://www.jhipster-book.com/#!/news/entry/jhipster-mini-book-released&quot;&gt;book&apos;s blog&lt;/a&gt;. I&apos;m
    pumped to see this release happen, and I&apos;d like to give you a behind-the-scenes peak at how it went from idea to production.
&lt;/p&gt;
&lt;p id=&quot;the-idea&quot;&gt;&lt;strong&gt;The Idea&lt;/strong&gt;&lt;br&gt;
    At the end of last year, I wrote down my goals for 2015:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;21 Point Fitness App&lt;/li&gt;
    &lt;li&gt;JHipster Mini Book (InfoQ)&lt;/li&gt;
    &lt;li&gt;Finish Bus&lt;/li&gt;
    &lt;li&gt;New House&lt;/li&gt;
    &lt;li&gt;Good Blood Pressure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My reason for wanting to write a JHipster Mini-Book was simple: I knew AngularJS, Bootstrap and Spring Boot quite
    well. I&apos;d used them on several projects and I really liked how &lt;a href=&quot;http://jhipster.org&quot;&gt;JHipster&lt;/a&gt; married them all together. I often ran into
    people that used these technologies, but hadn&apos;t heard of JHipster. I was hoping to make more people aware of the
    project and market my development skills at the same time.
&lt;/p&gt;
&lt;p&gt;The first step to accomplishing a goal is writing it down. After writing it down and sharing with friends, I sent
    an email to &lt;a href=&quot;http://www.infoq.com/author/Charles-Humble&quot;&gt;Charles Humble&lt;/a&gt;, InfoQ&apos;s Head of Editorial, in
    early January. Charles directed me to InfoQ&apos;s internal mini-book guide and recommended I create an outline and talk to the
    project owners. It took me six weeks before I created an outline and sent it to
    &lt;a href=&quot;http://www.julien-dubois.com/&quot;&gt;Julien Dubois&lt;/a&gt;. We went back-and-forth on the outline for a while and
    finalized it around the beginning of April.
&lt;/p&gt;
&lt;p&gt;
    On April 8, I delivered a &lt;a href=&quot;//raibledesigns.com/rd/entry/getting_hip_with_jhipster_at&quot;&gt;talk on JHipster&lt;/a&gt;
    at Denver&apos;s Java Users Group and announced I was writing the book.
&lt;/p&gt;

&lt;p id=&quot;asciidoctor&quot;&gt;&lt;strong&gt;The Development Process&lt;/strong&gt;&lt;br&gt;
    Early on, I&apos;d decided I wanted to write the book with AsciiDoc and build it with &lt;a href=&quot;http://asciidoctor.org/&quot;&gt;Asciidoctor&lt;/a&gt;.
    I did receive some slight push back (to use Google Docs) from InfoQ, but they were mostly supportive. Their biggest
    concern was getting it into a desktop publishing program and formatting it to fit their style. I have an email that
    says &quot;this is going to be the most expensive book we&#8217;ve ever produced!&quot;.
&lt;/p&gt;
&lt;p&gt;
    I chose Asciidoctor because I wanted to run the book development and publishing process like an open source project.
    I also found its ability to import source code quite handy. I used the &lt;a href=&quot;https://github.com/asciidoctor/asciidoctor-gradle-examples&quot;&gt;
    asciidoctor-gradle-examples project&lt;/a&gt; as a starting point, specifically the &lt;a href=&quot;https://github.com/asciidoctor/asciidoctor-gradle-examples/tree/master/asciidoc-to-all-example&quot;&gt;
    asciidoctor-to-all-example&lt;/a&gt;. I hadn&apos;t used Gradle on a project before, so I was motivated to learn it. Now that I think of it,
    I never even bothered to research how to use Asciidoctor with Maven. &lt;/p&gt;
&lt;p&gt;
    I used JIRA in the cloud ($20/month) to create tasks, organize sprints and track my progress. I broke things down by chapter,
    starting with the &lt;em&gt;UI components&lt;/em&gt; section, followed by &lt;em&gt;Building an app&lt;/em&gt;, and &lt;em&gt;API building blocks&lt;/em&gt;.
    I used the outline of the book to create my tasks. I gave myself a couple weeks for each chapter, but it ended up
    taking about a month each. I wrote the preface, introduction and everything else after the main content had been
    tech edited and was being copy edited.
&lt;/p&gt;
&lt;p&gt;
    I created a private repository on &lt;a href=&quot;https://bitbucket.org/&quot;&gt;Bitbucket&lt;/a&gt; to host the book&apos;s source control in Git.
    The only reason I chose Bitbucket over GitHub was because Bitbucket offers free private repositories. It&apos;s a shame
    they have &lt;a href=&quot;https://bitbucket.org/site/master/issues/7132/render-asciidoc-files-bb-1913#comment-22554834&quot;&gt;
    no plans to build a custom renderer for AsciiDoc&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    I wrote the book using IntelliJ IDEA and used a combination of &lt;code&gt;./gradlew watch&lt;/code&gt; and Grunt with
    &lt;a href=&quot;http://browsersync.io&quot;&gt;Browsersync&lt;/a&gt; to refresh my browser when changes were made.
&lt;/p&gt;
&lt;p id=&quot;tech-editing&quot;&gt;&lt;strong&gt;Tech Editing&lt;/strong&gt;&lt;br&gt;
    I sent my tech editors, &lt;a href=&quot;https://twitter.com/sharpedennis&quot;&gt;Dennis Sharpe&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/kileniklawski&quot;&gt;Kile Niklawski&lt;/a&gt;,
    emails when I finished with a chapter. I gave them access to the book&apos;s repo, as well as the sample application&apos;s repo, and
    detailed how to access them. I made sure and documented how to build both projects in their README files. I asked
    Dennis and Kile to enter issues, or create branches and pull requests when they found problems. They entered a few issues on the first
    chapter, but responded via email after that. They didn&apos;t find many issues, so this process was good enough for me.
&lt;/p&gt;

&lt;p id=&quot;copy-editing&quot;&gt;&lt;strong&gt;Copy Editing&lt;/strong&gt;&lt;br&gt;
    Lawrence Nyveen copy-edited the book and was gracious enough to try my recommended process:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Checkout the source code of the book from Git.&lt;/li&gt;
    &lt;li&gt;Create a branch, make changes.&lt;/li&gt;
    &lt;li&gt;Publish the branch, create a pull request.&lt;/li&gt;
    &lt;li&gt;Have a conversation about the changes on the pull request, make more changes, merge pull request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This process seemed to work very well and Laurie quickly learned how to work with Git. We both
used &lt;a href=&quot;http://asciidocfx.com/&quot;&gt;AsciidocFX&lt;/a&gt; to edit and make changes. We used comments in the book&apos;s
code to ask questions to each other. AsciidocFX worked quite well, though we did find we needed to add
&lt;code&gt;:imagesdir: images&lt;/code&gt; to chapter headers to get them to render images. Having problems with image
rendering was not new, I had to create a symlink in the &lt;em&gt;chapters&lt;/em&gt; directory to the images directory
above it to get images to render in EPUB.
&lt;/p&gt;
&lt;p&gt;From the time Laurie started copy editing until he was finished was only a couple weeks.
&lt;/p&gt;

&lt;p id=&quot;publishing&quot;&gt;&lt;strong&gt;Publishing&lt;/strong&gt;&lt;br&gt;
    As I mentioned earlier, making the output look like InfoQ&apos;s mini-books was one of the biggest concerns with this book.
    InfoQ wanted to take the HTML (or PDF) version of the book, feed it into their desktop publishing program, and
    publish from there. I expressed my concerns in an email:
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
    The JHipster project moves pretty fast, so it&apos;ll probably be a lot of work to pump out releases as quickly as they do. 
    It&apos;s probably better to do a release per quarter with updated material. If you&apos;re going to reformat it every time we do a
    release, that could create a lot of work.
&lt;/blockquote&gt;
&lt;p&gt;They agreed and mentioned the output from Asciidoctor was looking pretty good. They asked if I could make it match
the standard InfoQ look and feel. I did some research, found out it
    &lt;a href=&quot;//raibledesigns.com/rd/entry/customizing_an_asciidoctor_pdf_so&quot;&gt;might be possible&lt;/a&gt;, and
    &lt;a href=&quot;//raibledesigns.com/rd/entry/re_customizing_an_asciidoctor_pdf&quot;&gt;went to work&lt;/a&gt;. It took me a week of
    research and a week of trial-and-error to produce the &lt;a href=&quot;http://www.infoq.com/minibooks/jhipster-mini-book&quot;&gt;
    final product&lt;/a&gt;.
&lt;/p&gt;

&lt;p id=&quot;next&quot;&gt;&lt;strong&gt;What&apos;s Next?&lt;/strong&gt;&lt;br&gt;
    The good news is the first (1.0) version of the book is in production. I have not published
    &lt;a href=&quot;http://www.21-points.com/&quot;&gt;21-Points Health&lt;/a&gt; (the example application
    for the book) as an open source project, but I may in the future. For now, I hope to do my best to keep the book (and the app) 
    up-to-date with JHipster releases. That may prove difficult, but we&apos;ll see.
&lt;/p&gt;
&lt;p&gt;
    One of the things I recommend in the book is to follow &lt;a href=&quot;https://github.com/johnpapa/angular-styleguide&quot;&gt;John Papa&apos;s Angular Style Guide&lt;/a&gt;.
    A recent &lt;a href=&quot;https://github.com/jhipster/generator-jhipster/pull/2256&quot;&gt;pull request&lt;/a&gt; does this for JHipster. I think this is an
    excellent enhancement, but it&apos;d also require me to rewrite many of the JavaScript sections of the book. It sounds like a daunting task,
    but at least it&apos;s a mini-book!
&lt;/p&gt;
&lt;p&gt;
    If you have any questions, comments or suggestions about writing with Asciidoctor or publishing with InfoQ, send them my way.
    My fastest responses will likely come from Twitter (&lt;a href=&quot;https://twitter.com/jhipster-book&quot;&gt;@jhipster_book&lt;/a&gt; or
    &lt;a href=&quot;https://twitter.com/mraible&quot;&gt;@mraible&lt;/a&gt;). You can also leave a comment here, on &lt;a href=&quot;http://www.jhipster-book.com&quot;&gt;jhipster-book.com&lt;/a&gt;,
    or post a question on Stack Overflow with the &quot;jhipster-mini-book&quot; tag.
&lt;/p&gt;
&lt;p&gt;P.S. If you live in Denver, there&apos;s a &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/221213046/&quot;&gt;presentation on Asciidoctor&lt;/a&gt; by
    &lt;a href=&quot;https://twitter.com/tlberglund&quot;&gt;Tim Berglund&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/cojorado&quot;&gt;Cara Jo Miller&lt;/a&gt; tonight. I&apos;ll also be talking about
    &lt;a href=&quot;http://cfp.devoxx.be/2015/talk/KGX-5093/Get_Hip_with_JHipster:_Spring_Boot_+_AngularJS_+_Bootstrap&quot;&gt;JHipster at Devoxx&lt;/a&gt; next Wednesday.&lt;/p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/springone_2gx_2015_my_presentations</guid>
    <title>SpringOne 2GX 2015: My Presentations on Comparing Hot JavaScript Frameworks and NoXML </title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/springone_2gx_2015_my_presentations</link>
        <pubDate>Sun, 20 Sep 2015 12:29:00 -0600</pubDate>
    <category>Java</category>
    <category>xml</category>
    <category>springframework</category>
    <category>javascript</category>
    <category>s2gx</category>
    <category>emberjs</category>
    <category>angularjs</category>
    <category>noxml</category>
    <category>springone2gx</category>
    <category>reactjs</category>
            <description>Last week, I had the pleasure of traveling to Washington, DC to speak at the annual &lt;a href=&quot;http://www.springone2gx.com/&quot;&gt;SpringOne 2GX conference&lt;/a&gt;. I was pretty stressed for the last few weeks because I had to create two new presentations from scratch, and both had to be 90 minutes long. I was also hoping to finish the JHipster Book before the conference started. I was able to finish both presentations in the nick of time, but did not find the time to write the last chapter in the JHipster Book.&lt;/p&gt;
&lt;p&gt;The first presentation was titled &lt;a href=&quot;https://2015.event.springone2gx.com/schedule/sessions/comparing_hot_javascript_frameworks_angularjs_ember_js_and_react_js.html&quot;&gt;Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js&lt;/a&gt;. I started by revisiting the &lt;a href=&quot;//raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at&quot;&gt;Comparing JVM Web Frameworks talk I did at vJUG&lt;/a&gt; last February. I explained how I think traditional web frameworks are no longer relevant in 2015, but I do believe server-side rendering is still &lt;em&gt;very&lt;/em&gt; relevant. From there, I used &lt;a href=&quot;http://www.ybrikman.com/&quot;&gt;Yevgeniy Brikman&#8217;s&lt;/a&gt; framework scorecard (from his &lt;a href=&quot;http://www.slideshare.net/brikis98/nodejs-vs-play-framework&quot;&gt;Node.js vs. Play Framework presentation&lt;/a&gt;) to rank each framework by a number of different criteria. You can see the final results on &lt;a href=&quot;http://www.slideshare.net/mraible/comparing-hot-javascript-frameworks-angularjs-emberjs-and-reactjs-springone-2gx-2015/160&quot;&gt;slide 160&lt;/a&gt;. Since the scores were so close, I believe you could tweak some scores a bit (or add weights to the different criteria) and make any of the frameworks come out on top.
&lt;/p&gt;
&lt;p&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;//www.slideshare.net/mraible/comparing-hot-javascript-frameworks-angularjs-emberjs-and-reactjs-springone-2gx-2015&quot;&gt;see 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/NGLRPcZiLF0pBo&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; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I started writing the second presentation a week before I had to deliver it. On Thursday, September 10th, I stayed up late, trying to figure out how to create a good presentation on NoXML &lt;em&gt;and&lt;/em&gt; finish the last part of the JHipster Book. Then it came to me, I needed to &lt;em&gt;parallelize&lt;/em&gt; and do them both at the same time. I decided to compare AppFuse (which is similar to a legacy Spring application with lots of XML) to JHipster (which hardly contains any XML). 
&lt;/p&gt;
&lt;p&gt;
I wrote a 10-page Google Doc on how I planned to do this, then went rafting and camping with my family for the weekend. I finished most of the presentation on Monday night, but then realized the presentation wouldn&apos;t be long enough to fill 90 minutes. So I hunkered down at midnight, created a new AppFuse application and removed a bunch of its XML. This took me until 3:30am, and I was able to accomplish the following tasks:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring XML to Java&lt;/li&gt;
&lt;li&gt;Spring Security Configuration to Java&lt;/li&gt;
&lt;li&gt;web.xml to WebApplicationInitializer&lt;/li&gt;
&lt;li&gt;Spring MVC to Java&lt;/li&gt;
&lt;li&gt;Migrated to Spring Boot&lt;/li&gt;
&lt;li&gt;Maven to Groovy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;p&gt;I was pretty pumped when I completed my final goal: converting to Spring Boot and getting a test to pass. I made commits to an &lt;a href=&quot;https://github.com/mraible/appfuse-noxml/commits/master&quot;&gt;appfuse-noxml project on GitHub&lt;/a&gt; as I accomplished each step. You can see all the changes in &lt;a href=&quot;https://github.com/mraible/appfuse-noxml/commits/master&quot;&gt;the project&apos;s commit log&lt;/a&gt;. While I&apos;d figured everything out, I still needed to complete the presentation. Luckily, I found time to do this the night before, the morning of, and in the final hour before I had to deliver the talk. You can imagine my relief when I was done delivering both talks. 
&lt;/p&gt;
&lt;p&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;//www.slideshare.net/mraible/noxml-eliminating-xml-in-spring-projects-springone-2gx-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/4V9V7NSsNC2rd7&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; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt; 
&lt;/div&gt;
&lt;p&gt;While I didn&apos;t get to spend much time at the conference, I did have a lot of fun while I was there. I got to meet some new folks, reconnect with old friends, and enjoy beers and dinner with a smiling crew on Thursday night. The Broncos victory late that night was the icing on the cake. &lt;img src=&quot;//raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot;&gt;&lt;/p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/minecraft_modding_at_denver_s</guid>
    <title>Minecraft Modding at Denver&apos;s Devoxx4Kids</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/minecraft_modding_at_denver_s</link>
        <pubDate>Wed, 19 Aug 2015 08:41:52 -0600</pubDate>
    <category>Java</category>
    <category>arungupta</category>
    <category>devoxx4kids</category>
    <category>minecraft</category>
    <category>adityagupta</category>
    <category>aws</category>
    <category>simonmaple</category>
    <category>vjug</category>
            <description>&lt;p&gt;
    &lt;a href=&quot;https://farm1.staticflickr.com/576/20697432892_537f90586b_c.jpg&quot; rel=&quot;lightbox[devoxx4kids-denver]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20697432892/&quot; title=&quot;Devoxx4Kids Denver: Minecraft Modding&quot;&gt;
        &lt;img src=&quot;https://farm1.staticflickr.com/576/20697432892_537f90586b_m.jpg&quot; width=&quot;135&quot; alt=&quot;Devoxx4Kids Denver: Minecraft Modding&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    Last weekend, &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/&quot;&gt;Denver&apos;s Devoxx4Kids&lt;/a&gt; gathered at
    &lt;a href=&quot;http://www.tuliva.com/&quot;&gt;Tuliva&lt;/a&gt; to learn about &lt;a
        href=&quot;http://www.meetup.com/virtualJUG/events/224283882/&quot;&gt;Modding Minecraft&lt;/a&gt;. Several kids (ages 7-15) were
    introduced to programming Java by the founder of &lt;a href=&quot;http://www.devoxx4kids.org/usa/&quot;&gt;Devoxx4Kids USA&lt;/a&gt;,
    &lt;a href=&quot;http://blog.arungupta.me/&quot;&gt;Arun Gupta&lt;/a&gt;, and his son, &lt;a href=&quot;https://twitter.com/aditya_g&quot;&gt;Aditya&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
They used Java 8, Eclipse, &lt;a
        href=&quot;http://files.minecraftforge.net/&quot;&gt;Minecraft Forge&lt;/a&gt; and to show you how to create mods that could give
    you potatoes, skeleton cows, and even launch into different dimensions. The skeleton war was a big hit too. We had a
    record turnout at this event, and the space was fabulous. The live broadcast from &lt;a href=&quot;http://virtualjug.com/&quot;&gt;vJUG&lt;/a&gt;
    went very smoothly and Tuliva&apos;s large screen and sound served us well. It was pretty sweet when we got shout-outs
    from the vJUG crew too!
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;https://www.flickr.com/photos/mraible/20519166140/in/album-72157655149286063/&quot; rel=&quot;lightbox[devoxx4kids-denver]&quot; href=&quot;https://farm6.staticflickr.com/5800/20519166140_ca90c0ce68_c.jpg&quot; title=&quot;Thanks for the great space Tuliva!&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5800/20519166140_ca90c0ce68_m.jpg&quot; width=&quot;240&quot; alt=&quot;Thanks for the great space Tuliva!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;a data-href=&quot;https://www.flickr.com/photos/mraible/20697884192/in/album-72157655149286063/&quot; title=&quot;Watching Arun and Aditya on vJUG&quot; rel=&quot;lightbox[devoxx4kids-denver]&quot; href=&quot;https://farm6.staticflickr.com/5778/20697884192_26fd617874_c.jpg&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5778/20697884192_26fd617874_m.jpg&quot; width=&quot;240&quot;  alt=&quot;Watching Arun and Aditya on vJUG&quot; style=&quot;margin-left: 30px; border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/sjmaple&quot;&gt;Simon Maple&lt;/a&gt; wrote a &lt;a
    href=&quot;http://zeroturnaround.com/rebellabs/getting-started-with-minecraft-modding-by-aditya-and-arun-gupta/&quot;&gt;great
    summary of the session&lt;/a&gt; that includes the video we watched, as well as an interview with Arun and Aditya. Take a look at Devoxx4Kid&apos;s &lt;a
    href=&quot;http://minecraftmodding.org&quot;&gt;Minecraft Modding Tutorial&lt;/a&gt; if you&apos;d like to see what we learned. &lt;/p&gt;
&lt;p&gt;We did run into a couple issues while trying to follow along. The first was that the virtual machines we were using
    wouldn&apos;t run the Minecraft client. The error we saw was:&lt;/p&gt;
&lt;pre&gt;
org.lwjgl.LWJGLException: Pixel format not accelerated&lt;/pre&gt;
&lt;p&gt;We later learned from Arun that virtual machines were an issue and it&apos;s better to use Forge on a local machine. The
    second issue we ran into was when folks tried to build Forge from source, they got a 500 error when it tried to
    download http://export.mcpbot.bspk.rs/versions.json. We later learned that the firewall was blocking
    it.&lt;/p&gt;
&lt;p&gt;Despite these issues, I believe the kids learned a lot by watching the vJUG broadcast. I spoke with some parents that got things working in the class, as well as a few that tried it when they got home. After the modding session, I showed the class how to &lt;a
        href=&quot;//raibledesigns.com/rd/entry/setting_up_a_minecraft_server&quot;&gt;create a Minecraft Server on AWS&lt;/a&gt;. I
    also did some research to see if you could automate the server creation. I quickly landed on &lt;a
        href=&quot;http://www.offermann.us/&quot;&gt;Thomas Offermann&apos;s site&lt;/a&gt; and his tutorials:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.offermann.us/2013/08/introduction-to-minecloud.html&quot;&gt;Introducing Minecloud&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.offermann.us/2013/08/running-minecraft-on-amazon-ec2.html&quot;&gt;Running Minecraft on Amazon
        EC2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.offermann.us/2013/09/the-minecloud-web-app.html&quot;&gt;The Minecloud Web App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Thomas created a couple GitHub projects: one to &lt;a href=&quot;https://github.com/toffer/minecloud-ami&quot;&gt;setup a
    Minecraft server on AWS&lt;/a&gt;, as well as a &lt;a href=&quot;https://github.com/toffer/minecloud&quot;&gt;webapp that you can
    start/stop it with&lt;/a&gt;. I haven&apos;t tried either project yet, but I hope to soon.
&lt;/p&gt;
&lt;p&gt;Thanks to all the Denver kids and parents that joined us last weekend! The &lt;a href=&quot;http://www.tuliva.com/&quot;&gt;Tuliva&lt;/a&gt; facilities were spacious and
    comfortable. We owe them a big thanks for sponsoring &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/&quot;&gt;Devoxx4Kids Denver&lt;/a&gt;! We
    hope to do another workshop this fall, possibly on &lt;a href=&quot;https://www.raspberrypi.org/&quot;&gt;Raspberry Pi&lt;/a&gt;.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/how_do_i_become_a</guid>
    <title>How do I become a programmer?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/how_do_i_become_a</link>
        <pubDate>Thu, 13 Aug 2015 08:32:43 -0600</pubDate>
    <category>Java</category>
    <category>learning</category>
    <category>computerscience</category>
    <category>job</category>
    <category>programmer</category>
    <category>computers</category>
    <category>career</category>
    <category>developer</category>
            <description>&lt;p&gt;Yesterday, I received a message from a friend, asking about how to become a programmer. It&apos;s not the first time I&apos;ve been asked this. In fact, this summer I&apos;ve been asked by several friends how to get into the field. It seems that as people grow older, they see the lifestyle of working remotely and enjoying their job as an attractive thing to do. In yesterday&apos;s case, this friend is a mom that now has her days free because all her kids are in school. Here&apos;s what she wrote:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Now that my girls are both in school full day, I&apos;ve been thinking about taking some programming classes. It&apos;s something I started to do while I was working at [ABC Company], but obviously didn&apos;t pursue once I quit to have kids. I&apos;m thinking of getting my MIS in web development or specializing in designing apps if that&apos;s even a thing? Anyway, what languages would you recommend I concentrate on? JavaScript, Python? Lastly, is there a particular school you would recommend? I can&apos;t afford DU on my stay-at-home-mom salary, or even Regis which is where I started when I was getting tuition reimbursement. I was hoping I could do most of my education online while the kids are in school? Any advice or words of wisdom would be greatly appreciated! &lt;/p&gt;
&lt;p&gt;Since this is a common question I see, I figured I&apos;d publish my answers here, and get some advice from y&apos;all too. Here&apos;s my response:&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
Python would definitely be good, as would JavaScript. JavaScript can be done on the client and server these days, so you could do that and be able to do front-end and backend development. 
&lt;/p&gt;
&lt;p&gt;
For programming specifically, I&apos;ve heard these guys have a good JavaScript course: &lt;a href=&quot;https://www.codecademy.com/&quot;&gt;https://www.codecademy.com&lt;/a&gt;. Here&apos;s how to get started with Python in eight weeks: &lt;a href=&quot;http://lifehacker.com/how-i-taught-myself-to-code-in-eight-weeks-511615189&quot;&gt;http://lifehacker.com/how-i-taught-myself-to-code-in-eight-weeks-511615189&lt;/a&gt;. And one of my favorites: &lt;a href=&quot;http://programming-motherfucker.com/become.html&quot;&gt;http://programming-motherfucker.com/become.html&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I&apos;ve taken a Scala course from Coursera, it was hard and intense, but I learned a lot. They have lots of courses and give you certifications you can put on your LinkedIn profile: &lt;a href=&quot;https://www.coursera.org/&quot;&gt;https://www.coursera.org&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I&apos;ve also recommended &lt;a href=&quot;https://teamtreehouse.com&quot;&gt;https://teamtreehouse.com&lt;/a&gt; to folks and &lt;a href=&quot;https://www.khanacademy.org/&quot;&gt;https://www.khanacademy.org&lt;/a&gt; has always been good, even for kids.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
Ultimately, the best way to learn to code is by doing. It&apos;s definitely good to study, learn and practice, but it&apos;ll probably won&apos;t sink in and become real knowledge until you&apos;re getting paid to do it. With the plethora of high-priced programmers out there, you can likely find a junior position, show a willingness to learn and come up to speed quickly. If you can couple that with a remote position, I think you&apos;ll really enjoy yourself.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Her response was interesting, as she thought she might need a &lt;abbr title=&quot;Computer Science&quot;&gt;CS&lt;/abbr&gt; degree to even get a programming job.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Coincidentally I looked over many of these coding sites yesterday but wasn&apos;t sure if I needed an accredited diploma. It sounds like it&apos;s more important that I just get some experience.&lt;/p&gt;
&lt;p&gt;From my experience, a college degree matters, but not a CS degree. I told her people skills make programmers stand out and she&apos;s a witty person that certainly has those. What&apos;s your advice as a programmer? What would you tell people to do if they want to break into the field?&lt;/p&gt;
&lt;p&gt;More importantly, if you&apos;re on the hiring side, what would it take for you to hire a 40-something person with no programming background? If they&apos;ve been studying for six months and have really good people skills, would you hire them for a junior position?&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/setting_up_a_minecraft_server</guid>
    <title>Setting up a Minecraft Server in the Cloud</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/setting_up_a_minecraft_server</link>
        <pubDate>Wed, 5 Aug 2015 15:03:00 -0600</pubDate>
    <category>Java</category>
    <category>minecraft</category>
    <category>minecraftserver</category>
    <category>amazon</category>
    <category>aws</category>
    <category>linux</category>
    <category>cloud</category>
    <atom:summary type="html">&lt;p&gt;
&lt;a href=&quot;https://minecraft.net&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/minecraft-logo.png&quot; alt=&quot;Minecraft&quot; width=&quot;300&quot; class=&quot;picture&quot; style=&quot;margin-top: -10px&quot;&gt;&lt;/a&gt;
My 10-year-old son, Jack, is a huge fan of &lt;a href=&quot;https://minecraft.net/&quot;&gt;Minecraft&lt;/a&gt;. If you let him,
    he&apos;d play all day, skipping meals and having a blast. It&apos;s most fun to hear him playing with his sister or
    his best friend. I&apos;m amazed it&apos;s captured his attention for so long; well over two years. Both my kids loved it when
    Scott Davis taught a &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver&quot;&gt;Devoxx4Kids Denver&lt;/a&gt; class on
    &lt;a href=&quot;//raibledesigns.com/rd/entry/first_devoxx4kids_in_denver_a&quot;&gt;Server-side Minecraft programming&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;We haven&apos;t had any &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/&quot;&gt;Devoxx4Kids Denver&lt;/a&gt; workshops this year,
    but that&apos;s about to change. First of all, I&apos;m happy to announce we&apos;re working with the
    &lt;a href=&quot;http://rmoug.com&quot;&gt;Rocky Mountain Oracle Users Group&lt;/a&gt; to have a
    &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/messages/boards/thread/49148693&quot;&gt;Day of Family Coding Fun at
        Elitch Gardens&lt;/a&gt; this Friday. There will be a workshop on Raspberry Pi and I&apos;ll be doing a demonstration
    on how to setup a Minecraft Server in the cloud. Next weekend, we&apos;ll be doing a more in-depth Minecraft Workshop at Devoxx4Kids Denver. If you&apos;d like to join us &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/224431746/&quot;&gt;please RSVP&lt;/a&gt;.

Since having your own Minecraft Server is a fun thing for kids,
    and useful for parents, I figured I&apos;d document how to do it here.&lt;/p&gt;

&lt;p&gt;
    First of all, let me say that I&apos;m standing on the shoulders of giants. When I first setup a Minecraft server, I used
    Ben Garton&apos;s &lt;a href=&quot;http://www.blog.gartonhill.com/setting-up-a-free-minecraft-server-in-the-cloud-part-1/&quot;&gt;
    Setting up a free Minecraft server in the cloud - part 1&lt;/a&gt; as well as
    &lt;a href=&quot;http://www.blog.gartonhill.com/setting-up-a-free-minecraft-server-in-the-cloud-part-2/&quot;&gt;
        part 2&lt;/a&gt; and &lt;a href=&quot;http://www.blog.gartonhill.com/upgrading-your-minecraft-ec2-cloud-server-and-save-money/&quot;&gt;3&lt;/a&gt;.
    I also found Aaron Bell&apos;s &lt;a href=&quot;http://www.aaronbell.com/how-to-run-a-minecraft-server-on-amazon-ec2/&quot;&gt;
    How to run a Minecraft server on Amazon EC2&lt;/a&gt; to be quite useful.
&lt;/p&gt;
&lt;p&gt;Without further ado, here&apos;s you how to setup a Minecraft Server on Amazon Web Services (AWS) in 2015!&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
&lt;a href=&quot;https://minecraft.net&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/minecraft-logo.png&quot; alt=&quot;Minecraft&quot; width=&quot;300&quot; class=&quot;picture&quot; style=&quot;margin-top: -10px&quot;&gt;&lt;/a&gt;
My 10-year-old son, Jack, is a huge fan of &lt;a href=&quot;https://minecraft.net/&quot;&gt;Minecraft&lt;/a&gt;. If you let him,
    he&apos;d play all day, skipping meals and having a blast. It&apos;s most fun to hear him playing with his sister or
    his best friend. I&apos;m amazed it&apos;s captured his attention for so long; well over two years. Both my kids loved it when
    Scott Davis taught a &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver&quot;&gt;Devoxx4Kids Denver&lt;/a&gt; class on
    &lt;a href=&quot;//raibledesigns.com/rd/entry/first_devoxx4kids_in_denver_a&quot;&gt;Server-side Minecraft programming&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;We haven&apos;t had any &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/&quot;&gt;Devoxx4Kids Denver&lt;/a&gt; workshops this year,
    but that&apos;s about to change. First of all, I&apos;m happy to announce we&apos;re working with the
    &lt;a href=&quot;http://rmoug.com&quot;&gt;Rocky Mountain Oracle Users Group&lt;/a&gt; to have a
    &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/messages/boards/thread/49148693&quot;&gt;Day of Family Coding Fun at
        Elitch Gardens&lt;/a&gt; this Friday. There will be a workshop on Raspberry Pi and I&apos;ll be doing a demonstration
    on how to setup a Minecraft Server in the cloud. Next weekend, we&apos;ll be doing a more in-depth Minecraft Workshop at Devoxx4Kids Denver. If you&apos;d like to join us &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/224431746/&quot;&gt;please RSVP&lt;/a&gt;.

Since having your own Minecraft Server is a fun thing for kids,
    and useful for parents, I figured I&apos;d document how to do it here.&lt;/p&gt;

&lt;p&gt;
    First of all, let me say that I&apos;m standing on the shoulders of giants. When I first setup a Minecraft server, I used
    Ben Garton&apos;s &lt;a href=&quot;http://www.blog.gartonhill.com/setting-up-a-free-minecraft-server-in-the-cloud-part-1/&quot;&gt;
    Setting up a free Minecraft server in the cloud - part 1&lt;/a&gt; as well as
    &lt;a href=&quot;http://www.blog.gartonhill.com/setting-up-a-free-minecraft-server-in-the-cloud-part-2/&quot;&gt;
        part 2&lt;/a&gt; and &lt;a href=&quot;http://www.blog.gartonhill.com/upgrading-your-minecraft-ec2-cloud-server-and-save-money/&quot;&gt;3&lt;/a&gt;.
    I also found Aaron Bell&apos;s &lt;a href=&quot;http://www.aaronbell.com/how-to-run-a-minecraft-server-on-amazon-ec2/&quot;&gt;
    How to run a Minecraft server on Amazon EC2&lt;/a&gt; to be quite useful.
&lt;/p&gt;
&lt;p&gt;Without further ado, here&apos;s you how to setup a Minecraft Server on Amazon Web Services (AWS) in 2015!&lt;/p&gt;
&lt;div id=&quot;step1&quot;&gt;
    &lt;p&gt;&lt;strong&gt;Step 1: Signup for AWS and Create an Instance&lt;/strong&gt;&lt;/p&gt;
    &lt;ol&gt;
        &lt;li&gt;Navigate to &lt;a href=&quot;http://aws.amazon.com/&quot;&gt;http://aws.amazon.com/&lt;/a&gt;,
            and click &quot;Sign In to the Console&quot; using your Amazon account. If you don&apos;t have an AWS account, you&apos;ll
            need to create one and specify a payment method.
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;
            Click on &lt;strong&gt;EC2&lt;/strong&gt; in the top left corner, then &lt;strong&gt;Launch Instance&lt;/strong&gt; on the following
            screen.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm4.staticflickr.com/3682/20289881856_1b99053e79_c.jpg&quot; title=&quot;AWS Console&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20289881856/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3682/20289881856_1b99053e79.jpg&quot; width=&quot;500&quot; height=&quot;377&quot; alt=&quot;AWS Console&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;Select &lt;strong&gt;Amazon Linux&lt;/strong&gt;.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/332/20307710822_569d21cc0e_c.jpg&quot; title=&quot;Select Amazon Linux&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20307710822/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/332/20307710822_569d21cc0e.jpg&quot; width=&quot;500&quot; height=&quot;377&quot; alt=&quot;Select Amazon Linux&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;Choose an Instance Type of &lt;strong&gt;t2.micro&lt;/strong&gt;, then click &lt;strong&gt;Next: Configure Instance
                Details&lt;/strong&gt;.
            &lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/468/20316123115_e69046be65_c.jpg&quot; title=&quot;Instance Type&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20316123115/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/468/20316123115_e69046be65.jpg&quot; width=&quot;500&quot; height=&quot;364&quot; alt=&quot;Instance Type&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;You don&apos;t need to configure anything on the next screen, so click &lt;strong&gt;Next: Add Storage&lt;/strong&gt;.
            Storage
            settings don&apos;t need to be changed either, so click &lt;strong&gt;Next: Tag Instance&lt;/strong&gt;.
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;On the Tag Instance screen, assign a name to your server. I chose &quot;Minecraft Server&quot;. Click
            &lt;strong&gt;Next: Configure Security Group&lt;/strong&gt; to continue.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm4.staticflickr.com/3776/20307710592_de1e0d32a6_c.jpg&quot; title=&quot;Tag Instance&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20307710592/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3776/20307710592_de1e0d32a6.jpg&quot; width=&quot;500&quot; height=&quot;280&quot; alt=&quot;Tag Instance&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;This step is important because it opens a Minecraft port that allows players to connect. Create a new
            security
            group with name &lt;strong&gt;Minecraft&lt;/strong&gt; and description &lt;strong&gt;Ports for Minecraft&lt;/strong&gt;. Click
            &lt;strong&gt;
                Add Rule&lt;/strong&gt;, specify &lt;strong&gt;Custom TCP Rule&lt;/strong&gt;, Port Range &lt;strong&gt;25565&lt;/strong&gt; and
            Source
            &lt;strong&gt;Anywhere&lt;/strong&gt;. Note that you can also lock down your instance so only certain IPs can connect.
            Click
            &lt;strong&gt;Review and Launch&lt;/strong&gt; to continue.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/256/20289881646_ec758dec01_c.jpg&quot; title=&quot;Security Group Configuration&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20289881646/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/256/20289881646_ec758dec01.jpg&quot; width=&quot;500&quot; height=&quot;365&quot; alt=&quot;Security Group Configuration&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;You&apos;ll be warned about allowing any IP address on the following screen. Click &lt;strong&gt;Launch&lt;/strong&gt; to
            continue.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/405/20289882136_a894265e8d_c.jpg&quot; title=&quot;Review Instance&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20289882136/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/405/20289882136_a894265e8d.jpg&quot; width=&quot;500&quot; height=&quot;365&quot; alt=&quot;Review Instance&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;

        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;You&apos;ll be prompted to create a new keypair. I chose &quot;minecraft&quot; for my key pair name. Click &lt;strong&gt;Download&lt;/strong&gt; to download your key pair.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/338/20128101798_aec2deac2d_c.jpg&quot; title=&quot;Create Key Pair&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20128101798/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/338/20128101798_aec2deac2d.jpg&quot; width=&quot;500&quot; height=&quot;365&quot; alt=&quot;Create Key Pair&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
            &lt;p&gt;I executed the following commands to move this key to a location on my hard drive and locked it down so
                the
                public can&apos;t view it.&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;mv ~/Downloads/minecraft.pem ~/.ssh/.
chmod 400 .ssh/minecraft.pem
&lt;/pre&gt;
            &lt;p&gt;Click &lt;strong&gt;Launch Instances&lt;/strong&gt; to continue. You should see something like the following screen.
            &lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/439/20128088610_1512c30ddf_c.jpg&quot; title=&quot;Launch Status&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20128088610/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/439/20128088610_1512c30ddf.jpg&quot; width=&quot;500&quot; height=&quot;385&quot; alt=&quot;Launch Status&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;Click on the instance name and copy/paste the Public IP. You&apos;ll want to write down this IP address since
                you&apos;ll need it later, and you&apos;ll also want to send it to friends so they can join.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/385/20322138311_7f65ca260c_c.jpg&quot; title=&quot;Public IP Address&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20322138311/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/385/20322138311_7f65ca260c.jpg&quot; width=&quot;500&quot; height=&quot;385&quot; alt=&quot;Public IP Address&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
            &lt;p&gt;Execute the following command with this IP to connect
                to your server. Type &lt;strong&gt;yes&lt;/strong&gt; when prompted to continue connecting.&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;ssh -i .ssh/minecraft.pem ec2-user@your-public-ip
&lt;/pre&gt;
            &lt;p&gt;You&apos;ll likely be told there&apos;s a number of updates to install; run &lt;strong&gt;sudo yum update&lt;/strong&gt; to
                install them.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/257/20316121795_fd2a052dc9_c.jpg&quot; title=&quot;SSH&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20316121795/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/257/20316121795_fd2a052dc9.jpg&quot; width=&quot;500&quot; height=&quot;210&quot; alt=&quot;SSH&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
    &lt;/ol&gt;
&lt;/div&gt;

&lt;div id=&quot;step2&quot;&gt;
    &lt;p&gt;&lt;strong&gt;Step 2: Install a Minecraft Server&lt;/strong&gt;&lt;/p&gt;
    &lt;ol&gt;
        &lt;li&gt;&lt;p&gt;From your Linux prompt, type the following commands to create a folder and copy the latest version* of
            the
            Minecraft server into it.&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;mkdir MinecraftServer
cd MinecraftServer
wget https://s3.amazonaws.com/Minecraft.Download/versions/1.8.8/minecraft_server.1.8.8.jar
&lt;/pre&gt;
            &lt;p&gt;* Check &lt;a href=&quot;http://www.minecraft.net/download&quot;&gt;http://www.minecraft.net/download&lt;/a&gt; to find out the
                latest
                version number and change the above command appropriately.&lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;Create a symlink to the downloaded JAR so you can keep the same launch command, regardless of version.
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;ln -s minecraft_server.1.8.8.jar minecraft_server.jar
&lt;/pre&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;Launch your server using the following command:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;sudo java -Xmx1G -Xms1G -jar minecraft_server.jar nogui
&lt;/pre&gt;
            &lt;p&gt;You should see ouput like the screenshot below, prompting you to agree to the EULA.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/510/20322137791_1ba0d416a0_c.jpg&quot; title=&quot;EULA Warning&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20322137791/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/510/20322137791_1ba0d416a0.jpg&quot; width=&quot;500&quot; height=&quot;167&quot; alt=&quot;EULA Warning&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;

        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;Edit &lt;code&gt;eula.txt&lt;/code&gt; by running &lt;strong&gt;sudo vi eula.txt&lt;/strong&gt; and changing &quot;eula=false&quot; to
            &quot;eula=true&quot;.
            If you&apos;re unfamiliar with vi, the following instructions will help you edit this file after you&apos;ve opened
            it.&lt;/p&gt;
            &lt;ul&gt;
                &lt;li&gt;Type &quot;/false&quot; followed by [Return]&lt;/li&gt;
                &lt;li&gt;Type &quot;xxxxx&quot; to delete &quot;false&quot;&lt;/li&gt;
                &lt;li&gt;[Shift+A] to go to the end of the line&lt;/li&gt;
                &lt;li&gt;Type &quot;true&quot;&lt;/li&gt;
                &lt;li&gt;Hit [Esc], then type &quot;:wq&quot; to save the file&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;Run the &lt;strong&gt;sudo java&lt;/strong&gt; command again (hitting up arrow twice will retrieve this command from
            your history). This time,
            the server should start, albeit with a few warnings about missing files.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/482/20307710482_c0edde8f8b_b.jpg&quot; title=&quot;Server launches successfully!&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20307710482/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/482/20307710482_c0edde8f8b_z.jpg&quot; width=&quot;511&quot; height=&quot;640&quot; alt=&quot;Server launches successfully!&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
    &lt;/ol&gt;
&lt;/div&gt;

&lt;div id=&quot;step3&quot;&gt;&lt;strong&gt;Step 3: Connect to Your Server and Play!&lt;/strong&gt;

    &lt;p&gt;This is the easiest step of all, and possibly one that your kids are familiar with.&lt;/p&gt;
    &lt;ol&gt;
        &lt;li&gt;&lt;p&gt;Launch Minecraft. Make sure the profile uses the same version as your server. Copy the IP address
            of your server to your clipboard and click &lt;strong&gt;Play&lt;/strong&gt;.&lt;/p&gt;

            &lt;p style=&quot;text-align: center&quot;&gt;
                &lt;a href=&quot;https://farm1.staticflickr.com/474/20128098228_d1b60e6fc5_c.jpg&quot; title=&quot;Minecraft Launcher&quot; rel=&quot;lightbox[minecraftserveraws]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/20128098228/in/album-72157654487678494/&quot;&gt;&lt;img src=&quot;https://farm1.staticflickr.com/474/20128098228_d1b60e6fc5.jpg&quot; width=&quot;500&quot; height=&quot;342&quot; alt=&quot;Minecraft Launcher&quot;&gt;&lt;/a&gt;

            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Multiplayer&lt;/strong&gt;, followed by &lt;strong&gt;Add Server&lt;/strong&gt;. Give it a name you&apos;ll
            remember
            and paste the IP address into the &lt;strong&gt;Server Address&lt;/strong&gt;. Click &lt;strong&gt;Done&lt;/strong&gt;, followed by
            &lt;strong&gt;Join Server&lt;/strong&gt;.&lt;/p&gt;

            &lt;p&gt;Note: if you want to toggle fullscreen mode, you can do this with F11. If you don&apos;t have F11 on your
                keyboard,
                go to Options &amp;gt; Video Settings and click &lt;strong&gt;Fullscreen&lt;/strong&gt; to toggle it.
            &lt;/p&gt;
        &lt;/li&gt;

    &lt;/ol&gt;
    &lt;p&gt;Congratulations! You just setup a Minecraft server in the cloud. Now you can send the IP address to friends and
        invite them to play!
    &lt;/p&gt;

    &lt;p&gt;
        One of the issues that this setup has is that your server will shut down as soon as you logout of your SSH
        session.
        You can run the Minecraft server and leave it running using the following command.&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;nohup sudo java -Xmx1G -Xms1G -jar minecraft_server.jar nogui &amp;gt; minecraft.log 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/pre&gt;
    &lt;p&gt;
        This will keep everything running in the background, even after you logout. It also spits out a process id you
        can use to stop the server.
    &lt;/p&gt;&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;kill -9 processId&lt;/pre&gt;
    &lt;p&gt;If you lose this number, you can find the process id by running &lt;code&gt;ps aux | grep java&lt;/code&gt;. You can also
        shutdown all Java processes with
        &lt;code&gt;sudo killall java&lt;/code&gt;.
    &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you have any tips or tricks for improving this tutorial, I&apos;d love to hear about them in the comments.&lt;/p&gt;

&lt;p id=&quot;next-steps&quot;&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;br&gt;
    When I first setup a Minecraft server on AWS earlier this year, I never bothered to shut it down. The result was it
    cost me around $15 the first month. From then on, I simply started it whenever my son asked me to, then shut it down when he went to bed.
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;http://www.blog.gartonhill.com/upgrading-your-minecraft-ec2-cloud-server-and-save-money/&quot;&gt;Ben Garton has a good tutorial&lt;/a&gt; on
    how to setup a cron job to shutdown the instance at midnight. He also shows how to start the server using a Desktop shortcut on Windows. If
    you&apos;ve done something similar for Mac/Linux, I&apos;d love to hear about it. Allowing your kid to fire up their own Minecraft server on demand (and
    shutting it down automatically) seems to be the most economical way to run things.
&lt;/p&gt;

&lt;p id=&quot;devoxx4kids&quot;&gt;&lt;strong&gt;Devoxx4Kids Denver Workshop Next Week&lt;/strong&gt;&lt;br&gt;
    If you&apos;d like to learn more about Minecraft, developing mods and setting up your own server, you should join us at
    the &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/224431746/&quot;&gt;Devoxx4Kids Denver Meetup next week&lt;/a&gt; (Saturday, August 15th at 9:30am). We&apos;ll be tuning in live to
    Arun and Aditya Gupta&apos;s vJUG
    session
    on &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/224283882/&quot;&gt;Getting Started with Minecraft Modding&lt;/a&gt;. In the
    second hour,
    I&apos;ll show how to setup your own server on AWS and configure it to have the mods we&apos;ve developed while watching the
    vJUG session. Thanks to our venue sponsor &lt;a href=&quot;http://www.tuliva.com/&quot;&gt;Tuliva&lt;/a&gt;, you don&apos;t even need to bring
    a machine! They have computers available for the kids to use and a sweet location too. &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/224431746/&quot;&gt;RSVP today&lt;/a&gt;!
&lt;/p&gt;

&lt;p&gt;Related: It seems you can also run a Minecraft server on Heroku using &lt;a href=&quot;https://github.com/jacobwgillespie/heroku-minecraft&quot;&gt;heroku-minecraft&lt;/a&gt;.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/uberconf_2015_my_presentations_on</guid>
    <title>UberConf 2015: My Presentations on Apache Camel and Java Webapp Security</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/uberconf_2015_my_presentations_on</link>
        <pubDate>Mon, 27 Jul 2015 08:08:48 -0600</pubDate>
    <category>Java</category>
    <category>apacheshiro</category>
    <category>security</category>
    <category>javaee</category>
    <category>apachecamel</category>
    <category>springsecurity</category>
    <category>webapp</category>
    <category>java</category>
    <category>uberconf</category>
            <description>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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/grails_angular_vs_jhipster</guid>
    <title>Grails + Angular vs. JHipster</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/grails_angular_vs_jhipster</link>
        <pubDate>Tue, 14 Jul 2015 08:02:01 -0600</pubDate>
    <category>Java</category>
    <category>jhipster</category>
    <category>spring-boot</category>
    <category>angularjs</category>
    <category>grails</category>
            <description>&lt;p&gt;I recently received an email from a long time follower of my comparing web frameworks research and presentations. He asked some interesting questions:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I am starting on a new venture to build a direct to consumer web application. I am planning to leverage Cloud services to build my CI/CD pipeline. I am very strong with Java Backend/middleware and learning Javascript Front-end frameworks. I love Spring and SOFEA. Having said that, I am wondering if I should use Grails + Angular or JHipster? My primary concern with JHipster is there is hardly any &#8216;community&apos;, there is Julien and whatever he says/thinks goes! Can you give me some pointers?
&lt;/a&gt;
&lt;p&gt;I imagine there&apos;s other JVM developers with similar questions, so I figured I&apos;d publish my response for all to see.&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
JHipster may have a smaller community than Grails, but remember that it&apos;s built on Spring Boot and AngularJS. Both have huge communities. In fact, Grails 3 is built on Spring Boot, just like JHipster. 
&lt;/p&gt;
&lt;p&gt;
Even though JHipster generates your code in Java, there&apos;s nothing preventing you from writing your code in Groovy or Scala. I dig JHipster, but I&apos;ve also worked with AngularJS and Spring Boot for a couple years. The fact that someone put these technologies together and makes it easy to work with them is awesome. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
I like JHipster so much, I decided to write a book on it. I hope to finish it in the next couple months and have it published in the fall. It&apos;ll be a free download from InfoQ. Learn more at &lt;a href=&quot;http://www.jhipster-book.com/&quot;&gt;http://www.jhipster-book.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yes, I&apos;m probably a bit biased since I&apos;m writing a JHipster book. However, it&apos;s been easy for me to introduce and use Spring Boot at my last few clients. They were already using Spring, so the transition to using a Spring simplifier was a no-brainer. I haven&apos;t had as much luck getting clients to adopt Grails, even though I&apos;ve suggested it. That could change now that it&apos;s based on Spring Boot.&lt;/p&gt;
&lt;p&gt;What&apos;s your experience? Would you recommend Grails + Angular over JHipster? If so, why?</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/getting_hip_with_jhipster_at</guid>
    <title>Getting Hip with JHipster at Denver&apos;s Java User Group</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/getting_hip_with_jhipster_at</link>
        <pubDate>Thu, 9 Apr 2015 08:31:54 -0600</pubDate>
    <category>Java</category>
    <category>angularjs</category>
    <category>spring-boot</category>
    <category>java</category>
    <category>jhipster</category>
    <category>bootstrap</category>
    <category>html5</category>
    <category>yeoman</category>
            <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/how_to_setup_your_own1</guid>
    <title>How To Setup Your Own Software Development Company, 6 Years Later</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/how_to_setup_your_own1</link>
        <pubDate>Mon, 2 Mar 2015 09:26:01 -0700</pubDate>
    <category>Java</category>
    <category>healthoverwealth</category>
    <category>contract</category>
    <category>scorp</category>
    <category>fulltime</category>
    <category>development</category>
    <category>time</category>
    <category>insurance</category>
    <category>career</category>
    <category>smallbusiness</category>
    <category>software</category>
            <description>&lt;p&gt;Just over six years ago, I wrote a popular post titled &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_setup_your_own&quot;&gt;How To Setup Your Own Software Development Company&lt;/a&gt;. I&apos;d just left LinkedIn a few months earlier and was enjoying consulting life again, working with a group of friends at Evite. In the article, I wrote about how I liked consulting because it forces you to keep your skills up-to-date and it pays a lot better. I also talked about the type of legal entity you should form (I have an S Corp), what business insurance you should buy, what I had for health insurance and how I automated payroll and tax payments.&lt;/p&gt;
&lt;p&gt;I recently received an email from a reader, asking me if I had any updated thoughts.&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
It&apos;s been nearly six years since you wrote &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_setup_your_own&quot;&gt;the article about starting your own business&lt;/a&gt; ... and thanks, by the way. 
&lt;/p&gt;
&lt;p&gt;
I am starting my venture into independent contract work as a software engineer (Java technology) in California and most likely will setup an S corp entity. 
&lt;/p&gt;
&lt;p&gt;
Seeing that you wrote this six years ago and things have considerably changed in the U.S. (economy, health care, etc.), I was wondering if you had some updated thoughts to share, perhaps some learned lessons even. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
And also, I have questions about business insurance: what type of insurance should I opt for? Is there really an umbrella insurance out there? Or does each (or many) clients out there dictate the insurance you need? &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, a lot has changed in the last six years. The economy has improved and health care costs have risen. Through this time, I&apos;ve been able to continue to operate as an independent software developer and keep the contracts flowing. Personally, the biggest changes in my life have been outside of work. I &lt;a href=&quot;http://raibledesigns.com/rd/entry/an_epic_weekend_in_estes&quot;&gt;met an exceptional woman&lt;/a&gt;, traveled to &lt;a href=&quot;http://raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam&quot;&gt;conferences&lt;/a&gt; all &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_fun_week_in_florida&quot;&gt;around&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/two_opening_days_with_a&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;world&lt;/a&gt; with her, got &lt;a href=&quot;http://raibledesigns.com/rd/entry/matrimony_in_montana&quot;&gt;married&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/around_the_world_honeymoon_1st&quot;&gt;traveled&lt;/a&gt; some more, then bought a &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_syncro_rescue_road_trip&quot;&gt;VW Westfalia&lt;/a&gt; so we could have &lt;a href=&quot;http://raibledesigns.com/rd/entry/farewell_to_the_2013_2014&quot;&gt;lots of fun&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/syncro_solstice_2014&quot;&gt;traveling&lt;/a&gt; in our own &lt;a href=&quot;http://raibledesigns.com/rd/entry/rafting_the_yampa_through_dinosaur&quot;&gt;backyard&lt;/a&gt;. All the while, I&apos;ve worked for some great clients. I &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_s_the_ol_team&quot;&gt;built a team of hot shots&lt;/a&gt; at Time Warner Cable (many of them still work there), I skied the &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_greatest_snow_on_earth&quot;&gt;awesome powder of Utah&lt;/a&gt; while working at Overstock and I enjoyed a long-term contract at Oracle. After Oracle, I got into the healthcare industry and I&apos;ve been working in it ever since. &lt;/p&gt;
&lt;p&gt;In fact, I just finished working for a healthcare company last week and I&apos;m on the hunt for my next gig in April. Check out &lt;a href=&quot;https://www.linkedin.com/in/mraible&quot;&gt;my LinkedIn profile&lt;/a&gt; if you&apos;d like to see my r&#233;sum&#233;.&lt;/p&gt;
&lt;p&gt;I&apos;ve learned quite a few lessons over the last several years. As an independent developer, the biggest thing I&apos;ve learned is &lt;em&gt;marketing is key&lt;/em&gt;. I&apos;ve always known this, but I&apos;ve been reminded of its importance a few times. When I worked at Taleo (after Overstock), I was on a 3-month contract that turned into a 9-month contract that got a 1-year extension when Oracle bought them. The work was challenging, but the application was outdated. Getting them to adopt new technologies like Bootstrap and AngularJS was difficult. When Oracle took over, they offered me a 1-year contract at a great rate. I accepted, never thinking it would be difficult to get paid from someone like Oracle. It took them over &lt;em&gt;three months&lt;/em&gt; to pay my first invoice and it took me another three months to get payments flowing regularly. I felt like I was trapped. I felt like I could quit, but that wouldn&apos;t speed up the process of getting my invoices paid. From this experience, I&apos;m hesitant to start with any contract that&apos;s longer than three months.&lt;/p&gt;
&lt;p&gt;During my time at Oracle, I didn&apos;t blog as much as I had previously (because the day-to-day work wasn&apos;t that exciting), but I did still speak at conferences. Last year, I took the year off from speaking at conferences altogether. Speaking is an excellent marketing tool. Because of my lack of speaking, I saw a downturn in contract opportunities in Q4 last year.&lt;/p&gt;
&lt;p&gt;As far as health insurance is concerned, I continued to have a disaster prevention plan, with a $5K per year deductible. I paid around $300/month for this, and rarely used it. By riding my bike to my office in downtown Denver, and skiing a bunch in the winter, I felt like I was pretty healthy. After I &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_21_day_sugar_detox&quot;&gt;stopped eating sugar&lt;/a&gt; last fall, I became much healthier. So much healthier that I&apos;ve stopped taking high blood pressure medication. Today, I don&apos;t pay for health insurance. Trish went back to IT Security Sales in November and she was able to get me on her company&apos;s plan for $100 cheaper than what I was paying. I didn&apos;t have dental insurance for the last five years and I did have to shell out $5K for a tooth implant at one point.&lt;/p&gt;
&lt;p&gt;For business insurance, I have the &lt;a href=&quot;http://www.thehartford.com/business-owner-policy/&quot;&gt;Business Owner&apos;s Policy&lt;/a&gt; from The Hartford. I pay around $600/year and I&apos;ve gotten that back when I&apos;ve had laptops stolen or accidentally killed my iPhone. I&apos;ve got automated backups going all the time, so I haven&apos;t lost any data in several years. This insurance policy and its liability coverage has been &quot;good enough&quot; for all my clients, including the big ones.&lt;/p&gt;
&lt;p&gt;I think the biggest lesson I&apos;ve learned in the last several years is that the best way to be rich is to be rich in &lt;em&gt;time&lt;/em&gt;. I&apos;ve always dreamed of making $500/hour and working 20 hours per week. While $500/hour sounds crazy, you know there&apos;s consultants out there that are making that kinda cash. They&apos;re probably not in software, maybe they&apos;re political consultants, or former professional athletes, but those consulting rates do exist. In software, there&apos;s certainly companies that bill those kinda rates. My rates for the last several years haven&apos;t been &lt;em&gt;that&lt;/em&gt; good, but they&apos;ve been pretty awesome. 
&lt;/p&gt;
&lt;p&gt;
Earlier this year, I had the opportunity to work 20 hours per week instead of 40. It was one of the greatest work-life experiences I&apos;ve had to date. I was still able to pay all my bills, and I had time during each-and-every-day to do something fun. When working 40 hours per week, exercising and cooking dinner were somewhat of a chore. When I flipped to working less, work became the chore and exercise and cooking became the fun parts of my day. I read somewhere recently that if Americans valued &lt;em&gt;health over wealth&lt;/em&gt;, we&apos;d be a lot better off. I felt like I did this when working less and that I was &lt;em&gt;rich in time&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;Related to feeling better over making more, I&apos;ve started to target employment opportunities that offer a good team to work with. For the last year, most of my contracts have been with remote clients, where they haven&apos;t required me to travel onsite. While this sounds great in theory, I do miss the comradery that exists when working with a team. Working with someone over a Skype/HipChat call is nothing like sitting next to each other and cracking jokes while writing code. Don&apos;t get me wrong, I love remote work, but I do think it&apos;s important to be onsite and collaborating face-to-face at least once per month.&lt;/p&gt;
&lt;p&gt;To those individuals looking to start their own Solopreneurship, I hope this advice helps. It&apos;s been a great experience for me.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_3_5_released</guid>
    <title>AppFuse 3.5 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_3_5_released</link>
        <pubDate>Fri, 20 Feb 2015 09:08:53 -0700</pubDate>
    <category>Java</category>
    <category>wicket</category>
    <category>java</category>
    <category>gwt</category>
    <category>springmvc</category>
    <category>springsecurity</category>
    <category>maven</category>
    <category>tapestry5</category>
    <category>javaee</category>
    <category>jsf</category>
    <category>struts2</category>
    <category>spring</category>
            <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/converting_an_application_to_jhipster</guid>
    <title>Converting an Application to JHipster</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/converting_an_application_to_jhipster</link>
        <pubDate>Thu, 12 Feb 2015 09:28:59 -0700</pubDate>
    <category>Java</category>
    <category>groovy</category>
    <category>jhipster</category>
    <category>jpa</category>
    <category>scala</category>
    <category>springboot</category>
    <category>spring</category>
    <category>angularjs</category>
    <category>java</category>
    <category>dosug</category>
            <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/integrating_node_js_ruby_and</guid>
    <title>Integrating Node.js, Ruby and Spring with Okta&apos;s SAML Support</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/integrating_node_js_ruby_and</link>
        <pubDate>Thu, 8 Jan 2015 11:43:47 -0700</pubDate>
    <category>Java</category>
    <category>node.js</category>
    <category>spring</category>
    <category>ruby</category>
    <category>okta</category>
    <category>security</category>
    <category>jruby</category>
    <category>saml</category>
    <atom:summary type="html">&lt;p&gt;
&lt;a href=&quot;http://www.okta.com&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/logo_okta.png&quot; alt=&quot;Okta&quot; width=&quot;131&quot; height=&quot;37&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
Security has always piqued my interest, ever since I first developed &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; and figured out how to make J2EE
    security work back in 2004.
    I &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_refactorings_part_iii_remember&quot;&gt;hacked AppFuse to have Remember Me functionality&lt;/a&gt;,
    then moved onto Acegi/Spring Security. Spring Security
    had the features I needed, even if it did require almost 100 lines of XML to configure it. These days, it&apos;s much
    better and its JavaConfig - combined with Spring Boot - is pretty slick.&lt;/p&gt;
&lt;p&gt;That was the first part of my security life. The second phase began the night I met Trish, and learned she sold
    security products. She knew of OWASP and their top 10 rules. It was Trish that inspired me to write my &lt;a
        href=&quot;http://www.slideshare.net/mraible/java-web-application-security-denver-jug-2013&quot;&gt;Java Web Application
        Security presentation&lt;/a&gt;. I really enjoyed writing that presentation, comparing Apache Shiro, Spring Security
    and Java EE&apos;s security frameworks. I followed up the &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;first time I presented it&lt;/a&gt; with a
    number of &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part4&quot;&gt;blog posts and
        screencasts&lt;/a&gt;. &lt;em&gt;Hmmmm, maybe I should update the presentation/screencasts to use Java configuration only
    (&lt;a href=&quot;https://twitter.com/search?q=%23NoXML&quot;&gt;#NoXML&lt;/a&gt;) and submit it to a couple conferences this year?&lt;/em&gt; I digress.
&lt;/p&gt;
&lt;p&gt;I had to do a security-related spike over the last couple weeks. I was trying to get SAML authentication working with
    &lt;a href=&quot;https://www.okta.com/&quot;&gt;Okta&lt;/a&gt; and my client&apos;s Active Directory server. Luckily, someone setup the AD
    integration so all I had to do was try a few different languages/frameworks. I searched and found ThoughtWorks&apos; &lt;a
        href=&quot;https://github.com/ThoughtWorksInc/okta-samples&quot;&gt;okta-samples&lt;/a&gt;, which includes examples using Node.js
    and Sinatra (Ruby + JRuby). I also found a &lt;a href=&quot;https://github.com/vdenotaris/spring-boot-security-saml-sample&quot;&gt;Spring
        SAML&lt;/a&gt; example that includes one of my favorite things in JavaLand: Java-based configuration.&lt;/p&gt;
&lt;p&gt;I&apos;m happy to report I was able to get all of these applications working with my client&apos;s Okta setup. This article
    will tell you how I did it. For each application, I created a new application on Okta using its &quot;Template SAML
    2.0 Application&quot; and added myself in the application&apos;s &quot;People&quot; tab. Each section below contains the configuration
    I used for Okta. The instructions below assume you&apos;re similar to me, a developer that has Java 8, Node and Ruby
    installed, but none of the specific frameworks. As I write this, I have everything working on my Mac with Yosemite,
    but I wrote the instructions below using one of my old laptops, fresh after a Yosemite upgrade.&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
&lt;a href=&quot;http://www.okta.com&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/logo_okta.png&quot; alt=&quot;Okta&quot; width=&quot;131&quot; height=&quot;37&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
Security has always piqued my interest, ever since I first developed &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; and figured out how to make J2EE
    security work back in 2004.
    I &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_refactorings_part_iii_remember&quot;&gt;hacked AppFuse to have Remember Me functionality&lt;/a&gt;,
    then moved onto Acegi/Spring Security. Spring Security
    had the features I needed, even if it did require almost 100 lines of XML to configure it. These days, it&apos;s much
    better and its JavaConfig - combined with Spring Boot - is pretty slick.&lt;/p&gt;
&lt;p&gt;That was the first part of my security life. The second phase began the night I met Trish, and learned she sold
    security products. She knew of OWASP and their top 10 rules. It was Trish that inspired me to write my &lt;a
        href=&quot;http://www.slideshare.net/mraible/java-web-application-security-denver-jug-2013&quot;&gt;Java Web Application
        Security presentation&lt;/a&gt;. I really enjoyed writing that presentation, comparing Apache Shiro, Spring Security
    and Java EE&apos;s security frameworks. I followed up the &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part&quot;&gt;first time I presented it&lt;/a&gt; with a
    number of &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part4&quot;&gt;blog posts and
        screencasts&lt;/a&gt;. &lt;em&gt;Hmmmm, maybe I should update the presentation/screencasts to use Java configuration only
    (&lt;a href=&quot;https://twitter.com/search?q=%23NoXML&quot;&gt;#NoXML&lt;/a&gt;) and submit it to a couple conferences this year?&lt;/em&gt; I digress.
&lt;/p&gt;
&lt;p&gt;I had to do a security-related spike over the last couple weeks. I was trying to get SAML authentication working with
    &lt;a href=&quot;https://www.okta.com/&quot;&gt;Okta&lt;/a&gt; and my client&apos;s Active Directory server. Luckily, someone setup the AD
    integration so all I had to do was try a few different languages/frameworks. I searched and found ThoughtWorks&apos; &lt;a
        href=&quot;https://github.com/ThoughtWorksInc/okta-samples&quot;&gt;okta-samples&lt;/a&gt;, which includes examples using Node.js
    and Sinatra (Ruby + JRuby). I also found a &lt;a href=&quot;https://github.com/vdenotaris/spring-boot-security-saml-sample&quot;&gt;Spring
        SAML&lt;/a&gt; example that includes one of my favorite things in JavaLand: Java-based configuration.&lt;/p&gt;
&lt;p&gt;I&apos;m happy to report I was able to get all of these applications working with my client&apos;s Okta setup. This article
    will tell you how I did it. For each application, I created a new application on Okta using its &quot;Template SAML
    2.0 Application&quot; and added myself in the application&apos;s &quot;People&quot; tab. Each section below contains the configuration
    I used for Okta. The instructions below assume you&apos;re similar to me, a developer that has Java 8, Node and Ruby
    installed, but none of the specific frameworks. As I write this, I have everything working on my Mac with Yosemite,
    but I wrote the instructions below using one of my old laptops, fresh after a Yosemite upgrade.&lt;/p&gt;
&lt;p&gt;The first thing I did was checkout ThoughtWorks samples.&lt;/p&gt;
&lt;pre&gt;git clone https://github.com/ThoughtWorksInc/okta-samples.git&lt;/pre&gt;
&lt;h3 id=&quot;node&quot;&gt;Node.js&lt;/h3&gt;
&lt;p&gt;I started by getting the Node.js sample working. For Okta&apos;s configuration, I used:&lt;/p&gt;
&lt;table class=&quot;comparison&quot;&gt;
    &lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;Setting&lt;/th&gt;
        &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;Application label&lt;/td&gt;
        &lt;td&gt;Okta Node.js Example&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Force Authentication&lt;/td&gt;
        &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Post Back URL&lt;/td&gt;
        &lt;td&gt;http://localhost:3000/login/callback&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Name ID Format&lt;/td&gt;
        &lt;td&gt;EmailAddress&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Recipient&lt;/td&gt;
        &lt;td&gt;http://localhost:3000/&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Audience Restriction&lt;/td&gt;
        &lt;td&gt;http://localhost:3000/&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;authnContextClassRef&lt;/td&gt;
        &lt;td&gt;PasswordProtectedTransport&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Response&lt;/td&gt;
        &lt;td&gt;Signed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Assertion&lt;/td&gt;
        &lt;td&gt;Signed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Request&lt;/td&gt;
        &lt;td&gt;Compressed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Destination&lt;/td&gt;
        &lt;td&gt;http://localhost:3000/login/callback&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Attribute Statements&lt;/td&gt;
        &lt;td&gt;email|${user.email},firstName|${user.firstName}&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Node.js sample uses &lt;a href=&quot;https://www.npmjs.com/package/express&quot;&gt;express&lt;/a&gt;, as well as &lt;a
    href=&quot;https://www.npmjs.com/package/passport&quot;&gt;passport&lt;/a&gt; and
    &lt;a href=&quot;https://www.npmjs.com/package/passport-saml&quot;&gt;passport-saml&lt;/a&gt;. The passport packages are used to
    handle the SAML authentication and &lt;a href=&quot;https://www.npmjs.com/package/connect&quot;&gt;connect&lt;/a&gt; is used to
    compress the requests from your local server.&lt;/p&gt;
&lt;p&gt;The only thing I needed to do to make the Node.js app work was to paste the X509 cert string and target URL into its
    &lt;code&gt;config.json&lt;/code&gt; from the Okta app. In Okta&apos;s Admin interface, I clicked on the &quot;Sign On&quot; tab and clicked
    its
    &quot;View Setup Instructions&quot; button. I copied the &quot;Redirect Login URL&quot; value and copied it into config.json&apos;s
    &lt;strong&gt;entryPoint&lt;/strong&gt; value. I then downloaded the certificate and opened it in vi. I ran the following
    two commands to remove ^M and line endings (more
    &lt;a href=&quot;http://stackoverflow.com/questions/811193/how-to-convert-the-m-linebreak-to-normal-linebreak-in-a-file-opened-in-vim&quot;&gt;details
        here&lt;/a&gt;).
&lt;/p&gt;
&lt;pre&gt;
:%s/&amp;lt;Ctrl-V&gt;&amp;lt;Ctrl-M&gt;//g
:%s/\n//g
&lt;/pre&gt;
&lt;p&gt;Next, I copied everything between &lt;code&gt;-----BEGIN CERTIFICATE-----&lt;/code&gt; and &lt;code&gt;-----END CERTIFICATE-----&lt;/code&gt;
    and
    pasted it into the &lt;strong&gt;cert&lt;/strong&gt; value of config.json. I had to remove the comments from config.json for
    everything to work.&lt;/p&gt;
&lt;p&gt;After making these changes, I was able to run &quot;npm install&quot; and &quot;npm start&quot; and successfully login at
    http://localhost:3000.&lt;/p&gt;
&lt;h3 id=&quot;ruby&quot;&gt;Ruby&lt;/h3&gt;
&lt;p&gt;The Ruby sample uses &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt;, &lt;a
    href=&quot;https://github.com/intridea/omniauth/wiki&quot;&gt;omniauth&lt;/a&gt; and &lt;a
    href=&quot;https://github.com/PracticallyGreen/omniauth-saml&quot;&gt;omniauth-saml&lt;/a&gt;. To run the okta-ruby-sinatra application, I had to start by installing Bundler.
&lt;/p&gt;
&lt;pre&gt;sudo gem install bundler&lt;/pre&gt;
&lt;p&gt;Then I installed all the required gems for this project using the following command.&lt;/p&gt;
&lt;pre&gt;bundle install&lt;/pre&gt;
&lt;p&gt;This resulted in the following error:&lt;/p&gt;
&lt;pre&gt;
An error occurred while installing nokogiri (1.6.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v &apos;1.6.1&apos;` succeeds before bundling
&lt;/pre&gt;
&lt;p&gt;I tried Bundler&apos;s suggestion, but it failed:&lt;/p&gt;
&lt;pre&gt;
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
mkmf.rb can&apos;t find header files for ruby at /System/Library/Frameworks/Ruby.
framework/Versions/2.0/usr/lib/ruby/include/ruby.h
&lt;/pre&gt;
&lt;p&gt;I then tried upgrading to Xcode 6.1.1. I received the same error and running &quot;bundle update sinatra&quot; and &quot;sudo gem
    update --system&quot; didn&apos;t help anything. I found an &lt;a
        href=&quot;http://stackoverflow.com/questions/19580685/installing-rails-on-mavericks&quot;&gt;old Stack Overflow answer&lt;/a&gt;
    that suggested running &quot;xcode-select --install&quot; to install Xcode&apos;s Command Line Developer Tools. After doing so, I
    ran &quot;sudo gcc&quot; to accept to all Apple&apos;s licensing agreements. I ran &quot;bundle install&quot; again and this time it failed
    with the following error:&lt;/p&gt;
&lt;pre&gt;
-----
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
...
An error occurred while installing nokogiri (1.6.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v &apos;1.6.1&apos;` succeeds before bundling.
&lt;/pre&gt;
&lt;p&gt;I tried Bundler&apos;s suggested again: &quot;sudo gem install nokogiri -v &apos;1.6.1&apos;&quot;. This didn&apos;t work, so I tried &quot;bundle
    update&quot; and it finally worked.
    I ran &quot;bundle install&quot; for the final time, followed by &quot;ruby app.rb&quot;. WEBrick started and I created a &quot;Okta Ruby
    Example&quot; application on Okta with the following settings.
&lt;table class=&quot;comparison&quot;&gt;
    &lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;Setting&lt;/th&gt;
        &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;Application label&lt;/td&gt;
        &lt;td&gt;Okta Ruby Example&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Force Authentication&lt;/td&gt;
        &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Post Back URL&lt;/td&gt;
        &lt;td&gt;http://localhost:4567/auth/saml/callback&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Name ID Format&lt;/td&gt;
        &lt;td&gt;EmailAddress&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Recipient&lt;/td&gt;
        &lt;td&gt;http://localhost:4567&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Audience Restriction&lt;/td&gt;
        &lt;td&gt;http://localhost:4567&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;authnContextClassRef&lt;/td&gt;
        &lt;td&gt;PasswordProtectedTransport&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Response&lt;/td&gt;
        &lt;td&gt;Signed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Assertion&lt;/td&gt;
        &lt;td&gt;Signed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Request&lt;/td&gt;
        &lt;td&gt;Compressed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Destination&lt;/td&gt;
        &lt;td&gt;http://localhost:4567/auth/saml/callback&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Attribute Statements&lt;/td&gt;
        &lt;td&gt;email|${user.email},firstName|${user.firstName}&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To configure Sinatra with Otka&apos;s settings, I started by renaming the &lt;code&gt;config.yml.sample&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;mv config.yml.sample config.yml&lt;/pre&gt;
In Otka&apos;s Admin UI for the application, I clicked on the &quot;Sign On&quot; tab and clicked its
&quot;View Setup Instructions&quot; button. I copied the &quot;Redirect Login URL&quot; value and copied it into config.yml&apos;s
&lt;strong&gt;target_url&lt;/strong&gt; value. I then downloaded the certificate and ran the the following command in the directory I downloaded it to.&lt;/p&gt;
&lt;pre&gt;openssl x509 -noout -fingerprint -in &quot;okta.cert&quot;&lt;/pre&gt;
&lt;p&gt;I copied the fingerprint into config.yml&apos;s &lt;strong&gt;fingerprint&lt;/strong&gt; value and restarted the app. I opened
    http://localhost:4567 in my browser and was able to successfully login.&lt;/p&gt;
&lt;h3 id=&quot;jruby&quot;&gt;JRuby&lt;/h3&gt;
&lt;p&gt;To start with JRuby, I first read the project&apos;s README. It mentioned issues with &quot;nokogiri&quot; and explains the project
    contains a patched release of nokogiri 1.6.0. Since I knew there was a later release, I modified
    &lt;code&gt;Gemfile&lt;/code&gt; and removed the version and path information from the last line. I copied the
    &lt;code&gt;config.yml&lt;/code&gt; from the Ruby project and ran the following commands to install Bundler, the project&apos;s
    dependencies and start the app.&lt;/p&gt;
&lt;pre&gt;jruby -S gem install bundler
jruby -S bundle install&lt;/pre&gt;
&lt;p&gt;Running the second command resulted in the following error:&lt;/p&gt;
&lt;pre&gt;Your jruby version is 1.7.18, but your Gemfile specified jruby 1.7.4&lt;/pre&gt;
&lt;p&gt;I modified &lt;code&gt;Gemfile&lt;/code&gt; to specify &quot;1.7.18&quot; and tried again. This time it worked. I started the application
    using the following command:
&lt;pre&gt;jruby app.rb&lt;/pre&gt;
&lt;div class=&quot;alert alert-info&quot;&gt;
    &lt;strong&gt;NOTE:&lt;/strong&gt; If you see the the following in your browser window, it means you forgot to copy config.yml from the Ruby
    project.
    &lt;pre&gt;undefined method `auth&apos; for Sinatra::Application:Class&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;When I tried to login at &lt;a href=&quot;http://localhost:4567&quot;&gt;http://localhost:4567&lt;/a&gt;, I saw an infinite redirect and
    the following error in my console.&lt;/p&gt;
&lt;pre&gt;
W, [2015-01-08T08:53:22.514000 #56144]  WARN -- : attack prevented by Rack::Protection::SessionHijacking
0:0:0:0:0:0:0:1 - - [08/Jan/2015 08:53:22] &quot;GET / HTTP/1.1&quot; 302 - 0.0190
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:53:22 MST] &quot;GET / HTTP/1.1&quot; 302 0
&lt;/pre&gt;
&lt;p&gt;&lt;a
    href=&quot;http://stackoverflow.com/questions/10102893/sinatra-app-using-omniauth-gets-rackprotectionsessionhijacking-in-ie9&quot;&gt;Stack
    Overflow&lt;/a&gt; indicated this is a problem caused by an old version of &lt;a
    href=&quot;http://rkh.github.io/rack-protection/&quot;&gt;rack-protection&lt;/a&gt;. Running &quot;jruby -S bundle update rack-protection&quot;
    updated the project to use rack-protection 1.5.3 (was 1.5.1). After restarting and trying again, I received the
    following error:
&lt;/p&gt;
&lt;pre&gt;
I, [2015-01-08T08:59:32.679000 #56176]  INFO -- omniauth: (saml) Callback phase initiated.
E, [2015-01-08T08:59:34.747000 #56176] ERROR -- omniauth: (saml) Authentication failure! invalid_ticket: Onelogin::Saml::ValidationError, Digest mismatch
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:59:34 -0700] &quot;POST /auth/saml/callback HTTP/1.1&quot; 302 9 2.0760
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:59:34 -0700] &quot;GET /auth/failure?message=invalid_ticket&amp;strategy=saml HTTP/1.1&quot; 404 449 0.0080
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:59:34 MST] &quot;GET /auth/failure?message=invalid_ticket&amp;strategy=saml HTTP/1.1&quot; 404 449
- -&gt; /auth/failure?message=invalid_ticket&amp;strategy=saml
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:59:34 -0700] &quot;GET /__sinatra__/404.png HTTP/1.1&quot; 200 18893 0.0200
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:59:32 MST] &quot;POST /auth/saml/callback HTTP/1.1&quot; 302 9
- -&gt; /auth/saml/callback
0:0:0:0:0:0:0:1 - - [08/Jan/2015:08:59:34 MST] &quot;GET /__sinatra__/404.png HTTP/1.1&quot; 200 18893
http://localhost:4567/auth/failure?message=invalid_ticket&amp;strategy=saml -&gt; /__sinatra__/404.png
&lt;/pre&gt;
&lt;p&gt;At this point, the only thing different from my working version and my old laptop was the version of Java. My old
    laptop had &quot;build 1.8.0_05-b13&quot;, so I upgraded to the latest version of Java 8 (update 25). This didn&apos;t help, so I
    tried updating all bundles with &quot;jruby -S bundle update&quot;.
    This failed too, so I figured I&apos;d try to use the version of JRuby that was on my working laptop (version 1.7.16.1).
    I installed &lt;a href=&quot;http://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;, ran &quot;brew install jruby&quot;, removed the newer version from my path
    and downgraded the version in &lt;code&gt;Gemfile&lt;/code&gt;. I had to re-install Bundler and the projects dependencies with
    the following commands.&lt;/p&gt;
&lt;pre&gt;jruby -S gem install bundler
jruby -S bundle install&lt;/pre&gt;
&lt;p&gt;Same error again. I reverted &lt;code&gt;Gemfile.lock&lt;/code&gt; and ran the only bundle update command I&apos;d run on my working
    laptop:&lt;/p&gt;
&lt;pre&gt;$ jruby -S bundle update sinatra&lt;/pre&gt;
&lt;p&gt;Unfortunately, this still didn&apos;t fix the issue. I copied the project from my working laptop and tried running that
    project. It failed, proving that it was an environment issue, not a project/code issue. I tried rebooting and when
    that didn&apos;t work, I gave up. It&apos;s pretty strange this didn&apos;t work on a fresh Yosemite install - it took me less than
    10 minutes to get it working originally.
&lt;h3 id=&quot;spring&quot;&gt;Spring&lt;/h3&gt;
&lt;p&gt;The Spring sample I got working with Okta was Vincenzo De Notaris&apos; &lt;a
    href=&quot;https://github.com/vdenotaris/spring-boot-security-saml-sample&quot;&gt;spring-boot-security-saml-sample&lt;/a&gt;. This
    project uses &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt; and &lt;a
        href=&quot;http://projects.spring.io/spring-security-saml/&quot;&gt;Spring Security SAML&lt;/a&gt;. I created a &quot;Okta Spring Example&quot; application on Okta with the following settings.&lt;/p&gt;
&lt;table class=&quot;comparison&quot;&gt;
    &lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;Setting&lt;/th&gt;
        &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;Application label&lt;/td&gt;
        &lt;td&gt;Okta Spring Example&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Force Authentication&lt;/td&gt;
        &lt;td&gt;false&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Post Back URL&lt;/td&gt;
        &lt;td&gt;http://localhost:8080/saml/SSO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Name ID Format&lt;/td&gt;
        &lt;td&gt;EmailAddress&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Recipient&lt;/td&gt;
        &lt;td&gt;http://localhost:8080/saml/SSO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Audience Restriction&lt;/td&gt;
        &lt;td&gt;com:vdenotaris:spring:sp&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;authnContextClassRef&lt;/td&gt;
        &lt;td&gt;PasswordProtectedTransport&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Response&lt;/td&gt;
        &lt;td&gt;Signed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Assertion&lt;/td&gt;
        &lt;td&gt;Signed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Request&lt;/td&gt;
        &lt;td&gt;Uncompressed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Destination&lt;/td&gt;
        &lt;td&gt;http://localhost:8080/saml/SSO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Attribute Statements&lt;/td&gt;
        &lt;td&gt;email|${user.email},firstName|${user.firstName}&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The biggest thing I learned while trying to get these values correct was that &lt;a
    href=&quot;http://stackoverflow.com/questions/27713524/how-do-i-configure-spring-security-saml-to-work-with-okta&quot;&gt;Request
    needs to be set to &lt;strong&gt;Uncompressed&lt;/strong&gt;&lt;/a&gt;.
&lt;p&gt;After cloning the GitHub project to my hard drive, I added a new SSO provider by adding a new bean to &lt;code&gt;WebSecurityConfig.java&lt;/code&gt;.
    The URL I got from Okta&apos;s Admin UI: Sign On &gt; View Setup Instructions &gt; Public Link (near the bottom of the page).
&lt;pre class=&quot;brush: java&quot;&gt;
@Bean(name = &quot;idp-okta&quot;)
public ExtendedMetadataDelegate ssoOktaExtendedMetadataProvider()
      throws MetadataProviderException {
    @SuppressWarnings({ &quot;deprecation&quot;})
    HTTPMetadataProvider httpMetadataProvider
          = new HTTPMetadataProvider(&quot;https://client.okta.com/app/random-key-here/sso/saml/metadata&quot;, 5000);
    httpMetadataProvider.setParserPool(parserPool());
    ExtendedMetadataDelegate extendedMetadataDelegate =
          new ExtendedMetadataDelegate(httpMetadataProvider, extendedMetadata());
    extendedMetadataDelegate.setMetadataTrustCheck(false);
    extendedMetadataDelegate.setMetadataRequireSignature(false);
    return extendedMetadataDelegate;
}
&lt;/pre&gt;
&lt;p&gt;For the SSL connection to work, I had to download the certificate and import it into the application&apos;s keystore. To
    do this in Chrome, I went to https://client.okta.com, clicked on the lock icon in the address bar, then
    dragged/dropped the certificate image to my desktop. This resulted in a &lt;code&gt;*.okta.com.cer&lt;/code&gt; file on my
    desktop. I added it to the keystore using the following commands (thanks &lt;a
        href=&quot;http://stackoverflow.com/questions/4325263/how-to-import-a-cer-certificate-into-a-java-keystore&quot;&gt;Stack
        Overflow&lt;/a&gt;).&lt;/p&gt;
&lt;pre&gt;
keytool -importcert -file ~/Desktop/\*.okta.com.cer -keystore src/main/resources/saml/samlKeystore.jks
&lt;/pre&gt;
&lt;p&gt;When prompted for the password, I entered &quot;nalle123&quot;. This value is specified in WebSecurityConfig.java&apos;s &lt;code&gt;keyManager&lt;/code&gt;
    bean. I then added this provider to the list of providers in the &lt;code&gt;metadata&lt;/code&gt; bean.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Bean
@Qualifier(&quot;metadata&quot;)
public CachingMetadataManager metadata() throws MetadataProviderException {
        List&amp;lt;MetadataProvider&gt; providers = new ArrayList&amp;lt;MetadataProvider&gt;();
    providers.add(ssoOktaExtendedMetadataProvider());
    providers.add(ssoCircleExtendedMetadataProvider());
    return new CachingMetadataManager(providers);
}
&lt;/pre&gt;
&lt;p&gt;After making these changes, I started the application using &quot;mvn spring-boot:run&quot;. I navigated to
    http://localhost:8080, chose Okta as my Idp and logged in successfully!&lt;/p&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;This article shows you how I got Node.js, Ruby and Spring applications working with Okta&apos;s SAML support.
    My experience with this when I first tried it: Node was super-easy, Ruby was a bit more difficult, JRuby was
    a cinch and Spring took several days. As you can tell from this article, Ruby/JRuby were the most difficult to
    make work on a clean machine. 
&lt;/p&gt;
&lt;p&gt;All in all, working with Okta has been a pleasant experience so far. Hopefully this article helps make it a good experience for you as well.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_reduced</guid>
    <title>AppFuse, Reduced</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_reduced</link>
        <pubDate>Tue, 16 Dec 2014 06:03:31 -0700</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>maven</category>
    <category>maintenance</category>
    <category>lessxml</category>
    <category>appfuse</category>
    <category>spring</category>
    <atom: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;</atom:summary>        <description>&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;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/devoxx4kids_denver_having_fun_with</guid>
    <title>Devoxx4Kids Denver: Having fun with littleBits</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/devoxx4kids_denver_having_fun_with</link>
        <pubDate>Tue, 2 Dec 2014 12:10:49 -0700</pubDate>
    <category>Java</category>
    <category>devoxx4kids</category>
    <category>denver</category>
    <category>littlebits</category>
    <category>mcginityphoto</category>
    <category>tackmobile</category>
    <category>assemblyws</category>
    <atom:summary type="html">&lt;p&gt;
    A little more than a week ago, on a beautiful Saturday morning, a number of Denver kids converged at &lt;a
        href=&quot;http://www.assembly.ws/&quot;&gt;Assembly&lt;/a&gt; to learn about &lt;a
        href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/216557092/&quot;&gt;hardware concepts with littleBits&lt;/a&gt;. This
    meetup was a bit different than our &lt;a href=&quot;http://raibledesigns.com/rd/entry/first_devoxx4kids_in_denver_a&quot;&gt;last
        meeting&lt;/a&gt; in that the kids built stuff with their hands rather than on computers.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm9.staticflickr.com/8620/15711549208_b1d9a0945f_c.jpg&quot;
       title=&quot;Supplies by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15711549208&quot;&gt;&lt;img
        src=&quot;https://farm9.staticflickr.com/8620/15711549208_b1d9a0945f_n.jpg&quot; height=&quot;213&quot; alt=&quot;Supplies&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;https://farm8.staticflickr.com/7477/15873240536_5350eae01f_c.jpg&quot;
       title=&quot;Devoxx4Kids Sign by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15873240536&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7477/15873240536_5350eae01f_m.jpg&quot; width=&quot;160&quot; height=&quot;213&quot;
        alt=&quot;Devoxx4Kids Sign&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    The workshop was taught by
    &lt;a href=&quot;https://twitter.com/juansanchez&quot;&gt;Juan Sanchez&lt;/a&gt; of &lt;a href=&quot;https://twitter.com/tackmobile&quot;&gt;Tack
    Mobile&lt;/a&gt;. Juan did an excellent job of keeping his presentation short and sweet and got the kids building
    things within the first hour. The event space provided by Assembly was excellent and we look forward to
    &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/219019619/&quot;&gt;December&apos;s Greenfoot Workshop&lt;/a&gt; at the same
    location.

&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;https://farm8.staticflickr.com/7502/15713320297_7e878f557d_c.jpg&quot;
       title=&quot;Juan in Action by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15713320297&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7502/15713320297_7e878f557d.jpg&quot; width=&quot;500&quot; 
        alt=&quot;Juan in Action&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
    A little more than a week ago, on a beautiful Saturday morning, a number of Denver kids converged at &lt;a
        href=&quot;http://www.assembly.ws/&quot;&gt;Assembly&lt;/a&gt; to learn about &lt;a
        href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/216557092/&quot;&gt;hardware concepts with littleBits&lt;/a&gt;. This
    meetup was a bit different than our &lt;a href=&quot;http://raibledesigns.com/rd/entry/first_devoxx4kids_in_denver_a&quot;&gt;last
        meeting&lt;/a&gt; in that the kids built stuff with their hands rather than on computers.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm9.staticflickr.com/8620/15711549208_b1d9a0945f_c.jpg&quot;
       title=&quot;Supplies by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15711549208&quot;&gt;&lt;img
        src=&quot;https://farm9.staticflickr.com/8620/15711549208_b1d9a0945f_n.jpg&quot; height=&quot;213&quot; alt=&quot;Supplies&quot;
        style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;https://farm8.staticflickr.com/7477/15873240536_5350eae01f_c.jpg&quot;
       title=&quot;Devoxx4Kids Sign by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15873240536&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7477/15873240536_5350eae01f_m.jpg&quot; width=&quot;160&quot; height=&quot;213&quot;
        alt=&quot;Devoxx4Kids Sign&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    The workshop was taught by
    &lt;a href=&quot;https://twitter.com/juansanchez&quot;&gt;Juan Sanchez&lt;/a&gt; of &lt;a href=&quot;https://twitter.com/tackmobile&quot;&gt;Tack
    Mobile&lt;/a&gt;. Juan did an excellent job of keeping his presentation short and sweet and got the kids building
    things within the first hour. The event space provided by Assembly was excellent and we look forward to
    &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/219019619/&quot;&gt;December&apos;s Greenfoot Workshop&lt;/a&gt; at the same
    location.

&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;https://farm8.staticflickr.com/7502/15713320297_7e878f557d_c.jpg&quot;
       title=&quot;Juan in Action by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15713320297&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7502/15713320297_7e878f557d.jpg&quot; width=&quot;500&quot; 
        alt=&quot;Juan in Action&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;https://twitter.com/mojavelinux&quot;&gt;Dan Allen&lt;/a&gt; was a big help in planning this meetup. Dan put me in touch
    with &lt;a href=&quot;https://github.com/coreyd303&quot;&gt;Corey Davis&lt;/a&gt; from Denver&apos;s &lt;a href=&quot;http://turing.io/&quot;&gt;Turing
    School&lt;/a&gt;. Corey introduced me to &lt;a href=&quot;https://twitter.com/rwarbelow&quot;&gt;Rachel Warbelow&lt;/a&gt;, the pedagogy lead at
    Turing. Rachel not only volunteered at the event, but she brought a number of students with her to help out. There were a couple other volunteers as well, 
including my daughter&apos;s video game programming teacher from Campus
    Middle School. Everything went quite smooth with so much help. Thanks all!&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm9.staticflickr.com/8575/15711598618_859800b3d9_c.jpg&quot;
       title=&quot;Full class with lots of volunteers by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15711598618&quot;&gt;&lt;img
        src=&quot;https://farm9.staticflickr.com/8575/15711598618_859800b3d9.jpg&quot; width=&quot;500&quot; 
        alt=&quot;Full class with lots of volunteers&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://farm8.staticflickr.com/7493/15711792060_b0efccb2d2_c.jpg&quot;
       title=&quot;Happy kids and helpful volunteers by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kidslittlebits]&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/15711792060&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7493/15711792060_b0efccb2d2.jpg&quot; width=&quot;500&quot; 
        alt=&quot;Happy kids and helpful volunteers&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Devoxx4Kids USA now owns a &lt;a href=&quot;http://littlebits.cc/collections/workshop-set&quot;&gt;littleBits workshop set&lt;/a&gt; thanks
    to a generous donation from Raible Designs. If you&apos;re running
    a Devoxx4Kids meetup with littleBits, please let me know. I&apos;d be happy to ship the set for you to use.&lt;/p&gt;
&lt;p&gt;Juan&apos;s presentation on hardware concepts can be found &lt;a
    href=&quot;//www.slideshare.net/tackmobile/introduction-to-hardware-with-littlebits&quot;
    title=&quot;Introduction to Hardware with littleBits&quot; target=&quot;_blank&quot;&gt;on SlideShare&lt;/a&gt; or viewed below.&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
    &lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/41965526&quot; width=&quot;595&quot; height=&quot;485&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; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://twitter.com/trishphoto&quot;&gt;McGinity Photo&lt;/a&gt; for all the pictures above. You 
    &lt;a href=&quot;https://www.flickr.com/photos/mcginityphoto/sets/72157649514351305/&quot;&gt;find many more on Flickr&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Our next meetup will be a &lt;a href=&quot;http://www.greenfoot.org/door&quot;&gt;Greenfoot&lt;/a&gt; workshop with &lt;a href=&quot;https://twitter.com/thesteve0&quot;&gt;Steve Pousty&lt;/a&gt; on December 13th. Please &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/219019619/&quot;&gt;RSVP&lt;/a&gt; if you&apos;d like to attend!</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/building_a_rest_api_with</guid>
    <title>Building a REST API with JAXB, Spring Boot and Spring Data</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/building_a_rest_api_with</link>
        <pubDate>Wed, 29 Oct 2014 05:52:37 -0600</pubDate>
    <category>Java</category>
    <category>jaxb</category>
    <category>rest</category>
    <category>spring-boot</category>
    <category>spring</category>
    <category>api</category>
    <category>spring-data</category>
    <atom:summary type="html">&lt;p&gt;
&lt;a href=&quot;https://jaxb.java.net/&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/javaxml-duke.gif&quot; alt=&quot;Project JAXB&quot; width=&quot;100&quot; class=&quot;picture&quot; style=&quot;margin-top: -20px&quot;&gt;&lt;/a&gt;
    If someone asked you to develop a REST API on the JVM, which frameworks would you use? I was recently tasked with such a project.
    My client asked me to implement a REST API to ingest requests from a 3rd party. The project entailed consuming XML
    requests, storing the data in a database, then exposing the data to internal application with a JSON endpoint.
    Finally, it would allow taking in a JSON request and turning it into an XML request back to the 3rd party.
&lt;/p&gt;
&lt;p&gt;
    With the recent &lt;a href=&quot;http://www.infoq.com/news/2014/10/apache-camel-2.14&quot;&gt;release of Apache Camel 2.14&lt;/a&gt; and
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel2&quot;&gt;my success using it&lt;/a&gt;, I started by
    copying my Apache Camel / CXF / Spring Boot project and trimming it down to the bare essentials. I whipped together
    a simple &lt;em&gt;Hello World&lt;/em&gt; service using Camel and Spring MVC. I also integrated Swagger into both. Both
    implementations were pretty easy to create (&lt;a href=&quot;http://camel.465427.n5.nabble.com/Camel-s-Swagger-vs-Spring-MVC-Swagger-td5757023.html&quot;&gt;sample code&lt;/a&gt;),
    but I decided to use Spring MVC. My reasons were simple: its REST support was more mature, I knew it well, and
    &lt;a href=&quot;http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/testing.html#spring-mvc-test-framework&quot;&gt;Spring MVC Test&lt;/a&gt; makes it easy to test APIs.
&lt;/p&gt;
&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Camel&apos;s Swagger support without web.xml&lt;/strong&gt;&lt;br/&gt;
    As part of the aforementioned spike, I learned out how to configure Camel&apos;s REST and Swagger support using Spring&apos;s
    JavaConfig and no web.xml. I made this into a sample project and put it on GitHub as
    &lt;a href=&quot;https://github.com/mraible/camel-rest-swagger&quot;&gt;camel-rest-swagger&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    This article shows how I built a REST API with Java 8, Spring Boot/MVC, JAXB and Spring Data (JPA and REST
    components).
    I stumbled a few times while developing this project, but figured out how to get over all the hurdles. I hope this
    helps the team that&apos;s now maintaining this project (my last day was Friday) and those that are trying to do
    something similar.
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
&lt;a href=&quot;https://jaxb.java.net/&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/javaxml-duke.gif&quot; alt=&quot;Project JAXB&quot; width=&quot;100&quot; class=&quot;picture&quot; style=&quot;margin-top: -20px&quot;&gt;&lt;/a&gt;
    If someone asked you to develop a REST API on the JVM, which frameworks would you use? I was recently tasked with such a project.
    My client asked me to implement a REST API to ingest requests from a 3rd party. The project entailed consuming XML
    requests, storing the data in a database, then exposing the data to internal application with a JSON endpoint.
    Finally, it would allow taking in a JSON request and turning it into an XML request back to the 3rd party.
&lt;/p&gt;
&lt;p&gt;
    With the recent &lt;a href=&quot;http://www.infoq.com/news/2014/10/apache-camel-2.14&quot;&gt;release of Apache Camel 2.14&lt;/a&gt; and
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel2&quot;&gt;my success using it&lt;/a&gt;, I started by
    copying my Apache Camel / CXF / Spring Boot project and trimming it down to the bare essentials. I whipped together
    a simple &lt;em&gt;Hello World&lt;/em&gt; service using Camel and Spring MVC. I also integrated Swagger into both. Both
    implementations were pretty easy to create (&lt;a href=&quot;http://camel.465427.n5.nabble.com/Camel-s-Swagger-vs-Spring-MVC-Swagger-td5757023.html&quot;&gt;sample code&lt;/a&gt;),
    but I decided to use Spring MVC. My reasons were simple: its REST support was more mature, I knew it well, and
    &lt;a href=&quot;http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/testing.html#spring-mvc-test-framework&quot;&gt;Spring MVC Test&lt;/a&gt; makes it easy to test APIs.
&lt;/p&gt;
&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;Camel&apos;s Swagger support without web.xml&lt;/strong&gt;&lt;br/&gt;
    As part of the aforementioned spike, I learned out how to configure Camel&apos;s REST and Swagger support using Spring&apos;s
    JavaConfig and no web.xml. I made this into a sample project and put it on GitHub as
    &lt;a href=&quot;https://github.com/mraible/camel-rest-swagger&quot;&gt;camel-rest-swagger&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    This article shows how I built a REST API with Java 8, Spring Boot/MVC, JAXB and Spring Data (JPA and REST
    components).
    I stumbled a few times while developing this project, but figured out how to get over all the hurdles. I hope this
    helps the team that&apos;s now maintaining this project (my last day was Friday) and those that are trying to do
    something similar.
&lt;/p&gt;
&lt;h3 id=&quot;jaxb&quot;&gt;XML to Java with JAXB&lt;/h3&gt;
&lt;p&gt;
    The data we needed to ingest from a 3rd party was based on the &lt;a href=&quot;http://ncpdp.org/&quot;&gt;NCPDP&lt;/a&gt; Standards. As a member,
    we were able to download a number of XSD files, put them in our project and generate Java classes to handle the
    incoming/outgoing requests. I used the &lt;a href=&quot;https://java.net/projects/maven-jaxb2-plugin/pages/Home&quot;&gt;maven-jaxb2-plugin&lt;/a&gt;
    to generate the Java classes.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.jvnet.jaxb2.maven2&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-jaxb2-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.8.3&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;generate&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;args&amp;gt;
                    &amp;lt;arg&amp;gt;-XtoString&amp;lt;/arg&amp;gt;
                    &amp;lt;arg&amp;gt;-Xequals&amp;lt;/arg&amp;gt;
                    &amp;lt;arg&amp;gt;-XhashCode&amp;lt;/arg&amp;gt;
                    &amp;lt;arg&amp;gt;-Xcopyable&amp;lt;/arg&amp;gt;
                &amp;lt;/args&amp;gt;
                &amp;lt;plugins&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.jvnet.jaxb2_commons&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;jaxb2-basics&amp;lt;/artifactId&amp;gt;
                        &amp;lt;version&amp;gt;0.6.4&amp;lt;/version&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                &amp;lt;/plugins&amp;gt;
                &amp;lt;schemaDirectory&amp;gt;src/main/resources/schemas/ncpdp&amp;lt;/schemaDirectory&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The first error I ran into was about a property already being defined.
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
[INFO] --- maven-jaxb2-plugin:0.8.3:generate (default) @ spring-app ---
[ERROR] Error while parsing schema(s).Location [ file:/Users/mraible/dev/spring-app/src/main/resources/schemas/ncpdp/structures.xsd{1811,48}].
com.sun.istack.SAXParseException2; systemId: file:/Users/mraible/dev/spring-app/src/main/resources/schemas/ncpdp/structures.xsd;
    lineNumber: 1811; columnNumber: 48; Property &quot;MultipleTimingModifierAndTimingAndDuration&quot; is already defined.
    Use &amp;lt;jaxb:property&gt; to resolve this conflict.
at com.sun.tools.xjc.ErrorReceiver.error(ErrorReceiver.java:86)
&lt;/pre&gt;
&lt;p&gt;
    I was able to workaround this by upgrading to maven-jaxb2-plugin version 0.9.1. I created a controller and stubbed
    out a response with hard-coded data. I confirmed the incoming XML-to-Java marshalling worked by testing with a
    sample request provided by our 3rd party customer. I started with a &lt;code&gt;curl&lt;/code&gt;
    command, because it was easy to use and could be run by anyone with the file and curl installed.
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
curl -X POST -H &apos;Accept: application/xml&apos; -H &apos;Content-type: application/xml&apos; \
--data-binary @sample-request.xml http://localhost:8080/api/message -v
&lt;/pre&gt;
&lt;p&gt;
    This is when I ran into another stumbling block: the response wasn&apos;t getting marshalled back to XML correctly.
    After some research, I found out this was caused by the lack of &lt;code&gt;@XmlRootElement&lt;/code&gt; annotations on my
    generated classes.
    I
    posted a question to Stack Overflow titled &lt;a
        href=&quot;http://stackoverflow.com/questions/26070566/returning-jaxb-generated-elements-from-spring-boot-controller&quot;&gt;
    Returning JAXB-generated elements from Spring Boot Controller&lt;/a&gt;. After banging my head against the wall for a
    couple days, I figured out &lt;a href=&quot;http://stackoverflow.com/a/26124104/65681&quot;&gt;the solution&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    I created a bindings.xjb file in the same directory as my schemas. This causes JAXB to generate &lt;code&gt;@XmlRootElement&lt;/code&gt;
    on
    classes.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;jxb:bindings version=&quot;1.0&quot;
              xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;
              xmlns:jxb=&quot;http://java.sun.com/xml/ns/jaxb&quot;
              xmlns:xjc=&quot;http://java.sun.com/xml/ns/jaxb/xjc&quot;
              xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
              xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd&quot;&amp;gt;

    &amp;lt;jxb:bindings schemaLocation=&quot;transport.xsd&quot; node=&quot;/xsd:schema&quot;&amp;gt;
        &amp;lt;jxb:globalBindings&amp;gt;
            &amp;lt;xjc:simple/&amp;gt;
        &amp;lt;/jxb:globalBindings&amp;gt;
    &amp;lt;/jxb:bindings&amp;gt;
&amp;lt;/jxb:bindings&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To add namespaces prefixes to the returned XML, I had to modify the maven-jaxb2-plugin to add a couple arguments.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;arg&amp;gt;-extension&amp;lt;/arg&amp;gt;
&amp;lt;arg&amp;gt;-Xnamespace-prefix&amp;lt;/arg&amp;gt;
&lt;/pre&gt;
&lt;p&gt;And add a dependency:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.jvnet.jaxb2_commons&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;jaxb2-namespace-prefix&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Then I modified &lt;code&gt;bindings.xjb&lt;/code&gt; to include the package and prefix settings. I also moved
    &lt;code&gt;&amp;lt;xjc:simple/&amp;gt;&lt;/code&gt; into a global setting. I eventually had to add prefixes for all schemas and their
    packages. &lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;bindings version=&quot;2.0&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns=&quot;http://java.sun.com/xml/ns/jaxb&quot;
          xmlns:xjc=&quot;http://java.sun.com/xml/ns/jaxb/xjc&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
          xmlns:namespace=&quot;http://jaxb2-commons.dev.java.net/namespace-prefix&quot;
          xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
              http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd&quot;&amp;gt;

    &amp;lt;globalBindings&amp;gt;
        &amp;lt;xjc:simple/&amp;gt;
    &amp;lt;/globalBindings&amp;gt;

    &amp;lt;bindings schemaLocation=&quot;transport.xsd&quot; node=&quot;/xsd:schema&quot;&amp;gt;
        &amp;lt;schemaBindings&amp;gt;
            &amp;lt;package name=&quot;org.ncpdp.schema.transport&quot;/&amp;gt;
        &amp;lt;/schemaBindings&amp;gt;
        &amp;lt;bindings&amp;gt;
            &amp;lt;namespace:prefix name=&quot;transport&quot;/&amp;gt;
        &amp;lt;/bindings&amp;gt;
    &amp;lt;/bindings&amp;gt;
&amp;lt;/bindings&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
    I learned how to add prefixes from the &lt;a href=&quot;https://java.net/projects/jaxb2-commons/pages/Namespace-prefix&quot;&gt;namespace-prefix
    plugins page&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Finally, I customized the code-generation process to generate Joda Time&apos;s
    &lt;a href=&quot;http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html&quot;&gt;DateTime&lt;/a&gt; instead of the
    default &lt;code&gt;XMLGregorianCalendar&lt;/code&gt;. This involved a couple custom XmlAdapters and a couple
    additional lines in &lt;code&gt;bindings.xjb&lt;/code&gt;. You can see the adapters and &lt;code&gt;bindings.xjb&lt;/code&gt; with all
    necessary prefixes
    in &lt;a href=&quot;https://gist.github.com/mraible/abad8d78c1f053ec686b&quot;&gt;this gist&lt;/a&gt;.
    Nicolas Fr&#228;nkel&apos;s &lt;a href=&quot;http://blog.frankel.ch/customize-your-jaxb-bindings&quot;&gt;Customize your JAXB bindings&lt;/a&gt;
    was a great resource for making all this work.
&lt;/p&gt;
&lt;p&gt;I wrote a test to prove that the ingest API worked as desired.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class InitiateRequestControllerTest {

    @Inject
    private InitiateRequestController controller;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void testGetNotAllowedOnMessagesAPI() throws Exception {
        mockMvc.perform(get(&quot;/api/initiate&quot;)
                .accept(MediaType.APPLICATION_XML))
                .andExpect(status().isMethodNotAllowed());
    }

    @Test
    public void testPostPaInitiationRequest() throws Exception {
        String request = new Scanner(new ClassPathResource(&quot;sample-request.xml&quot;).getFile()).useDelimiter(&quot;\\Z&quot;).next();

        mockMvc.perform(post(&quot;/api/initiate&quot;)
                .accept(MediaType.APPLICATION_XML)
                .contentType(MediaType.APPLICATION_XML)
                .content(request))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_XML))
                .andExpect(xpath(&quot;/Message/Header/To&quot;).string(&quot;3rdParty&quot;))
                .andExpect(xpath(&quot;/Message/Header/SenderSoftware/SenderSoftwareDeveloper&quot;).string(&quot;HID&quot;))
                .andExpect(xpath(&quot;/Message/Body/Status/Code&quot;).string(&quot;010&quot;));
    }
}
&lt;/pre&gt;
&lt;h3 id=&quot;spring-data&quot;&gt;Spring Data for JPA and REST&lt;/h3&gt;
&lt;p&gt;
    With JAXB out of the way, I turned to creating an internal API that could be used by another application. Spring
    Data was fresh in my mind after &lt;a href=&quot;http://shop.oreilly.com/product/0636920024767.do&quot;&gt;reading about it&lt;/a&gt; last
    summer. I created classes for entities I wanted to persist, using &lt;a href=&quot;http://projectlombok.org/&quot;&gt;Lombok&apos;s&lt;/a&gt;
    @Data to reduce boilerplate.
&lt;/p&gt;
&lt;p&gt;
    I read the &lt;a href=&quot;https://spring.io/guides/gs/accessing-data-jpa/&quot;&gt;Accessing Data with JPA&lt;/a&gt; guide, created
    a couple repositories and wrote some tests to prove they worked. I ran into an issue trying to persist
    Joda&apos;s DateTime and found &lt;a href=&quot;http://jadira.sourceforge.net/usertype-userguide.html&quot;&gt;Jadira&lt;/a&gt; provided a
    solution.
&lt;/p&gt;
&lt;p&gt;
    I added its usertype.core as a dependency to my pom.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.jadira.usertype&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;usertype.core&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.2.0.GA&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;... and annotated DateTime variables accordingly.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Column(name = &quot;last_modified&quot;, nullable = false)
@Type(type=&quot;org.jadira.usertype.dateandtime.joda.PersistentDateTime&quot;)
private DateTime lastModified;
&lt;/pre&gt;
&lt;p&gt;With JPA working, I turned to exposing REST endpoints. I used &lt;a
        href=&quot;https://spring.io/guides/gs/accessing-data-rest/&quot;&gt;Accessing JPA Data with REST&lt;/a&gt;
    as a guide and was looking at JSON in my browser in a matter of minutes. I was surprised to see a &quot;profile&quot; service
    listed next to mine, and posted &lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/1718&quot;&gt;a question&lt;/a&gt;
    to the Spring Boot team. Oliver Gierke &lt;a
            href=&quot;https://github.com/spring-projects/spring-boot/issues/1718#issuecomment-59329942&quot;&gt;provided an
        excellent answer&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;swagger&quot;&gt;Swagger&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;Spring MVC&apos;s integration for Swagger&lt;/a&gt; has greatly
    improved
    since I &lt;a href=&quot;http://raibledesigns.com/rd/entry/documenting_your_spring_api_with&quot;&gt;last wrote about it&lt;/a&gt;.
    Now you can enable it with a &lt;code&gt;@EnableSwagger&lt;/code&gt; annotation. Below
    is the &lt;code&gt;SwaggerConfig&lt;/code&gt; class I used to configure Swagger and read properties from
    &lt;code&gt;application.yml&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Configuration
@EnableSwagger
public class SwaggerConfig implements EnvironmentAware {
	public static final String DEFAULT_INCLUDE_PATTERN = &quot;/api/.*&quot;;

	private RelaxedPropertyResolver propertyResolver;

	@Override
	public void setEnvironment(Environment environment) {
		this.propertyResolver = new RelaxedPropertyResolver(environment, &quot;swagger.&quot;);
	}

	/**
	 * Swagger Spring MVC configuration
	 */
	@Bean
	public SwaggerSpringMvcPlugin swaggerSpringMvcPlugin(SpringSwaggerConfig springSwaggerConfig) {
		return new SwaggerSpringMvcPlugin(springSwaggerConfig)
				.apiInfo(apiInfo())
				.genericModelSubstitutes(ResponseEntity.class)
				.includePatterns(DEFAULT_INCLUDE_PATTERN);
	}

	/**
	 * API Info as it appears on the swagger-ui page
	 */
	private ApiInfo apiInfo() {
		return new ApiInfo(
				propertyResolver.getProperty(&quot;title&quot;),
				propertyResolver.getProperty(&quot;description&quot;),
				propertyResolver.getProperty(&quot;termsOfServiceUrl&quot;),
				propertyResolver.getProperty(&quot;contact&quot;),
				propertyResolver.getProperty(&quot;license&quot;),
				propertyResolver.getProperty(&quot;licenseUrl&quot;));
	}
}
&lt;/pre&gt;
&lt;p&gt;After getting Swagger to work, I discovered that endpoints published with &lt;code&gt;@RepositoryRestResource&lt;/code&gt; aren&apos;t
    picked up by Swagger. There is an &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc/issues/238&quot;&gt;open issue&lt;/a&gt;
    for Spring Data support in the swagger-springmvc project.&lt;/p&gt;

&lt;h3 id=&quot;liquibase&quot;&gt;Liquibase Integration&lt;/h3&gt;
&lt;p&gt;
    I configured this project to use H2 in development and PostgreSQL in production. I used Spring profiles to do this
    and copied XML/YAML (for Maven and application*.yml files) from a previously created &lt;a href=&quot;https://jhipster.github.io&quot;&gt;JHipster&lt;/a&gt;
    project.
&lt;/p&gt;
&lt;p&gt;Next, I needed to create a database. I decided to use &lt;a href=&quot;http://www.liquibase.org/&quot;&gt;Liquibase&lt;/a&gt; to
    create tables, rather than Hibernate&apos;s schema-export. I chose Liquibase
    over &lt;a href=&quot;http://flywaydb.org/&quot;&gt;Flyway&lt;/a&gt; based of discussions in the &lt;a
            href=&quot;https://github.com/jhipster/generator-jhipster/issues/588&quot;&gt;JHipster project&lt;/a&gt;. To use Liquibase with
    Spring Boot is dead simple: add the following dependency to pom.xml, then place changelog files in
    &lt;code&gt;src/main/resources/db/changelog&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.liquibase&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;liquibase-core&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;p&gt;
    I started by using Hibernate&apos;s schema-export and changing &lt;code&gt;hibernate.ddl-auto&lt;/code&gt; to &quot;create-drop&quot; in
    &lt;code&gt;application-dev.yml&lt;/code&gt;. I also commented out the liquibase-core dependency.
    Then I setup a PostgreSQL database and started the app with &quot;mvn spring-boot:run -Pprod&quot;.
&lt;/p&gt;
&lt;p&gt;I generated the liquibase changelog from an existing schema using the following command (after
    &lt;a href=&quot;http://www.liquibase.org/download/&quot;&gt;downloading&lt;/a&gt; and installing Liquibase). &lt;/p&gt;
&lt;pre&gt;
liquibase --driver=org.postgresql.Driver --classpath=&quot;/Users/mraible/.m2/repository/org/postgresql/postgresql/9.3-1102-jdbc41/postgresql-9.3-1102-jdbc41.jar:/Users/mraible/snakeyaml-1.11.jar&quot; --changeLogFile=/Users/mraible/dev/spring-app/src/main/resources/db/changelog/db.changelog-02.yaml --url=&quot;jdbc:postgresql://localhost:5432/mydb&quot; --username=user --password=pass generateChangeLog
&lt;/pre&gt;

&lt;p&gt;I did find one bug - the generateChangeLog command &lt;a href=&quot;https://liquibase.jira.com/browse/CORE-2056&quot;&gt;generates
    too many constraints in version 3.2.2&lt;/a&gt;. I was able to fix this by manually editing the generated YAML file.
&lt;/p&gt;
&lt;div class=&quot;alert alert-success&quot;&gt;&lt;p style=&quot;margin-top: 5px&quot;&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you want to drop all tables in your database to verify
    Liquibase creation is working in PostgeSQL, run the following commands:&lt;/p&gt;
&lt;pre style=&quot;margin-bottom: 5px&quot;&gt;psql -d mydb
drop schema public cascade;
create schema public;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After writing minimal code for Spring Data and configuring Liquibase to create tables/relationships, I relaxed
    a bit, documented how everything worked and added a &lt;a href=&quot;https://github.com/isrsal/spring-mvc-logger&quot;&gt;LoggingFilter&lt;/a&gt;.
    The LoggingFilter was handy for viewing API requests and responses.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
@Bean
public FilterRegistrationBean loggingFilter() {
    LoggingFilter filter = new LoggingFilter();
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(filter);
    registrationBean.setUrlPatterns(Arrays.asList(&quot;/api/*&quot;));
    return registrationBean;
}
&lt;/pre&gt;
&lt;h3 id=&quot;resttemplate&quot;&gt;Accessing API with RestTemplate&lt;/h3&gt;
&lt;p&gt;The final step I needed to do was figure out how to access my new and fancy API with
    &lt;a href=&quot;http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html&quot;&gt;RestTemplate&lt;/a&gt;.
    At first, I thought it would be easy. Then I realized that Spring Data produces a
    &lt;a href=&quot;http://stateless.co/hal_specification.html&quot;&gt;HAL&lt;/a&gt;-compliant API, so its content is embedded inside an
    &quot;_embedded&quot; JSON key.
&lt;/p&gt;
&lt;p&gt;After much trial and error, I discovered I needed to create a &lt;code&gt;RestTemplate&lt;/code&gt; with HAL and Joda-Time
    awareness.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Bean
public RestTemplate restTemplate() {
	ObjectMapper mapper = new ObjectMapper();
	mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	mapper.registerModule(new Jackson2HalModule());
	mapper.registerModule(new JodaModule());

	MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
	converter.setSupportedMediaTypes(MediaType.parseMediaTypes(&quot;application/hal+json&quot;));
	converter.setObjectMapper(mapper);
	StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
	stringConverter.setSupportedMediaTypes(MediaType.parseMediaTypes(&quot;application/xml&quot;));

	List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters = new ArrayList&amp;lt;&amp;gt;();
	converters.add(converter);
	converters.add(stringConverter);

	return new RestTemplate(converters);
}
&lt;/pre&gt;
&lt;p&gt;
    The &lt;code&gt;JodaModule&lt;/code&gt; was provided by the following dependency:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.fasterxml.jackson.datatype&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jackson-datatype-joda&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;With the configuration complete, I was able to write a &lt;code&gt;MessagesApiITest&lt;/code&gt; integration test that posts a
    request
    and retrieves it using the API. The API was secured using basic authentication, so it took me a bit to figure out
    how
    to make that work with RestTemplate. Willie Wheeler&apos;s
    &lt;a href=&quot;http://springinpractice.com/2013/10/02/quick-tip-basic-authentication-with-spring-resttemplate&quot;&gt;Basic
        Authentication With Spring RestTemplate&lt;/a&gt; was a big help.&lt;/p&gt;

&lt;pre class=&quot;brush: java&quot;&gt;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = IntegrationTestConfig.class)
public class MessagesApiITest {
    private final static Log log = LogFactory.getLog(MessagesApiITest.class);
    @Value(&quot;http://${app.host}/api/initiate&quot;)
    private String initiateAPI;
    @Value(&quot;http://${app.host}/api/messages&quot;)
    private String messagesAPI;
    @Value(&quot;${app.host}&quot;)
    private String host;
    @Inject
    private RestTemplate restTemplate;

    @Before
    public void setup() throws Exception {
        String request = new Scanner(new ClassPathResource(&quot;sample-request.xml&quot;).getFile()).useDelimiter(&quot;\\Z&quot;).next();

        ResponseEntity&amp;lt;org.ncpdp.schema.transport.Message&amp;gt; response = restTemplate.exchange(getTestUrl(initiateAPI),
                HttpMethod.POST, getBasicAuthHeaders(request), org.ncpdp.schema.transport.Message.class,
                Collections.emptyMap());
        assertEquals(HttpStatus.OK, response.getStatusCode());
    }

    @Test
    public void testGetMessages() {
        HttpEntity&amp;lt;String&amp;gt; request = getBasicAuthHeaders(null);

        ResponseEntity&amp;lt;PagedResources&amp;lt;Message&amp;gt;&amp;gt; result = restTemplate.exchange(getTestUrl(messagesAPI), HttpMethod.GET,
                request, new ParameterizedTypeReference&amp;lt;PagedResources&amp;lt;Message&amp;gt;&amp;gt;() {});
        HttpStatus status = result.getStatusCode();
        Collection&amp;lt;Message&amp;gt; messages = result.getBody().getContent();

        log.debug(&quot;messages found: &quot; + messages.size());
        assertEquals(HttpStatus.OK, status);
        for (Message message : messages) {
            log.debug(&quot;message.id: &quot; + message.getId());
            log.debug(&quot;message.dateCreated: &quot; + message.getDateCreated());
        }
    }

    private HttpEntity&amp;lt;String&amp;gt; getBasicAuthHeaders(String body) {
        String plainCreds = &quot;user:pass&quot;;
        byte&amp;#91;&amp;#93; plainCredsBytes = plainCreds.getBytes();
        byte&amp;#91;&amp;#93; base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
        String base64Creds = new String(base64CredsBytes);

        HttpHeaders headers = new HttpHeaders();
        headers.add(&quot;Authorization&quot;, &quot;Basic &quot; + base64Creds);
        headers.add(&quot;Content-type&quot;, &quot;application/xml&quot;);

        if (body == null) {
            return new HttpEntity&amp;lt;&amp;gt;(headers);
        } else {
            return new HttpEntity&amp;lt;&amp;gt;(body, headers);
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;To get Spring Data to populate the message id, I created a custom &lt;code&gt;RestConfig&lt;/code&gt; class to expose it. I learned how to do this from &lt;a href=&quot;http://tommyziegler.com/how-to-expose-the-resourceid-with-spring-data-rest/&quot;&gt;Tommy Ziegler&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
/**
 * Used to expose ids for resources.
 */
@Configuration
public class RestConfig extends RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Message.class);
        config.setBaseUri(&quot;/api&quot;);
    }
}

&lt;/pre&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;
    This article explains how I built a REST API using JAXB, Spring Boot, Spring Data and Liquibase.
    It was relatively easy to build, but required some tricks to access it with Spring&apos;s RestTemplate. Figuring out
    how to customize JAXB&apos;s code generation was also essential to make things work.
&lt;/p&gt;&lt;p&gt;
    I started developing the project with Spring Boot 1.1.7, but upgraded to 1.2.0.M2 after I found it supported
    Log4j2 and configuring Spring Data REST&apos;s base URI in application.yml. When I handed the project off to my client
    last week, it was using 1.2.0.BUILD-SNAPSHOT because of a
    &lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/1719&quot;&gt;bug when running in Tomcat&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;This was an enjoyable project to work on. I especially liked how easy Spring Data makes it to expose JPA
    entities in an API. Spring Boot made things easy to configure once again and Liquibase seems like a nice
    tool for database migrations.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If someone asked me to develop a REST API on the JVM, which frameworks would I use?&lt;/em&gt; Spring Boot, Spring Data, Jackson, Joda-Time, Lombok and Liquibase. These frameworks worked really well for me on this particular project.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/developing_services_with_apache_camel3</guid>
    <title>Developing Services with Apache Camel - Part IV: Load Testing and Monitoring</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel3</link>
        <pubDate>Wed, 15 Oct 2014 10:04:01 -0600</pubDate>
    <category>Java</category>
    <category>camel</category>
    <category>jhipster</category>
    <category>scala</category>
    <category>apachecamel</category>
    <category>gatling</category>
    <category>hawtio</category>
    <category>spring-boot</category>
    <atom:summary type="html">&lt;p&gt;
&lt;a href=&quot;http://gatling.io&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/gatling.png&quot; width=&quot;150&quot; class=&quot;picture&quot; alt=&quot;Gatling&quot;&gt;&lt;/a&gt;
    Welcome to the final article in a series on my experience developing services with
    &lt;a href=&quot;http://camel.apache.org&quot;&gt;Apache Camel&lt;/a&gt;. I learned how to implement CXF endpoints using its
    Java DSL, made sure everything worked with its testing framework and integrated Spring Boot
    for external configuration. For previous articles, please see the following:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel
&quot;&gt;Part I: The Inspiration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&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;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel2
&quot;&gt;Part III: Integrating Spring 4 and Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    This article focuses on load testing and tools for monitoring application performance. In late July, I was
    asked to look into load testing the new Camel-based services I&apos;d developed. My client&apos;s reason was simple:
    to make sure the new services were as fast as the old ones (powered by IBM Message Broker).
    I sent &lt;a href=&quot;http://camel.465427.n5.nabble.com/Load-Testing-Camel-Routes-td5754610.html&quot;&gt;an
    email&lt;/a&gt; to the Camel users mailing list asking for advice on load testing.
&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;
        I&apos;m getting ready to put a Camel / CXF / Spring Boot application into production. Before I do, I want to load
        test and verify it has the same throughput as a the IBM Message Broker system it&apos;s replacing. Apparently, the
        old system can only do 6 concurrent connections because of remote database connectivity issues.
    &lt;/p&gt;

    &lt;p style=&quot;margin-bottom: 0&quot;&gt;
        I&apos;d like to write some tests that make simultaneous requests, with different data. Ideally, I could write them
        to point at the old system and find out when it falls over. Then I could point them at the new system and tune
        it accordingly. If I need to throttle because of remote connectivity issues, I&apos;d like to know before we go to
        production. Does JMeter or any Camel-related testing tools allow for this?
    &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
    In reply, I received suggestions for &lt;a href=&quot;http://httpd.apache.org/docs/2.2/programs/ab.html&quot;&gt;Apache&apos;s ab
    tool&lt;/a&gt;
    and &lt;a href=&quot;http://gatling.io/&quot;&gt;Gatling&lt;/a&gt;. I&apos;d heard of Gatling before, and decided to try it.
&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;TL;DR&lt;/h3&gt;

&lt;p&gt;This article shows how to use Gatling to load test a SOAP service and how to configure Log4j2 with Spring Boot. It
    also shows how hawtio can help monitor and configure a Camel application. I hope you enjoyed reading this series
    on what I learned about developing with Camel over the past several months. If you have stories about your experience with Camel (or similar integration frameworks), Gatling, hawtio or New Relic, I&apos;d love to hear them.
&lt;/p&gt;

&lt;p&gt;
It&apos;s been a great experience and I look forward to developing solid apps, built on open source, for my next client. I&apos;d like to
    get back into HTML5, AngularJS and mobile development. I&apos;ve had a good time with Spring Boot and JHipster this year
    and hope to use them again. I find myself using Java 8 more and more; my ideal next project would embrace it as a
    baseline. As for Scala and Groovy, I&apos;m still a big fan and believe I can develop great apps with them.
&lt;/p&gt;
&lt;p&gt;
    If you&apos;re looking for a UI/API Architect that can help accelerate your projects, please &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;let me know&lt;/a&gt;! You can learn more about my extensive experience from &lt;a href=&quot;https://www.linkedin.com/in/mraible&quot;&gt;my LinkedIn profile&lt;/a&gt;.
&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function adjustWhereThingsAre() {
    var readMore = document.getElementById(&apos;readmore&apos;);
    document.getElementById(&apos;summary&apos;).insertAdjacentHTML(&apos;beforebegin&apos;, readMore.outerHTML);
    readMore.outerHTML = null;
}
window.setTimeout(adjustWhereThingsAre, 500);
&lt;/script&gt;
&lt;p id=&quot;readmore&quot;&gt;</atom:summary>        <description>&lt;p&gt;
    Welcome to the final article in a series on my experience developing services with
    &lt;a href=&quot;http://camel.apache.org&quot;&gt;Apache Camel&lt;/a&gt;. I learned how to implement CXF endpoints using its
    Java DSL, made sure everything worked with its testing framework and integrated Spring Boot
    for external configuration. For previous articles, please see the following:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel
&quot;&gt;Part I: The Inspiration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&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;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_services_with_apache_camel2
&quot;&gt;Part III: Integrating Spring 4 and Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    This article focuses on load testing and tools for monitoring application performance. In late July, I was
    asked to look into load testing the new Camel-based services I&apos;d developed. My client&apos;s reason was simple:
    to make sure the new services were as fast as the old ones (powered by IBM Message Broker).
    I sent &lt;a href=&quot;http://camel.465427.n5.nabble.com/Load-Testing-Camel-Routes-td5754610.html&quot;&gt;an
    email&lt;/a&gt; to the Camel users mailing list asking for advice on load testing.
&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
    &lt;p style=&quot;margin-top: 0&quot;&gt;
        I&apos;m getting ready to put a Camel / CXF / Spring Boot application into production. Before I do, I want to load
        test and verify it has the same throughput as a the IBM Message Broker system it&apos;s replacing. Apparently, the
        old system can only do 6 concurrent connections because of remote database connectivity issues.
    &lt;/p&gt;

    &lt;p style=&quot;margin-bottom: 0&quot;&gt;
        I&apos;d like to write some tests that make simultaneous requests, with different data. Ideally, I could write them
        to point at the old system and find out when it falls over. Then I could point them at the new system and tune
        it accordingly. If I need to throttle because of remote connectivity issues, I&apos;d like to know before we go to
        production. Does JMeter or any Camel-related testing tools allow for this?
    &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
    In reply, I received suggestions for &lt;a href=&quot;http://httpd.apache.org/docs/2.2/programs/ab.html&quot;&gt;Apache&apos;s ab
    tool&lt;/a&gt;
    and &lt;a href=&quot;http://gatling.io/&quot;&gt;Gatling&lt;/a&gt;. I&apos;d heard of Gatling before, and decided to try it.
&lt;/p&gt;

&lt;h3 id=&quot;gatling&quot;&gt;Gatling&lt;/h3&gt;

&lt;p&gt;
&lt;a href=&quot;http://gatling.io&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/gatling.png&quot; width=&quot;150&quot; class=&quot;picture&quot; alt=&quot;Gatling&quot;&gt;&lt;/a&gt;
    I don&apos;t remember where I first heard of Gatling, but I knew it had a Scala DSL and used
    &lt;a href=&quot;http://akka.io&quot;&gt;Akka&lt;/a&gt; under the covers.
    I generated a new project using a &lt;a href=&quot;https://github.com/gatling/gatling-highcharts-maven-archetype&quot;&gt;Maven
    archetype&lt;/a&gt; and went to work developing my first test.
    My approach involved three steps:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Write tests to run against current system. Find the number of concurrent requests that make it fall over.&lt;/li&gt;
    &lt;li&gt;Run tests against new system and tune accordingly.&lt;/li&gt;
    &lt;li&gt;Throttle requests if there are remote connectivity issues with 3rd parties. If I needed to throttle requests, I was planning to use Camel&apos;s
    &lt;a href=&quot;http://camel.apache.org/throttler.html&quot;&gt;Throttler&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
    To develop the first test, I started with Gatling&apos;s &lt;a href=&quot;http://gatling.io/docs/2.0.1/quickstart.html#using-the-recorder&quot;&gt;
    Recorder.&lt;/a&gt; I set it to listen on port 8000, changed my &lt;code&gt;DrugServiceITest&lt;/code&gt; to use the same port and
    ran the integration test. This was a great way to get started because it recorded my requests as XML files, and used
    clean and concise code.
&lt;/p&gt;

&lt;p&gt;I ended up creating a parent class for all simulations and named it &lt;code&gt;AbstractSimulation&lt;/code&gt;. This was handy
    because it allowed me to pass in parameters for all the values I wanted to change.&lt;/p&gt;

&lt;pre class=&quot;brush: scala&quot;&gt;import io.gatling.core.scenario.Simulation
import io.gatling.http.Predef._

/**
 * Base Simulation class that allows passing in parameters.
 */
class AbstractSimulation extends Simulation {

  val host = System.getProperty(&quot;host&quot;, &quot;localhost:8080&quot;)
  val serviceType = System.getProperty(&quot;service&quot;, &quot;modern&quot;)
  val nbUsers = Integer.getInteger(&quot;users&quot;, 10).toInt
  val rampRate = java.lang.Long.getLong(&quot;ramp&quot;, 30L).toLong

  val httpProtocol = http
    .baseURL(&quot;http://&quot; + host)
    .acceptHeader(&quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&quot;)
    .doNotTrackHeader(&quot;1&quot;)
    .acceptLanguageHeader(&quot;en-US,en;q=0.5&quot;)
    .acceptEncodingHeader(&quot;gzip, deflate&quot;)
    .userAgentHeader(&quot;Gatling 2.0&quot;)

  val headers = Map(
    &quot;&quot;&quot;Cache-Control&quot;&quot;&quot; -&amp;gt; &quot;&quot;&quot;no-cache&quot;&quot;&quot;,
    &quot;&quot;&quot;Content-Type&quot;&quot;&quot; -&amp;gt; &quot;&quot;&quot;application/soap+xml; charset=UTF-8&quot;&quot;&quot;,
    &quot;&quot;&quot;Pragma&quot;&quot;&quot; -&amp;gt; &quot;&quot;&quot;no-cache&quot;&quot;&quot;)
}
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;DrugServiceSimulation.scala&lt;/code&gt; class posts a SOAP request over HTTP.&lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;import io.gatling.core.Predef._
import io.gatling.http.Predef._

import scala.concurrent.duration._

class DrugServiceSimulation extends AbstractSimulation {

  val service = if (&quot;modern&quot;.equals(serviceType)) &quot;/api/drugs&quot; else &quot;/axis2/services/DrugService&quot;

  val scn = scenario(&quot;Drug Service :: findGpiByNdc&quot;)
    .exec(http(host)
    .post(service)
    .headers(headers)
    .body(RawFileBody(&quot;DrugServiceSimulation_request.xml&quot;)))

  setUp(scn.inject(ramp(nbUsers users) over (rampRate seconds))).protocols(httpProtocol)
}
&lt;/pre&gt;
&lt;p&gt;
    To run tests against the legacy drug service with 100 users over 60 seconds, I used the following command:
&lt;/p&gt;
&lt;pre&gt;mvn test -Dhost=legacy.server:7802 -Dservice=legacy -Dusers=100 -Dramp=60
&lt;/pre&gt;
&lt;p&gt;The &lt;em&gt;service&lt;/em&gt; property&apos;s default is &quot;modern&quot; and determines the service&apos;s URL. To run against the local drug
    service with 100 users over 30 seconds, I could rely on more defaults.&lt;/p&gt;
&lt;pre&gt;mvn test -Dusers=100
&lt;/pre&gt;
&lt;p&gt;The name of the simulation to run is configured in pom.xml:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;io.gatling&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gatling-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${gatling.version}&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;simulationsFolder&amp;gt;src/test/scala&amp;lt;/simulationsFolder&amp;gt;
        &amp;lt;simulationClass&amp;gt;com.company.app.${service.name}Simulation&amp;lt;/simulationClass&amp;gt;
    &amp;lt;/configuration&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;test&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;execute&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;When the simulations were done running, the console displayed a link to some pretty snazzy HTML reports. I ran
    simulations
    until things started falling over on the legacy server. That happened at around 400 requests per second (rps). When I ran
    them against
    a local instance on my fully-loaded 2013 MacBook Pro, errors started flying at 4000/rps while 3000/rps performed
    just fine.&lt;/p&gt;
&lt;h4 id=&quot;jenkins&quot;&gt;Jenkins&lt;/h4&gt;

&lt;p&gt;I configured simulations to run in Jenkins with the &lt;a href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Gatling+Plugin&quot;&gt;
    Gatling Plugin&lt;/a&gt;. It&apos;s a neat plugin that allows you to record and compare results over time. After initial
    setup, I found
    I didn&apos;t use it much. Instead, I created a Google Doc with my findings and created screenshots of results so my
    client had it in an easy-to-read format.
&lt;/p&gt;
&lt;h4 id=&quot;gatling-data-feeders&quot;&gt;Data Feeders&lt;/h4&gt;

&lt;p&gt;I knew the results of the simulations were likely skewed, since the same request was used for all users. I researched
    how to make dynamic requests with Gatling and found &lt;a href=&quot;http://gatling.io/docs/2.0.1/session/feeder.html&quot;&gt;Feeders&lt;/a&gt;.
    Using a JDBC Feeder I was able make all the requests contain unique data for each user. 
&lt;/p&gt;

&lt;p&gt;I added a feeder to &lt;code&gt;DrugServiceSimulation&lt;/code&gt;, added it to the scenario and changed to use an &lt;a href=&quot;http://stackoverflow.com/questions/21143077/gatling-2-mapping-values-to-template&quot;&gt;ELFileBody&lt;/a&gt; so
    the feeder would substitute a ${NDC} variable in the XML file.&lt;/p&gt;

&lt;pre class=&quot;brush: scala&quot;&gt;val feeder = jdbcFeeder(&quot;jdbc:db2://server:50002/database&quot;, &quot;username&quot;, &quot;password&quot;,
    &quot;SELECT NDC FROM GENERICS&quot;)

val scn = scenario(&quot;Drug Service&quot;)
        .feed(feeder)
        .exec(http(host)
        .post(service)
        .headers(headers)
        .body(ELFileBody(&quot;DrugServiceSimulation_request.xml&quot;)))
&lt;/pre&gt;
&lt;p&gt;I deployed the new services to a test server and ran simulations with 100 and 1000 users. &lt;/p&gt;

&lt;blockquote&gt;
    &lt;dl&gt;
        &lt;dt&gt;&lt;strong&gt;100 users over 30 seconds&lt;/strong&gt;&lt;/dt&gt;
        &lt;dd&gt;Neither service had any failures with 100 users. The max response time for the legacy service was 389 ms,
            while
            the new service was 172 ms. The mean response time was lower for the legacy services: 89 ms vs. 96 ms.
        &lt;/dd&gt;
        &lt;dt&gt;&lt;strong&gt;1000 users over 60 seconds&lt;/strong&gt;&lt;/dt&gt;
        &lt;dd&gt;
            When simulating 1000 users against the legacy services, 50% of the requests failed and the average response
            time was
            over 40 seconds. Against the new services, all requests succeeded and the mean response time was 100ms.
        &lt;/dd&gt;
    &lt;/dl&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was pumped to see the new services didn&apos;t need any additional performance enhancements. These results were enough to convince my client that Apache Camel was going to be a performant replacement for IBM Message Broker.&lt;/p&gt;

&lt;p&gt;I wrote more simulations for another service I developed. In doing so, I discovered I missed implementing a couple
    custom routes for some clients. The dynamic feeders made me stumble onto this because they executed simulations
    for all clients. After developing the routes, the dynamic data helped me uncover a few more bugs. Using real
    data to load test with was very helpful in figuring out the edge-cases our routes needed to handle.
&lt;/p&gt;

&lt;p&gt;Next, I started configuring logging for our new Camel services.&lt;/p&gt;
&lt;h3 id=&quot;logging&quot;&gt;Logging with Log4j2&lt;/h3&gt;

&lt;p&gt;Log4j 2.0 had &lt;a href=&quot;http://www.infoq.com/news/2014/07/apache-log4j2&quot;&gt;just been released&lt;/a&gt; and my experience &lt;a href=&quot;https://github.com/appfuse/appfuse/pull/18&quot;&gt;integrating it in AppFuse&lt;/a&gt; motivated me to use it for this project. I configured Spring to use Log4j 2.0 by specifying the following dependencies. Note: Spring Boot 1.2+ has &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/1.2.0.M2/reference/htmlsingle/#howto-configure-log4j-for-logging&quot;&gt;support for Log4j2&lt;/a&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;log4j.version&amp;gt;2.0&amp;lt;/log4j.version&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.7&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;!-- Necessary to configure Spring logging with log4j2.xml --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;log4j-jcl&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${log4j.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;log4j-slf4j-impl&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${log4j.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;log4j-web&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${log4j.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I created a &lt;code&gt;src/main/resources/log4j2.xml&lt;/code&gt; file and configured a general log, as well as one for each
    route. I configured
    each route to use &quot;log:com.company.app.route.input&quot; and &quot;log:com.company.app.route.output&quot; instead of &quot;log:input&quot;
    and &quot;log:output&quot;. This
    allowed the log-file-per-route configuration you see below.&lt;/p&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;Configuration&amp;gt;
    &amp;lt;Properties&amp;gt;
        &amp;lt;Property name=&quot;fileLogDir&quot;&amp;gt;/var/log/app-name&amp;lt;/Property&amp;gt;
        &amp;lt;Property name=&quot;fileLogPattern&quot;&amp;gt;%d %p %c: %m%n&amp;lt;/Property&amp;gt;
        &amp;lt;Property name=&quot;fileLogTriggerSize&quot;&amp;gt;1 MB&amp;lt;/Property&amp;gt;
        &amp;lt;Property name=&quot;fileLogRolloverMax&quot;&amp;gt;10&amp;lt;/Property&amp;gt;
    &amp;lt;/Properties&amp;gt;
    &amp;lt;Appenders&amp;gt;
        &amp;lt;Console name=&quot;Console&quot; target=&quot;SYSTEM_OUT&quot;&amp;gt;
            &amp;lt;PatternLayout pattern=&quot;%d [%-15.15t] %-5p %-30.30c{1} %m%n&quot;/&amp;gt;
        &amp;lt;/Console&amp;gt;
        &amp;lt;RollingFile name=&quot;File&quot; fileName=&quot;${fileLogDir}/all.log&quot;
                         filePattern=&quot;${fileLogDir}/all-%d{yyyy-MM-dd}-%i.log&quot;&amp;gt;
            &amp;lt;PatternLayout pattern=&quot;${fileLogPattern}&quot;/&amp;gt;
            &amp;lt;Policies&amp;gt;
                &amp;lt;SizeBasedTriggeringPolicy size=&quot;${fileLogTriggerSize}&quot;/&amp;gt;
            &amp;lt;/Policies&amp;gt;
            &amp;lt;DefaultRolloverStrategy max=&quot;${fileLogRolloverMax}&quot;/&amp;gt;
        &amp;lt;/RollingFile&amp;gt;
        &amp;lt;RollingFile name=&quot;DrugServiceFile&quot; fileName=&quot;${fileLogDir}/drug-service.log&quot;
                         filePattern=&quot;${fileLogDir}/drug-service-%d{yyyy-MM-dd}-%i.log&quot;&amp;gt;
            &amp;lt;PatternLayout pattern=&quot;${fileLogPattern}&quot;/&amp;gt;
            &amp;lt;Policies&amp;gt;
                &amp;lt;SizeBasedTriggeringPolicy size=&quot;${fileLogTriggerSize}&quot;/&amp;gt;
            &amp;lt;/Policies&amp;gt;
            &amp;lt;DefaultRolloverStrategy max=&quot;${fileLogRolloverMax}&quot;/&amp;gt;
        &amp;lt;/RollingFile&amp;gt;
        &amp;lt;!-- Add a RollingFile for each route --&amp;gt;
    &amp;lt;/Appenders&amp;gt;

    &amp;lt;Loggers&amp;gt;
        &amp;lt;Logger name=&quot;org.apache.camel&quot; level=&quot;info&quot;/&amp;gt;
        &amp;lt;Logger name=&quot;org.springframework&quot; level=&quot;error&quot;/&amp;gt;
        &amp;lt;Logger name=&quot;com.company.app&quot; level=&quot;info&quot;/&amp;gt;

        &amp;lt;Root level=&quot;error&quot;&amp;gt;
            &amp;lt;AppenderRef ref=&quot;Console&quot;/&amp;gt;
            &amp;lt;AppenderRef ref=&quot;File&quot;/&amp;gt;
        &amp;lt;/Root&amp;gt;

        &amp;lt;Logger name=&quot;com.company.app.drugs&quot; level=&quot;debug&quot;&amp;gt;
            &amp;lt;AppenderRef ref=&quot;DrugServiceFile&quot;/&amp;gt;
        &amp;lt;/Logger&amp;gt;
        &amp;lt;!-- Add a Logger for each route --&amp;gt;
    &amp;lt;/Loggers&amp;gt;
&amp;lt;/Configuration&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I did run into some issues with this configuration:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;The &lt;code&gt;/var/log/app-name&lt;/code&gt; directory has to exist or
        there&apos;s a stacktrace on startup and no logs are written.
    &lt;/li&gt;
    &lt;li&gt;When deploy from Jenkins, I ran into permissions issues between deploys. To fix this, I &lt;em&gt;chowned&lt;/em&gt; the
        directory before restarting Tomcat.
&lt;pre&gt;chown -R tomcat /var/log/app-name
/etc/init.d/tomcat start&lt;/pre&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;monitoring&quot;&gt;Monitoring&lt;/h3&gt;

&lt;p&gt;
&lt;a href=&quot;http://hawt.io&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/hawtio-logo.png&quot; width=&quot;150&quot; class=&quot;picture&quot; alt=&quot;hawtio&quot; style=&quot;margin-top: -20px&quot;&gt;&lt;/a&gt;
    While I was configuring the new services on our test server, I also installed &lt;a href=&quot;http://hawt.io&quot;&gt;hawtio&lt;/a&gt; at
    /console.
    I had previously configured it to run in Tomcat when running &quot;mvn tomcat7:run&quot;:
&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;webapps&amp;gt;
            &amp;lt;webapp&amp;gt;
                &amp;lt;contextPath&amp;gt;/console&amp;lt;/contextPath&amp;gt;
                &amp;lt;groupId&amp;gt;io.hawt&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;hawtio-web&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;1.4.19&amp;lt;/version&amp;gt;
                &amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;
                &amp;lt;asWebapp&amp;gt;true&amp;lt;/asWebapp&amp;gt;
            &amp;lt;/webapp&amp;gt;
        &amp;lt;/webapps&amp;gt;
    &amp;lt;/configuration&amp;gt;
    ...
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
    hawtio has a &lt;a href=&quot;http://hawt.io/plugins/camel/&quot;&gt;Camel plugin&lt;/a&gt; that&apos;s pretty slick. It shows all your routes
    and their runtime metrics; you can even edit the source code for routes. Even though I used a Java DSL, my routes are
    only editable as XML in hawtio. &lt;a href=&quot;http://www.davsclaus.com/2014/09/more-metrics-in-apache-camel-214.html&quot;&gt;Claus Ibsen has a good post&lt;/a&gt; on Camel&apos;s new &lt;a href=&quot;http://camel.apache.org/metrics-component.html&quot;&gt;Metrics Component&lt;/a&gt;. I&apos;d like to learn how to build a custom dashboard for hawtio - Claus&apos;s example looks pretty nice.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm4.staticflickr.com/3929/15540039275_908787e992_c.jpg&quot; title=&quot;Route Metrics by Matt Raible, on Flickr&quot; rel=&quot;lightbox[camel4]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/15540039275&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3929/15540039275_908787e992_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Route Metrics&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5613/15353416019_6d60d5a233_c.jpg&quot; title=&quot;Camel Dashboard by Matt Raible, on Flickr&quot; rel=&quot;lightbox[camel4]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/15353416019&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5613/15353416019_6d60d5a233_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Camel Dashboard&quot; style=&quot;margin-left: 15px; border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The Spring Boot plugin for hawtio is not nearly as graphic intensive. Instead, it just displays metrics and their values in a
    table format.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://farm6.staticflickr.com/5603/15353183979_00894810fb_c.jpg&quot; title=&quot;hawtio Spring Boot plugin by Matt Raible, on Flickr&quot; rel=&quot;lightbox[camel4]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/15353183979&quot;&gt;
        &lt;img src=&quot;https://farm6.staticflickr.com/5603/15353183979_00894810fb_n.jpg&quot; width=&quot;320&quot; alt=&quot;hawtio Spring Boot plugin&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;There&apos;s some good-looking Spring Boot Admin UIs out there, notably JHipster&apos;s and the one in
    &lt;a href=&quot;https://blog.codecentric.de/en/2014/09/spring-boot-admin-first-official-release/&quot;&gt;spring-boot-admin&lt;/a&gt;. I hope the hawtio Spring Boot plugin gets prettier as it matures.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;https://farm4.staticflickr.com/3936/15516103636_c2218300d8_c.jpg&quot; title=&quot;JHipster Metrics by Matt Raible, on Flickr&quot; rel=&quot;lightbox[camel4]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/15516103636&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3936/15516103636_c2218300d8_q.jpg&quot; width=&quot;150&quot; alt=&quot;JHipster Metrics&quot; style=&quot;border: 1px solid silver&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm4.staticflickr.com/3944/15354176680_4c8fd7902e_c.jpg&quot; title=&quot;Spring Boot Admin Metrics by Matt Raible, on Flickr&quot; rel=&quot;lightbox[camel4]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/15354176680&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3944/15354176680_4c8fd7902e_q.jpg&quot; width=&quot;150&quot; alt=&quot;Spring Boot Admin Metrics&quot; style=&quot;margin-left: 15px; border: 1px solid silver&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I wanted more than just monitoring, I wanted alerts when something went wrong. For that, I installed &lt;a href=&quot;https://docs.newrelic.com/docs/agents/java-agent/getting-started/new-relic-java&quot;&gt;New Relic&lt;/a&gt; on our
    Tomcat server. I&apos;m fond of getting the Monday reports, but they only showed activity when I was load testing.
&lt;/p&gt;

&lt;p&gt;I believe all these monitoring tools will be very useful once the app is in production. My last day with this client
    is next Friday, October 24. I&apos;m trying to finish up the last couple of services this week and next. With any luck,
    their IBM Message Broker will be replaced this year.&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;This article shows how to use Gatling to load test a SOAP service and how to configure Log4j2 with Spring Boot. It
    also shows how hawtio can help monitor and configure a Camel application. I hope you enjoyed reading this series
    on what I learned about developing with Camel over the past several months. If you have stories about your experience with Camel (or similar integration frameworks), Gatling, hawtio or New Relic, I&apos;d love to hear them.
&lt;/p&gt;

&lt;p&gt;
It&apos;s been a great experience and I look forward to developing solid apps, built on open source, for my next client. I&apos;d like to
    get back into HTML5, AngularJS and mobile development. I&apos;ve had a good time with Spring Boot and JHipster this year
    and hope to use them again. I find myself using Java 8 more and more; my ideal next project would embrace it as a
    baseline. As for Scala and Groovy, I&apos;m still a big fan and believe I can develop great apps with them.
&lt;/p&gt;
&lt;p&gt;
    If you&apos;re looking for a UI/API Architect that can help accelerate your projects, please &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;let me know&lt;/a&gt;! You can learn more about my extensive experience from &lt;a href=&quot;https://www.linkedin.com/in/mraible&quot;&gt;my LinkedIn profile&lt;/a&gt;.
&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/developing_services_with_apache_camel2</guid>
    <title>Developing Services with Apache Camel - Part III: Integrating Spring 4 and Spring Boot</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel2</link>
        <pubDate>Wed, 8 Oct 2014 07:13:18 -0600</pubDate>
    <category>Java</category>
    <category>apachecamel</category>
    <category>tomcat</category>
    <category>microservices</category>
    <category>spring-boot</category>
    <category>java</category>
    <category>camel</category>
    <category>spring4</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/developing_services_with_apache_camel1</guid>
    <title>Developing Services with Apache Camel - Part II: Creating and Testing Routes</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel1</link>
        <pubDate>Tue, 30 Sep 2014 10:05:38 -0600</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>junit</category>
    <category>testing</category>
    <category>maven</category>
    <category>tomcat</category>
    <category>apachecamel</category>
    <category>spring</category>
    <category>microservices</category>
    <category>camel</category>
    <category>jenkins</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/developing_services_with_apache_camel</guid>
    <title>Developing Services with Apache Camel - Part I: The Inspiration</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/developing_services_with_apache_camel</link>
        <pubDate>Tue, 23 Sep 2014 10:58:25 -0600</pubDate>
    <category>Java</category>
    <category>apachecamel</category>
    <category>camel</category>
    <category>soap</category>
    <category>java</category>
    <category>microservices</category>
    <category>ibmmessagebroker</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/getting_started_with_jhipster_on</guid>
    <title>Getting Started with JHipster on OS X</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/getting_started_with_jhipster_on</link>
        <pubDate>Mon, 8 Sep 2014 11:30:33 -0600</pubDate>
    <category>Java</category>
    <category>jhipster</category>
    <category>mac</category>
    <category>nvm</category>
    <category>docker</category>
    <category>yeoman</category>
    <category>npm</category>
    <category>node</category>
    <category>osx</category>
    <atom:summary 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-jhipster2x.png&quot; class=&quot;picture&quot; width=&quot;187&quot;&gt;&lt;/a&gt;
    Last week I was tasked with developing a quick prototype that used AngularJS for its client and Spring MVC
    for its server. A colleague developed the same application using Backbone.js and Spring MVC.
    At first, I considered using my &lt;a href=&quot;https://github.com/mraible/boot-ionic&quot;&gt;boot-ionic&lt;/a&gt;
    project as a starting point. Then I realized I didn&apos;t need to develop a native mobile app, but rather a
    responsive web app.&lt;/p&gt;

&lt;p&gt;
    My colleague mentioned he was going to use &lt;a href=&quot;http://resthub.org/&quot;&gt;RESThub&lt;/a&gt; as his starting point, so I
    figured I&apos;d use &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; as mine. We allocated a day to get our
    environments setup with the tools we needed, then timeboxed our first feature spike to four hours.
&lt;/p&gt;

&lt;p&gt;
    My first experience with JHipster failed the &lt;em&gt;10-minute test&lt;/em&gt;. I spent a lot of time
    flailing about with various &quot;npm&quot; and &quot;yo&quot; commands, getting permissions issues along the way. After getting
    thinks to work with some &lt;em&gt;sudo&lt;/em&gt; action, I figured I&apos;d try its &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;
    development environment. This experience was no better.
&lt;/p&gt;

&lt;p&gt;
    JHipster seems like a nice project, so I figured I&apos;d try to find the causes of my issues. This article is designed
    to save you the pain I had. If you&apos;d rather just see the steps to get up and running quickly, skip to the
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/getting_started_with_jhipster_on#summary&quot;&gt;summary&lt;/a&gt;.
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
&lt;a href=&quot;http://jhipster.github.io/&quot;&gt;&lt;img src=&quot;http://jhipster.github.io/images/logo-jhipster2x.png&quot; class=&quot;picture&quot; width=&quot;187&quot;&gt;&lt;/a&gt;
    Last week I was tasked with developing a quick prototype that used AngularJS for its client and Spring MVC
    for its server. A colleague developed the same application using Backbone.js and Spring MVC.
    At first, I considered using my &lt;a href=&quot;https://github.com/mraible/boot-ionic&quot;&gt;boot-ionic&lt;/a&gt;
    project as a starting point. Then I realized I didn&apos;t need to develop a native mobile app, but rather a
    responsive web app.&lt;/p&gt;

&lt;p&gt;
    My colleague mentioned he was going to use &lt;a href=&quot;http://resthub.org/&quot;&gt;RESThub&lt;/a&gt; as his starting point, so I
    figured I&apos;d use &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; as mine. We allocated a day to get our
    environments setup with the tools we needed, then timeboxed our first feature spike to four hours.
&lt;/p&gt;

&lt;p&gt;
    My first experience with JHipster failed the &lt;em&gt;10-minute test&lt;/em&gt;. I spent a lot of time
    flailing about with various &quot;npm&quot; and &quot;yo&quot; commands, getting permissions issues along the way. After getting
    thinks to work with some &lt;em&gt;sudo&lt;/em&gt; action, I figured I&apos;d try its &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;
    development environment. This experience was no better.
&lt;/p&gt;

&lt;p&gt;
    JHipster seems like a nice project, so I figured I&apos;d try to find the causes of my issues. This article is designed
    to save you the pain I had. If you&apos;d rather just see the steps to get up and running quickly, skip to the
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/getting_started_with_jhipster_on#summary&quot;&gt;summary&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
    The &quot;npm&quot; and &quot;yo&quot; issues I had seemed to be caused by a bad node/npm installation. To fix this, I
    &lt;a href=&quot;http://stackoverflow.com/questions/11177954/how-do-i-completely-uninstall-node-js-and-reinstall-from-beginning-mac-os-x&quot;&gt;removed
        node&lt;/a&gt; and installed &lt;a href=&quot;https://github.com/creationix/nvm&quot;&gt;nvm&lt;/a&gt;. Here&apos;s the commands I needed to
    remove node and npm:
&lt;/p&gt;
&lt;pre&gt;
sudo rm -rf /usr/local/lib/node_modules
sudo rm -rf /usr/local/include/node
sudo rm /usr/local/bin/node

sudo rm -rf /usr/local/bin/npm
sudo rm /usr/local/share/man/man1/node.1
sudo rm -rf /usr/local/lib/dtrace/node.d
sudo rm -rf ~/.npm
&lt;/pre&gt;
&lt;p&gt;Next, I ran &quot;brew doctor&quot; to make sure Homebrew was still happy. It told me some things were broken:&lt;/p&gt;
&lt;pre&gt;
$ brew doctor
Warning: Broken symlinks were found. Remove them with `brew prune`:
  /usr/local/bin/yo
  /usr/local/bin/ionic
  /usr/local/bin/grunt
  /usr/local/bin/bower
&lt;/pre&gt;
&lt;p&gt;I ran &lt;code&gt;brew update &amp;&amp; brew prune&lt;/code&gt;, followed by &lt;code&gt;brew install nvm&lt;/code&gt;. Next, I added the following
    to my ~/.profile:&lt;/p&gt;
&lt;pre&gt;
source $(brew --prefix nvm)/nvm.sh
&lt;/pre&gt;
&lt;p&gt;To install the latest version of node, I ran the commands below and set the latest version as the default:&lt;/p&gt;
&lt;pre&gt;
nvm ls-remote
nvm install v0.11.13
nvm alias default v0.11.13
&lt;/pre&gt;
&lt;p&gt;
    Once I had a fresh version of Node.js, I was able to run JHipster&apos;s &lt;a
        href=&quot;http://jhipster.github.io/installation.html&quot;&gt;local installation&lt;/a&gt;
    instructions.
&lt;/p&gt;
&lt;pre&gt;
npm install -g yo
npm install -g generator-jhipster
&lt;/pre&gt;
&lt;p&gt;Then I created my project:&lt;/p&gt;
&lt;pre&gt;yo jhipster&lt;/pre&gt;
&lt;p&gt;
    I was disappointed to find this created all the project files in my current directory, rather than in a
    subdirectory. I&apos;d recommend you do the following instead:
&lt;/p&gt;
&lt;pre&gt;
mkdir ~/projectname &amp;&amp; cd ~/projectname &amp;&amp; yo jhipster
&lt;/pre&gt;
&lt;p&gt;Before creating your project, JHipster asks you a number of questions. To see what they are, see its documentation on
    &lt;a href=&quot;http://jhipster.github.io/creating_an_app.html&quot;&gt;creating an application&lt;/a&gt;. Two things to be aware of:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Hot reloading Java code doesn&apos;t work well (yet) with Java 8&lt;/li&gt;
    &lt;li&gt;Its &lt;a href=&quot;https://github.com/jhipster/generator-jhipster/issues/490&quot;&gt;OAuth2 implementation doesn&apos;t work with
        WebSockets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, I&apos;d recommend using Java 7 + (cookie-based authentication with websockets) or (oauth2 authentication
    w/o websockets).&lt;/p&gt;

&lt;p&gt;After creating my project, I was able to run it using &quot;mvn spring-boot:run&quot; and view it at &lt;a
        href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;. To get hot-reloading for the client, I ran &quot;grunt
    server&quot;
    and opened my browser to &lt;a href=&quot;http://localhost:9000&quot;&gt;http://localhost:9000&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;docker&quot;&gt;&lt;/a&gt;JHipster + Docker on OS X&lt;/h3&gt;

&lt;p&gt;I had no luck getting the Docker instructions to work initially. I spent a couple hours on it, then gave up.
    A couple of days ago, I decided to give it another good ol&apos; &lt;em&gt;college-try&lt;/em&gt;. To make sure I figured out
    everything
    from scratch, I started by
    &lt;a href=&quot;http://therealmarv.com/blog/how-to-fully-uninstall-the-offical-docker-os-x-installation/&quot;&gt;removing
        Docker&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;I re-installed Docker and pulled the JHipster image using the following:&lt;/p&gt;
&lt;pre&gt;
sudo docker pull jdubois/jhipster-docker
&lt;/pre&gt;
&lt;p&gt;The error I got from this was the following:&lt;/p&gt;
&lt;pre&gt;
2014/09/05 19:43:38 Post http:///var/run/docker.sock/images/create?fromImage=jdubois%2Fjhipster-docker&amp;tag=:
dial unix /var/run/docker.sock: no such file or directory
&lt;/pre&gt;
&lt;p&gt;After doing some research, I learned I needed to run &lt;code&gt;boot2docker init&lt;/code&gt; first. Next I ran &lt;code&gt;boot2docker
    up&lt;/code&gt; to start the Docker daemon.
    Then I copied/pasted &quot;export DOCKER_HOST=tcp://192.168.59.103:2375&quot; into my console and tried to run &lt;code&gt;docker
        pull&lt;/code&gt; again.&lt;/p&gt;

&lt;p&gt;It failed with the same error. The solution was simpler than you might think: don&apos;t use &lt;code&gt;sudo&lt;/code&gt;.
&lt;/p&gt;

&lt;pre&gt;
$ docker pull jdubois/jhipster-docker
Pulling repository jdubois/jhipster-docker
01bdc74025db: Pulling dependent layers
511136ea3c5a: Download complete
...
&lt;/pre&gt;
&lt;p&gt;
    The next command that JHipster&apos;s documentation recommends is to run the Docker image, forward ports and share
    folders. When you run it, the terminal seems to hang and trying to ssh into it doesn&apos;t work. Others have
    &lt;a href=&quot;http://stackoverflow.com/questions/25559542/docker-hangs-when-starting-jdubois-jhipster-container-in-os-x/25582833&quot;&gt;recently
        reported a similar issue&lt;/a&gt;. I discovered the hanging is caused by a missing &quot;-d&quot; parameter and ssh doesn&apos;t
    work because you need to &lt;a href=&quot;http://stackoverflow.com/a/23021012/65681&quot;&gt;
    add a portmap to the VM to expose the port to your host&lt;/a&gt;. You can fix this by running the following:
&lt;/p&gt;
&lt;pre&gt;
boot2docker down
VBoxManage modifyvm &quot;boot2docker-vm&quot; --natpf1 &quot;containerssh,tcp,,4022,,4022&quot;
VBoxManage modifyvm &quot;boot2docker-vm&quot; --natpf1 &quot;containertomcat,tcp,,8080,,8080&quot;
VBoxManage modifyvm &quot;boot2docker-vm&quot; --natpf1 &quot;containergruntserver,tcp,,9000,,9000&quot;
VBoxManage modifyvm &quot;boot2docker-vm&quot; --natpf1 &quot;containergruntreload,tcp,,35729,,35729&quot;
boot2docker start
&lt;/pre&gt;
&lt;p&gt;After making these changes, I was able to start the image and ssh into it.&lt;/p&gt;
&lt;pre&gt;
docker run -d -v ~/jhipster:/jhipster -p 8080:8080 -p 9000:9000 -p 35729:35729 -p 4022:22 -t jdubois/jhipster-docker
ssh -p 4022 jhipster@localhost
&lt;/pre&gt;
&lt;p&gt;I tried creating a new project within the VM (&lt;code&gt;cd /jhipster &amp;&amp; yo jhipster&lt;/code&gt;), but it failed with the
    following error:&lt;/p&gt;
&lt;pre&gt;
/usr/lib/node_modules/generator-jhipster/node_modules/yeoman-generator/node_modules/mkdirp/index.js:89
                    throw err0;
                          ^
Error: EACCES, permission denied &apos;/jhipster/src&apos;
&lt;/pre&gt;
&lt;p&gt;The fix was giving the &quot;jhipster&quot; user ownership of the directory.&lt;/p&gt;
&lt;pre&gt;
sudo chown jhipster /jhipster
&lt;/pre&gt;
&lt;p&gt;After doing this, I was able to generate an app and run it using &quot;mvn spring-boot:run&quot; and access it from my Mac at
    &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;. I was also able to run &quot;grunt server&quot; and see it at
    &lt;a href=&quot;http://localhost:9000&quot;&gt;http://localhost:9000&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;However, I was puzzled to see that there was nothing in my ~/jhipster directory. After doing some searching, I
    found that the &lt;a href=&quot;https://github.com/docker/docker/issues/4023&quot;&gt;docker run -v /host/path:/container/path
        doesn&apos;t work on OS X&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;David Gageot&apos;s &lt;a href=&quot;http://blog.javabien.net/2014/06/05/a-better-boot2docker-on-osx/&quot;&gt;A Better Boot2Docker on OSX&lt;/a&gt;
led me to &lt;a href=&quot;https://github.com/SvenDowideit/dockerfiles/tree/master/samba&quot;&gt;svendowideit/samba&lt;/a&gt;, which solved this problem.
The specifics are documented in boot2docker&apos;s &lt;a href=&quot;https://github.com/boot2docker/boot2docker#folder-sharing&quot;&gt;folder
        sharing&lt;/a&gt; section.
&lt;/p&gt;
&lt;p&gt;I shutdown my docker container by running &quot;docker ps&quot;, grabbing the first two characters of the id and then running:
    &lt;/p&gt;
&lt;pre&gt;
docker stop [2chars]
&lt;/pre&gt;
&lt;p&gt;
    I started the JHipster container without the -v parameter, used &quot;docker ps&quot; to find its name
    (&lt;em&gt;backstabbing_galileo&lt;/em&gt; in this case), then used that to add samba support.
&lt;/p&gt;
&lt;pre&gt;
docker run -d -p 8080:8080 -p 9000:9000 -p 35729:35729 -p 4022:22 -t jdubois/jhipster-docker
docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba backstabbing_galileo
&lt;/pre&gt;
&lt;p&gt;Then I was able to connect using Finder &gt; Go &gt; Connect to Server, using the following for the server address:
&lt;/p&gt;
&lt;pre&gt;cifs://192.168.59.103/jhipster&lt;/pre&gt;
&lt;p&gt;To make this volume appear in my regular development area, I created a symlink:&lt;/p&gt;
&lt;pre&gt;ln -s /Volumes/jhipster ~/dev/jhipster&lt;/pre&gt;
&lt;p&gt;After doing this, all the files
were marked as read-only. To fix, I ran &quot;chmod -R 777 .&quot; in the directory on the server. I noticed that this also worked
    if I ran it from my Mac&apos;s terminal, but it took quite a while to traverse all the files. I noticed a similar delay
    when loading the project into IntelliJ.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;summary&quot;&gt;&lt;/a&gt;Summary&lt;/h3&gt;
&lt;p&gt;Phew! That&apos;s a lot of information that can be condensed down into four JHipster + Docker on OS X tips.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Make sure your npm installation doesn&apos;t require sudo rights. If it does, reinstall using nvm.&lt;/li&gt;
    &lt;li&gt;Add portmaps to your VM to expose ports 4022, 8080, 9000 and 35729 to your host.&lt;/li&gt;
    &lt;li&gt;Change ownership on the /jhipster in the Docker image: sudo chown jhipster /jhipster.&lt;/li&gt;
    &lt;li&gt;Use svendowideit/samba to share your VM&apos;s directories with OS X.&lt;/li&gt;
&lt;/ol&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea</guid>
    <title>Why I prefer IntelliJ IDEA over Eclipse</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea</link>
        <pubDate>Mon, 21 Jul 2014 13:33:55 -0600</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>webdevelopment</category>
    <category>intellij</category>
    <category>idea</category>
    <category>eclipse</category>
            <description>&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;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/how_do_you_stay_current</guid>
    <title>How do you stay current with emerging technologies?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/how_do_you_stay_current</link>
        <pubDate>Wed, 28 May 2014 10:48:38 -0600</pubDate>
    <category>Java</category>
    <category>technology</category>
    <category>twitter</category>
    <category>meetup.com</category>
    <category>learning</category>
    <category>keepingup</category>
            <description>&lt;p&gt;I recently received an email from a former co-worker. She was curious to know what I read/do to know what it is &quot;trending&quot; in the software world. I think this is good knowledge to share, and I&apos;m also interested in what others do to keep up. Here&apos;s my response to her:
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 5px&quot;&gt;
My technique for staying up-to-date is mostly reading, and attending some user group meetings. For reading, I read &lt;a href=&quot;http://news.ycombinator.com&quot;&gt;news.ycombinator.com&lt;/a&gt;, as well as &lt;a href=&quot;http://infoq.com&quot;&gt;infoq.com&lt;/a&gt; - who I now write for. &lt;a href=&quot;http://dzone.com&quot;&gt;DZone.com&lt;/a&gt; (esp. &lt;a href=&quot;http://java.dzone.com/&quot;&gt;Javalobby&lt;/a&gt; and its &lt;a href=&quot;http://dzone.com/mz/html5&quot;&gt;HTML5 Zone&lt;/a&gt;) is also pretty good, as is &lt;a href=&quot;http://arstechnica.com/&quot;&gt;arstechnica.com&lt;/a&gt;. I don&apos;t read nearly as much as I used to when I was subscribed to all of their RSS feeds and read them religiously. 
&lt;/p&gt;
&lt;p&gt;
Nowadays, most of my information comes from Twitter. I follow people that are involved in technologies I&apos;m interested in. I try to keep the number of people I follow to 50 as I don&apos;t want to spend too much time reading tweets.
&lt;/p&gt;
&lt;p&gt;
For meetups, most are on &lt;a href=&quot;http://meetup.com&quot;&gt;meetup.com&lt;/a&gt; these days. I&apos;d find a couple that have technologies you&apos;re interested in (e.g. a local HTML5 meetup or Java user group) and join the group. You&apos;ll get email notifications when they have meetings.
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 5px&quot;&gt;
Other than that, sometimes I do &quot;conference driven learning&quot;. I&apos;ll pick a few technologies I&apos;m interested in learning, submit a talk to a conference or user group, then be forced to learn and present on them when it gets accepted. It can be stressful, but it works and usually results in a good presentation because I can share the experience of learning.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One interesting thing I&apos;ve realized about Twitter is I can make technologies seem &quot;hot&quot; based on the people I follow. If I&apos;m following a bunch of AngularJS folks, my feed is filled with Angular-related tweets and it seems like the hottest technology ever. If I tweak who I follow to have a bunch of Groovy enthusiasts, or Scala folks, the same thing happens.&lt;/p&gt;
&lt;p&gt;Of course, the best way to learn new technologies is to use them in your daily job. I strive to do this with my clients, but it doesn&apos;t always work out. I&apos;ve found that working on open source projects and speaking at conferences can help you learn if you&apos;re in a stagnant environment. Then again, &lt;a href=&quot;http://raibledesigns.com/rd/entry/tips_for_productivity_and_happiness&quot;&gt;if you&apos;re not happy at work, quit&lt;/a&gt;.
&lt;p&gt;
What do you do to stay on top of emerging trends in technology?&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/first_devoxx4kids_in_denver_a</guid>
    <title>First Devoxx4Kids in Denver a Wild Success!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/first_devoxx4kids_in_denver_a</link>
        <pubDate>Mon, 5 May 2014 23:42:30 -0600</pubDate>
    <category>Java</category>
    <category>thrive</category>
    <category>devoxx4kids</category>
    <category>mcginityphoto</category>
    <category>thirstyhead</category>
    <category>scottdavis</category>
    <category>minecraft</category>
    <category>denver</category>
    <atom:summary type="html">&lt;p&gt;&lt;a href=&quot;http://www.devoxx4kids.org&quot; title=&quot;Devoxx4Kids&quot;&gt;&lt;img
        src=&quot;//raibledesigns.com/repository/images/Devoxx4Kids-logo.png&quot; width=&quot;240&quot;
        class=&quot;picture&quot;&gt;&lt;/a&gt;
    The first Devoxx4Kids Denver was a wild success!
    This last Saturday, 20 enthusiastic Minecraft hackers gathered at &lt;a
            href=&quot;http://www.businessatthrive.com/&quot;&gt;Thrive&lt;/a&gt; in Cherry Creek to learn from one of the best. With
    masterful skill,
    &lt;a href=&quot;http://thirstyhead.com/contact.html&quot;&gt;Scott Davis&lt;/a&gt;, founder of &lt;a href=&quot;http://thirstyhead.com&quot;&gt;ThirstyHead.com&lt;/a&gt;,
    taught everyone how to get a development environment setup, run a local Minecraft server and install plugins into
    it. You can see the materials we used for this class on Scott&apos;s site, at
    &lt;a href=&quot;http://my.thirstyhead.com/talks/minecraft_programming&quot;&gt;Introduction to Server-side Minecraft
        Programming&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mcginityphoto.com&quot;&gt;McGinity Photo&lt;/a&gt; was kind enough to snap a bunch of pictures, which you can &lt;a
        href=&quot;https://www.flickr.com/photos/mcginityphoto/sets/72157644534388325/&quot;&gt;find on Flickr&lt;/a&gt;. A sampling
    is
    below:
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;//farm8.staticflickr.com/7342/13930299459_a81657c6b4_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/13930299459&quot;
       title=&quot;Devoxx4Kids Denver by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7342/13930299459_a81657c6b4_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx4Kids Denver&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;//farm3.staticflickr.com/2908/14137000853_14f916473f_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14137000853&quot;
       title=&quot;Devoxx4Kids Denver by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2908/14137000853_14f916473f_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx4Kids Denver&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;//farm8.staticflickr.com/7192/13930311930_cc968f16d7_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/13930311930&quot;
       title=&quot;Devoxx4Kids Denver by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7192/13930311930_cc968f16d7_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx4Kids Denver&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;//farm8.staticflickr.com/7201/13930237257_acff755c13_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/13930237257&quot;
       title=&quot;Scott Davis by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7201/13930237257_acff755c13_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Scott Davis&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;//farm8.staticflickr.com/7338/14116881615_c61ce047dd_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14116881615&quot;
       title=&quot;Thanks for the great room Thrive! by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7338/14116881615_c61ce047dd_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Thanks for the great room Thrive!&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;&lt;a href=&quot;http://www.devoxx4kids.org&quot; title=&quot;Devoxx4Kids&quot;&gt;&lt;img
        src=&quot;//raibledesigns.com/repository/images/Devoxx4Kids-logo.png&quot; width=&quot;240&quot;
        class=&quot;picture&quot;&gt;&lt;/a&gt;
    The first Devoxx4Kids Denver was a wild success!
    This last Saturday, 20 enthusiastic Minecraft hackers gathered at &lt;a
            href=&quot;http://www.businessatthrive.com/&quot;&gt;Thrive&lt;/a&gt; in Cherry Creek to learn from one of the best. With
    masterful skill,
    &lt;a href=&quot;http://thirstyhead.com/contact.html&quot;&gt;Scott Davis&lt;/a&gt;, founder of &lt;a href=&quot;http://thirstyhead.com&quot;&gt;ThirstyHead.com&lt;/a&gt;,
    taught everyone how to get a development environment setup, run a local Minecraft server and install plugins into
    it. You can see the materials we used for this class on Scott&apos;s site, at
    &lt;a href=&quot;http://my.thirstyhead.com/talks/minecraft_programming&quot;&gt;Introduction to Server-side Minecraft
        Programming&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mcginityphoto.com&quot;&gt;McGinity Photo&lt;/a&gt; was kind enough to snap a bunch of pictures, which you can &lt;a
        href=&quot;https://www.flickr.com/photos/mcginityphoto/sets/72157644534388325/&quot;&gt;find on Flickr&lt;/a&gt;. A sampling
    is
    below:
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;//farm8.staticflickr.com/7342/13930299459_a81657c6b4_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/13930299459&quot;
       title=&quot;Devoxx4Kids Denver by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7342/13930299459_a81657c6b4_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx4Kids Denver&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;//farm3.staticflickr.com/2908/14137000853_14f916473f_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14137000853&quot;
       title=&quot;Devoxx4Kids Denver by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2908/14137000853_14f916473f_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx4Kids Denver&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;//farm8.staticflickr.com/7192/13930311930_cc968f16d7_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/13930311930&quot;
       title=&quot;Devoxx4Kids Denver by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7192/13930311930_cc968f16d7_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;Devoxx4Kids Denver&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;//farm8.staticflickr.com/7201/13930237257_acff755c13_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/13930237257&quot;
       title=&quot;Scott Davis by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7201/13930237257_acff755c13_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Scott Davis&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;//farm8.staticflickr.com/7338/14116881615_c61ce047dd_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14116881615&quot;
       title=&quot;Thanks for the great room Thrive! by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7338/14116881615_c61ce047dd_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Thanks for the great room Thrive!&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;//farm3.staticflickr.com/2913/14136927773_6a24d0664e_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14136927773&quot;
       title=&quot;Lovin&apos; it by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2913/14136927773_6a24d0664e.jpg&quot; width=&quot;500&quot;
            alt=&quot;Lovin&apos; it&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;//farm6.staticflickr.com/5589/14116832555_dfb54f0502_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14116832555&quot; title=&quot;Intense by Trish McGinity, on Flickr&quot;
       rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm6.staticflickr.com/5589/14116832555_dfb54f0502_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Intense&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;//farm3.staticflickr.com/2930/14113526991_c586905d08_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14113526991&quot;
       title=&quot;Junior Hackers by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2930/14113526991_c586905d08_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Junior Hackers&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;//farm8.staticflickr.com/7426/14093622566_cf2f029698_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14093622566&quot;
       title=&quot;Great room from Thrive by Trish McGinity, on Flickr&quot; rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7426/14093622566_cf2f029698.jpg&quot; width=&quot;500&quot;
            alt=&quot;Great room from Thrive&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;//farm8.staticflickr.com/7336/14093576306_4b6d656d74_c.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mcginityphoto/14093576306&quot; title=&quot;Smile by Trish McGinity, on Flickr&quot;
       rel=&quot;lightbox[devoxx4kids-denver-201405]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7336/14093576306_4b6d656d74.jpg&quot; width=&quot;500&quot;
            alt=&quot;Smile&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I can&apos;t thank &lt;a href=&quot;http://www.businessatthrive.com/&quot;&gt;Thrive&lt;/a&gt; enough for their awesome venue. They had coffee ready and the front door wide-open when
    we arrived at 9am. The class started at 10am, and students started streaming in around 9:30. It was a mad scramble
    at first to copy all the setup files to student computers. Heck, it was a mad scramble for me most of the class:
    configuring environments, showing kids how to use the command line, troubleshooting errors -- all while the A/C was
    off. By the end of the class, the students were humming, connecting to each other&apos;s laptops and customizing their
    own worlds.
&lt;/p&gt;
&lt;p&gt;
    The only thing I regret is not setting up the students&apos; laptops ahead of time. It would&apos;ve been nice if Java and
    Gradle were installed and students could just run commands. However, I think it&apos;s neat they learned how to install
    and configure their own Java development environment. In the future, I&apos;ll send out instructions for parents a week
    before. For those needing help, we&apos;ll offer an &quot;early setup&quot; session the morning of the class. It&apos;d also be nice to have a couple extra laptops for those that are too slow.
&lt;/p&gt;
&lt;p&gt;For the next meeting, it&apos;d be cool to use Java since everyone has it all setup. Maybe we could control some robots
    with code or dive even deeper into hacking Minecraft. Whatever it is, it&apos;s sure to be fun!
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: One other issue I forgot to mention. My kids have been sharing a Minecraft account for the last year. During the class, we found the duplicate username didn&apos;t work when they both wanted to join a server. It took 18 hours to get an additional account from Minecraft.net (6 hours for activation email, 12 for the unique username chooser to work). Make sure all kids have their own username before you teach a class like this.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/devoxx4kids_denver_chapter_begins</guid>
    <title>Devoxx4Kids - Denver Chapter Begins!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/devoxx4kids_denver_chapter_begins</link>
        <pubDate>Tue, 8 Apr 2014 10:59:29 -0600</pubDate>
    <category>Java</category>
    <category>devoxx4kids</category>
    <category>scottdavis</category>
    <category>minecraft</category>
    <category>thrive</category>
            <description>&lt;p&gt;&lt;a href=&quot;http://www.devoxx4kids.org&quot; title=&quot;Devoxx4Kids&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/Devoxx4Kids-logo.png&quot; width=&quot;240&quot; height=&quot;84&quot; alt=&quot;Devoxx4Kids&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
I&apos;m happy to announce the first meeting of the &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/&quot;&gt;Denver Chapter&lt;/a&gt; of &lt;a href=&quot;http://www.devoxx4kids.org/&quot;&gt;Devoxx4Kids&lt;/a&gt; is now &lt;a href=&quot;http://www.meetup.com/Devoxx4Kids-Denver/events/172037212/&quot;&gt;open for registration&lt;/a&gt;. It&apos;s a two hour class titled &lt;strong&gt;Introduction to Server-Side Minecraft Programming&lt;/strong&gt; and will be taught by Denver&apos;s own &lt;a href=&quot;http://www.linkedin.com/in/scottdavis99&quot;&gt;Scott Davis&lt;/a&gt;. The class will be held on May 3rd, from 10am - 12pm at &lt;a href=&quot;http://www.businessatthrive.com/&quot;&gt;Thrive&lt;/a&gt;&apos;s Cherry Creek location, where we can comfortably fit 20 students. Cost is $10, but you&apos;ll get that back in the form of a t-shirt. Age requirement is 9-18 and kids should have basic computer skills (copy/paste, opening applications, etc.). Minecraft experience will certainly help too.
&lt;/p&gt;
&lt;p&gt;I&apos;d like to thank &lt;a href=&quot;http://be.linkedin.com/in/danieldeluca&quot;&gt;Daniel De Luca&lt;/a&gt; for his initial assistance with getting Devoxx4Kids setup in Denver and &lt;a href=&quot;http://www.linkedin.com/in/arunpgupta&quot;&gt;Arun Gupta&lt;/a&gt; for starting &lt;a href=&quot;http://www.devoxx4kids.org/usa/&quot;&gt;Devoxx4Kids USA&lt;/a&gt;. Arun has been a great help in getting things going and answering my questions over the last few months. Of course, none of it would be happening without Scott Davis or Thrive. If you join us on May 3rd, you&apos;ll see that Scott is an awesome teacher and Thrive has some incredible facilities.&lt;/p&gt;
&lt;p&gt;My initial goal with Devoxx4Kids in Denver is to host a class or two this year. If there&apos;s enough demand, we can expand. For now, we&apos;re starting small and seeing where it takes us. If you&apos;re interested in teaching a future class, please let me know. We&apos;d love to teach the kids a number of skills, from Scratch to NAO Humanoid Robot programming to building things with Arduino and Raspberry Pi.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/documenting_your_spring_api_with</guid>
    <title>Documenting your Spring API with Swagger</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/documenting_your_spring_api_with</link>
        <pubDate>Tue, 25 Mar 2014 13:07:18 -0600</pubDate>
    <category>Java</category>
    <category>swagger</category>
    <category>swagger-springmvc</category>
    <category>java</category>
    <category>springmvc</category>
    <atom: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;</atom:summary>        <description>&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;</description>          </item>
  </channel>
</rss>