<?xml version="1.0"?>
<rss version="2.0">
<channel>
	<title>Planet Apache</title>
	<link>http://planet.apache.org/committers/</link>
	<language>en</language>

<item>
	<title>Luciano Resende: A practical guide to take your project open source</title>
	<guid isPermaLink="true">http://lresende.blogspot.com/2018/01/a-practical-guide-to-take-your-project.html</guid>
	<link>http://lresende.blogspot.com/2018/01/a-practical-guide-to-take-your-project.html</link>
	<description>Are you thinking about open sourcing a new project, or has been on some projects on GitHub and want to make sure they follow some basic open source best practices? Take a look at my last &lt;a href=&quot;https://medium.com/@lresende/taking-your-project-open-source-a-practical-guide-ad3a94dda693&quot;&gt;article&lt;/a&gt;.   &lt;blockquote&gt;This article summarizes some best practices to consider when taking your project to open source either on GitHub or some other public source code repository.&lt;/blockquote&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://cdn-images-1.medium.com/max/800/1*4F6053ST42srPOe8HLw7rA.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;244&quot; src=&quot;https://cdn-images-1.medium.com/max/800/1*4F6053ST42srPOe8HLw7rA.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 27 Jan 2018 19:03:39 +0000</pubDate>
</item>
<item>
	<title>Colm O hEigeartaigh: Securing Apache Sqoop - part I</title>
	<guid isPermaLink="true">http://coheigea.blogspot.com/2018/01/securing-apache-sqoop-part-i.html</guid>
	<link>http://coheigea.blogspot.com/2018/01/securing-apache-sqoop-part-i.html</link>
	<description>This is the first in a series of posts on how to secure Apache &lt;a href=&quot;http://sqoop.apache.org/&quot;&gt;Sqoop&lt;/a&gt;. Apache Sqoop is a tool to transfer bulk data mainly between HDFS and relational databases, but also supporting other projects such as Apache &lt;a href=&quot;http://kafka.apache.org/&quot;&gt;Kafka&lt;/a&gt;. In this post we will look at how to set up Apache Sqoop to perform a simple use-case of transferring a file from HDFS to Apache Kafka. Subsequent posts will show how to authorize this data transfer using both Apache &lt;a href=&quot;http://ranger.apache.org/&quot;&gt;Ranger&lt;/a&gt; and Apache &lt;a href=&quot;http://sentry.apache.org/&quot;&gt;Sentry&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Note that we will only use Sqoop 2 (current version 1.99.7), as this is the only version that both Sentry and Ranger support. However, this version is not (yet) recommended for production deployment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Set up Apache Hadoop and Apache Kafka&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First we will set up Apache Hadoop and Apache Kafka. The use-case is that we want to transfer a file from HDFS (/data/LICENSE.txt) to a Kafka topic (test). Follow part (1) of an &lt;a href=&quot;http://coheigea.blogspot.ie/2017/04/securing-apache-hadoop-distributed-file.html&quot;&gt;earlier tutorial&lt;/a&gt; I wrote about installing Apache Hadoop. The following change is also required for ''etc/hadoop/core-site.xml' (in addition to the &quot;fs.defaultFS&quot; setting that is configured in the earlier tutorial):&lt;br /&gt;&lt;br /&gt; Make sure that LICENSE.txt is uploaded to the /data directory as outlined in the tutorial. Now we will set up Apache Kafka. &lt;a href=&quot;http://kafka.apache.org/downloads.html&quot;&gt;Download&lt;/a&gt; Apache Kafka and extract it (1.0.0 was used for the purposes of this tutorial).  Start Zookeeper with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/zookeeper-server-start.sh config/zookeeper.properties&lt;/li&gt;&lt;/ul&gt;and start the broker and then create a &quot;test&quot; topic with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/kafka-server-start.sh config/server.properties&lt;/li&gt;&lt;li&gt;bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test&lt;/li&gt;&lt;/ul&gt;Finally let's set up a consumer for the &quot;test&quot; topic:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer.properties&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;2) Set up Apache Sqoop&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.apache.org/dyn/closer.lua/sqoop/1.99.7&quot;&gt;Download&lt;/a&gt; Apache Sqoop and extract it (1.99.7 was used for the purposes of this tutorial).&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;2.a) Configure + start Sqoop&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Before starting Sqoop, edit 'conf/sqoop.properties' and change the following property to point instead to the Hadoop configuration directory (e.g. /path.to.hadoop/etc/hadoop):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;org.apache.sqoop.submission.engine.mapreduce.configuration.directory&lt;/li&gt;&lt;/ul&gt;Then configure and start Apache Sqoop with the following commands:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;export HADOOP_HOME=path to Hadoop home&lt;/li&gt;&lt;li&gt;bin/sqoop2-tool upgrade&lt;/li&gt;&lt;li&gt;bin/sqoop2-tool verify&lt;/li&gt;&lt;li&gt;bin/sqoop2-server start (stop)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;2.b) Configure links/job in Sqoop &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now that Sqoop has started we need to configure it to transfer data from HDFS to Kafka. Start the Shell via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/sqoop2-shell&lt;/li&gt;&lt;/ul&gt;&quot;show connector&quot; lists the connectors that are available. We first need to configure a link for the HDFS connector:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create link -connector hdfs-connector&lt;/li&gt;&lt;li&gt;Name: HDFS&lt;/li&gt;&lt;li&gt;URI: hdfs://localhost:9000&lt;/li&gt;&lt;li&gt;Conf directory: Path to Hadoop conf directory&lt;/li&gt;&lt;/ul&gt;Similarly, for the Kafka connector:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create link -connector kafka-connector&lt;/li&gt;&lt;li&gt;Name: KAFKA&lt;/li&gt;&lt;li&gt;Kafka brokers: localhost:9092&lt;/li&gt;&lt;li&gt;Zookeeper quorum: localhost:2181&lt;/li&gt;&lt;/ul&gt;&quot;show link&quot; shows the links we've just created. Now we need to create a job from the HDFS link to the Kafka link as follows (accepting the default values if they are not specified below):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create job -f HDFS -t KAFKA&lt;/li&gt;&lt;li&gt;Name: testjob&lt;/li&gt;&lt;li&gt;Input Directory: /data&lt;/li&gt;&lt;li&gt;Topic: test&lt;/li&gt;&lt;/ul&gt;We can see the job we've created with &quot;show job&quot;. Now let's start the job:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;start job -name testjob &lt;/li&gt;&lt;/ul&gt;You should see the content of the HDFS &quot;/data&quot; directory (i.e. the LICENSE.txt) appear in the window of the Kafka &quot;test&quot; consumer, thus showing that Sqoop has transfered data from HDFS to Kafka.</description>
	<pubDate>Fri, 26 Jan 2018 17:16:36 +0000</pubDate>
</item>
<item>
	<title>Justin Mason: Links for 2018-01-25</title>
	<guid isPermaLink="true">http://taint.org/2018/01/25/235802a.html</guid>
	<link>http://taint.org/2018/01/25/235802a.html</link>
	<description>&lt;ul&gt;&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;https://www.theverge.com/2018/1/24/16926426/rocket-lab-humanity-star-secret-satellite-electron-test-launch&quot; title=&quot;Rocket Lab secretly launched a disco ball satellite on its latest test flight - The Verge&quot;&gt;Rocket Lab secretly launched a disco ball satellite on its latest test flight – The Verge&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’m quite conflicted about this — I think I like it:  &lt;/p&gt;&lt;blockquote&gt;Shaped a bit like a disco ball, the Humanity Star is a 3-foot-wide carbon fiber sphere, made up of 65 panels that reflect the Sun’s light. The satellite is supposed to spin in space, too, so it’s constantly bouncing sunlight. In fact, the probe is so bright that people can see it with the naked eye. The Humanity Star’s orbit also takes it all over Earth, so the satellite will be visible from every location on the planet at different times. Rocket Lab has set up a website that gives real-time updates about the Humanity Star’s location. People can find out when the satellite will be closest to them, and then go outside to look for it.  The goal of the project is to create “a shared experience for all of humanity,” according to Rocket Lab.&lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:rocket-lab&quot;&gt;rocket-lab&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:disco-balls&quot;&gt;disco-balls&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:satellites&quot;&gt;satellites&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:humanity-star&quot;&gt;humanity-star&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:orbit&quot;&gt;orbit&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:space&quot;&gt;space&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;http://www.openculture.com/2017/08/3d-scans-of-7500-famous-sculptures-statues-artworks-download-3d-print-rodins-thinker-michelangelos-david-more.html&quot; title=&quot;3D Scans of 7,500 Famous Sculptures, Statues &amp;amp; Artworks: Download &amp;amp; 3D Print Rodin's Thinker, Michelangelo's David &amp;amp; More | Open Culture&quot;&gt;3D Scans of 7,500 Famous Sculptures, Statues &amp;amp; Artworks: Download &amp;amp; 3D Print Rodin’s Thinker, Michelangelo’s David &amp;amp; More | Open Culture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oh my.&lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:3d-printing&quot;&gt;3d-printing&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:art&quot;&gt;art&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:history&quot;&gt;history&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:british-museum&quot;&gt;british-museum&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:models&quot;&gt;models&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:cool&quot;&gt;cool&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;https://arxiv.org/pdf/1708.09537.pdf&quot; title=&quot;'DolphinAttack: Inaudible Voice Commands' [pdf]&quot;&gt;‘DolphinAttack: Inaudible Voice Commands’ [pdf]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;‘Speech recognition (SR) systems such as Siri or Google Now have become an increasingly popular human-computer interaction method, and have turned various systems into voice controllable systems(VCS). Prior work on attacking VCS shows that the hidden voice commands that are incomprehensible to people can control the systems. Hidden voice commands, though hidden, are nonetheless audible. In this work, we design a completely inaudible attack, DolphinAttack, that modulates voice commands on ultrasonic carriers (e.g., f &amp;gt; 20 kHz) to achieve inaudibility. By leveraging the nonlinearity of the microphone circuits, the modulated low frequency audio commands can be successfully demodulated, recovered, and more importantly interpreted by the speech recognition systems. We validate DolphinAttack on popular speech recognition systems, including Siri, Google Now, Samsung S Voice, Huawei HiVoice, Cortana and Alexa. By injecting a sequence of inaudible voice commands, we show a few proof-of-concept attacks, which include activating Siri to initiate a FaceTime call on iPhone, activating Google Now to switch the phone to the airplane mode, and even manipulating the navigation system in an Audi automobile. We propose hardware and software defense solutions. We validate that it is feasible to detect DolphinAttack by classifying the audios using supported vector machine (SVM), and suggest to re-design voice controllable systems to be resilient to inaudible voice command attacks.’  via Zeynep (https://twitter.com/zeynep/status/956520320504123392)&lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:alexa&quot;&gt;alexa&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:siri&quot;&gt;siri&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:attacks&quot;&gt;attacks&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:security&quot;&gt;security&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:exploits&quot;&gt;exploits&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:google-now&quot;&gt;google-now&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:speech-recognition&quot;&gt;speech-recognition&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:speech&quot;&gt;speech&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:audio&quot;&gt;audio&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:acm&quot;&gt;acm&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:papers&quot;&gt;papers&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:cortana&quot;&gt;cortana&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 25 Jan 2018 23:58:02 +0000</pubDate>
</item>
<item>
	<title>Justin Mason: Links for 2018-01-24</title>
	<guid isPermaLink="true">http://taint.org/2018/01/24/235801a.html</guid>
	<link>http://taint.org/2018/01/24/235801a.html</link>
	<description>&lt;ul&gt;&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;https://nicholas.carlini.com/code/audio_adversarial_examples/&quot; title=&quot;Targeted Audio Adversarial Examples&quot;&gt;Targeted Audio Adversarial Examples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is phenomenal:  &lt;/p&gt;&lt;blockquote&gt;We have constructed targeted audio adversarial examples on speech-to-text transcription neural networks: given an arbitrary waveform, we can make a small perturbation that when added to the original waveform causes it to transcribe as any phrase we choose.  In prior work, we constructed hidden voice commands, audio that sounded like noise but transcribed to any phrases chosen by an adversary. With our new attack, we are able to improve this and make an arbitrary waveform transcribe as any target phrase.&lt;/blockquote&gt;  The audio examples on this page are impressive — a little bit of background noise, such as you might hear on a telephone call with high compression, hard to perceive if you aren’t listening out for it.  Paper here: https://arxiv.org/abs/1801.01944  (Via Parker Higgins, https://twitter.com/xor )&lt;p&gt;&lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:papers&quot;&gt;papers&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:audio&quot;&gt;audio&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:adversarial-classification&quot;&gt;adversarial-classification&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:neural-networks&quot;&gt;neural-networks&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:speech-to-text&quot;&gt;speech-to-text&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:speech&quot;&gt;speech&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:recognition&quot;&gt;recognition&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:voice&quot;&gt;voice&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:attacks&quot;&gt;attacks&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:exploits&quot;&gt;exploits&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:via:xor&quot;&gt;via:xor&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Wed, 24 Jan 2018 23:58:01 +0000</pubDate>
</item>
<item>
	<title>Piergiorgio Lucidi: Alfresco DevCon 2018 - Wrap up</title>
	<guid isPermaLink="true">https://www.open4dev.com/journal/2018/1/22/alfresco-devcon-2018-wrapping-up</guid>
	<link>https://www.open4dev.com/journal/2018/1/22/alfresco-devcon-2018-wrapping-up</link>
	<description>&lt;p&gt;We have spent an highly pleasant time together at the &lt;a href=&quot;https://devcon.alfresco.com/&quot; target=&quot;_blank&quot;&gt;Alfresco DevCon 2018&lt;/a&gt; and here are some thoughts about my experience and my contributions at this huge event.&lt;/p&gt;&lt;p&gt;&lt;em&gt;UPDATE LOG: As Richard Esplin kindly mentioned in the comment, I have updated the section about the future of Share with the correct message. Sorry for this and thanks to Richard for reading my article and for proposing this correction. I have also added something about the recent involvement of the community in the ADF roadmap.&lt;/em&gt;&lt;/p&gt;&lt;h1&gt;Dinner before the conference&lt;/h1&gt;&lt;p&gt;The day before the beginning of this event, me and Luis enjoyed a very good dinner at LX Factory together with other fabulous Alfresco Community Stars. We have tasted different kind of starters and I have personally tried a huge and tasty Portuguese Burger with different spices and a nice beer served in a very long glaaaaaaaaas, check out the photo below:&lt;/p&gt;

  

  	
      
      
        
          
            
              &lt;img alt=&quot;Nathan McMinn, Axel Faust, Luis Cabaceira, PJ, Jeff Potts and Boriss Mejias. Thanks Nathan for this epic shot!&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a67bc7c53450a58bd5bc04c/1516747995631/LXFactoryDinner.jpg?format=1000w&quot; /&gt;
            
          

          
          
            &lt;p&gt;&lt;a href=&quot;https://twitter.com/ntmcminn&quot; target=&quot;_blank&quot;&gt;Nathan McMinn&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/ReluctantBird83&quot; target=&quot;_blank&quot;&gt;Axel Faust&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/luiscabaceira&quot; target=&quot;_blank&quot;&gt;Luis Cabaceira&lt;/a&gt;, PJ, &lt;a href=&quot;https://twitter.com/jeffpotts01&quot; target=&quot;_blank&quot;&gt;Jeff Potts&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/tchorix&quot; target=&quot;_blank&quot;&gt;Boriss Mejias&lt;/a&gt;. &lt;em&gt;&lt;strong&gt;Thanks &lt;a href=&quot;https://twitter.com/ntmcminn/status/955926780380139520&quot; target=&quot;_blank&quot;&gt;Nathan&lt;/a&gt; for this epic shot!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
          
          

        
      
      
    

  


&lt;h1&gt;Training day - Introduction to Alfresco&lt;/h1&gt;&lt;p&gt;We have signed as &lt;a href=&quot;https://www.taisolutions.com/en/&quot; target=&quot;_blank&quot;&gt;TAI Solutions&lt;/a&gt; a partnership agreement with &lt;a href=&quot;https://ecmcoreaveri.com&quot; target=&quot;_blank&quot;&gt;ECMCoreAveri&lt;/a&gt; and we have started to collaborate together for creating and delivering worldwide training courses around the Alfresco Digital Business Platform. &lt;/p&gt;&lt;p&gt;During the first day I contributed as an International Certified Alfresco Instructor for delivering the course about all the basics of the Alfresco Platform development.&lt;/p&gt;&lt;p&gt;We held a class with 50 attendees on all the Alfresco fundamentals covering Alfresco Content Services and Alfresco Process Services. Finally at the end of the day Ole Hejlskov (Developer Evangelist at Alfresco) described the ADF approach.&lt;/p&gt;&lt;p&gt;I have personally edited the material with related labs and I held the session in the classroom about the following topics:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Setup of the Alfresco SDK: pre-event paper, JDK, passing to Apache Maven and archetypes&lt;/li&gt;&lt;li&gt;Alfresco Administration Tools: from the Admin Console to the Bulk File System Import&lt;/li&gt;&lt;li&gt;A complete example of process definition in APS with moderation and document generation&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The course was held by me, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/sarguroh&quot; target=&quot;_blank&quot;&gt;Shoeb Sarguroh&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://twitter.com/olaabs&quot; target=&quot;_blank&quot;&gt;Oliver Laabs&lt;/a&gt;&lt;/strong&gt; but in the room there were also other people for supporting attendees for any need:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sabine Esser&lt;/strong&gt; (Director at ECMCoreAveri)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Kevin Enlund&lt;/strong&gt; (eLearning Project Manager at Alfresco)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Darryl Quinn&lt;/strong&gt; (Director of Worldwide Education Services at Alfresco)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This training day has gone very well even if we had some issues with the WIFI network, we resolved using my clean Maven repository built from scratch for this course and then we copied it into some USB keys. This allowed every attendee to correctly use the Alfresco SDK and then to complete all the required labs.&lt;/p&gt;&lt;p&gt;I would like to thank all the involved people in the training room, my colleague Shoeb and Oliver but also Sabine, Kevin and Darryl helped a lot during labs.&lt;/p&gt;&lt;p&gt;Delivering training courses with so many different language speaking people, it is every time challenging, not only for us as instructors but also for attendees!&lt;/p&gt;&lt;p class=&quot;text-align-center&quot;&gt;&lt;strong&gt;&lt;em&gt;Thank you to all the attendees for kindly listening this huge amount of informations that are rained on you :)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

  

  	
      
      
        
          
            
              &lt;img alt=&quot;ECMCoreAveri International Instructors Team: me, Sabine, Shoeb, Oliver and Cristina. Thanks to Cristina for this great shot :)&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a6602690d92973c49c13f6e/1516634829385/ECMCoreAveri+-+Team.jpg?format=1000w&quot; /&gt;
            
          

          
          
            &lt;p&gt;ECMCoreAveri International Instructors Team: me, &lt;strong&gt;Sabine&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/sarguroh&quot; target=&quot;_blank&quot;&gt;Shoeb&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/olaabs&quot; target=&quot;_blank&quot;&gt;Oliver&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://twitter.com/CristinaMartinR&quot; target=&quot;_blank&quot;&gt;Cristina&lt;/a&gt;&lt;/strong&gt;. &lt;strong&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://twitter.com/CristinaMartinR/status/953952470652346368&quot; target=&quot;_blank&quot;&gt;Cristina&lt;/a&gt; for this great shot :)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
          
          

        
      
      
    

  


&lt;h1&gt;VIP Award received for Open Source involvement&lt;/h1&gt;&lt;p&gt;During the last day, and before my session, Alfresco together with the &lt;a href=&quot;http://orderofthebee.org/&quot; target=&quot;_blank&quot;&gt;Order of the Bee&lt;/a&gt; gave an Alfresco VIP Award to 20 community members around the world. For each one they have shared the main reason and the goal achieved in terms of contribution for the nomination.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;I received this unexpected Alfresco VIP Award&lt;/strong&gt; for all my contributions in different Open Source projects and communities and for improving interoperability among these ecosystems.&lt;/p&gt;&lt;p&gt;This is so awesome and I would like to thank Alfresco and all the members inside the Board of the Order of the Bee for this important recognition of my work around communities!&lt;/p&gt;&lt;p class=&quot;text-align-center&quot;&gt;&lt;em&gt;&lt;strong&gt;Thank you so much to Alfresco and the Order of The Bee! &lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;Very appreciated &lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;^__^&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

  

  	
      
      
        
          
            
              &lt;img alt=&quot;The Alfresco VIP Award received from Alfresco and the Order of the Bee. Thank you so much!!! :)&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a6602f90d92973c49c163a0/1516634940386/VIP+Award+-+Alfresco+-+PJ.jpg?format=1000w&quot; /&gt;
            
          

          
          
            &lt;p&gt;The Alfresco VIP Award received from Alfresco and the Order of the Bee. &lt;em&gt;&lt;strong&gt;Thank you so much!!! :)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
          
          

        
      
      
    

  


&lt;h1&gt;Session - Apache ManifoldCF Output Connectors&lt;/h1&gt;&lt;p&gt;During the last day I held the session with my friend &lt;a href=&quot;https://twitter.com/luiscabaceira&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Luis Cabaceira&lt;/strong&gt;&lt;/a&gt; about content migration using Apache ManifoldCF.&lt;/p&gt;&lt;p&gt;We had the honor to be introduced on the stage by &lt;strong&gt;&lt;a href=&quot;https://twitter.com/ntmcminn&quot; target=&quot;_blank&quot;&gt;Nathan McMinn&lt;/a&gt;&lt;/strong&gt; (Senior Director of Premiere Services at Alfresco) and we received a lot of interesting feedbacks about our presentation from partners and customers and if you need more informations about it, please feel free to &lt;a href=&quot;https://www.open4dev.com/contact&quot;&gt;contact me&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I would like to also thank Nathan &lt;a href=&quot;https://community.alfresco.com/blogs/alfresco-premier-services/2018/01/23/devcon-2018-retrospective&quot; target=&quot;_blank&quot;&gt;for having mentioned us in his retrospective&lt;/a&gt; shared in the community forums.&lt;/p&gt;&lt;p&gt;We can summarize our presentation on the following topics:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Luis started to introduce the scenario and our contribution to this project&lt;/li&gt;&lt;li&gt;I introduced the Apache ManifoldCF approach with its own core framework capabilities&lt;/li&gt;&lt;li&gt;I have shown a video about the new CMIS Output Connector describing how to migrate contents from a generic CMIS-compliant repo to an Alfresco repository without writing any line of code&lt;/li&gt;&lt;li&gt;Luis then started to show another demo about the new Alfresco BFSI Output Connector. BFSI stands for Bulk File System Import tool provided by the Alfresco Repository, this tool is aimed to execute batches for importing contents from a generic file system to Alfresco. This procedure allow any developers to also define eventually standard Java properties files for each content to decorate accordingly all the migrated content with the right properties. In this section Luis described how to create in output a file system based on the BFSI format that is generated from contents taken from different kind of repos such as: a generic file system, using the Alfresco WebScripts Indexer from an Alfresco repo and using the CMIS binding using a generic CMIS-compliant repo. Notice that using the BFSI output format, you can easily (and quickly) migrate contents using the in-place mode if you drop all the contents inside the Alfresco content store directory. This will allow to avoid the stream for binaries without the need to use the ContentService during the import process. This will drastically improve the overall performance for migrating contents going to strongly work only on the Alfresco database without having any effect for the file system because contents will remain in the same location under the content store directory just written by ManifoldCF.&lt;/li&gt;&lt;li&gt;Luis also explained and has shown how the framework also supports incremental crawling for addition. We are also working to correctly manage and synchronize also removed contents.&lt;/li&gt;&lt;/ol&gt;

  

  	
      
      
        
          
            
              &lt;img alt=&quot;Me and Luis during our session introducing content migration with Apache ManifoldCF&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a66036f8165f5a6962dcf58/1516635003074/PJ+and+Luis+-+1.jpeg?format=1000w&quot; /&gt;
            
          

          
          
            &lt;p&gt;Me and Luis during our session introducing content migration with Apache ManifoldCF&lt;/p&gt;
          
          

        
      
      
    

  


&lt;p&gt;At the end of our presentation Nathan said: &lt;em&gt;&amp;lt;&amp;lt;You guys are some kind of Starsky and Hutch for content migration!!!&amp;gt;&amp;gt;&lt;/em&gt; and then I had to create the following meme for commemorating this cool moment :)&lt;/p&gt;

  

  	
      
      
        
          
            
              &lt;img alt=&quot;PJ and Luis as Starsky and Hutch.png&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a686ccd9140b7f6272df9b4/1516793072209/PJ+and+Luis+as+Starsky+and+Hutch.png?format=1000w&quot; /&gt;
            
          

          

        
      
      
    

  


   &lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/PiergiorgioLucidi/smart-content-migration-using-apache-manifoldcf-output-connectors&quot; target=&quot;_blank&quot; title=&quot;Smart Content Migration using Apache ManifoldCF Output Connectors&quot;&gt;Smart Content Migration using Apache ManifoldCF Output Connectors&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/PiergiorgioLucidi&quot; target=&quot;_blank&quot;&gt;Piergiorgio Lucidi&lt;/a&gt;&lt;/strong&gt; &lt;h1&gt;Conference and Alfresco Roadmap&lt;/h1&gt;&lt;p&gt;As you probably know I'm a videogamer and you can imagine how much I was enthusiastic when I saw John Newton mentioning Destiny 2 as a very good example of design of a potential and real user interface.&lt;/p&gt;&lt;p&gt;The benefit of the interaction between a Guardian in Destiny and his own Ghost (this is the name of his intelligent mini drone) allows him to be focused on the action, leaving to the Ghost any further suggestion for the next step to accomplish during his mission. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://a.co/5To7rdT&quot; target=&quot;_blank&quot;&gt;Bungie has integrated the Ghost with Amazon Alexa&lt;/a&gt; and this means that you practically could have a real Ghost near you, while you are playing the game. You can talk to your Ghost to interact with the game in real time and changing your equipment with a voice command.&lt;/p&gt;&lt;p&gt;We should spend some words on Bungie that has done a very good job also in terms of designing the public API around the game. This good approach allowed developers to implement different applications using part of the entire game repository around the user assets.&lt;/p&gt;&lt;p&gt;Considering the overall conference, I have to confess that there were an impressive amount of interesting sessions that it was impossible to follow at the same time. I'm looking forward to take a look at these presentations and videos when they will be published on the DevCon website.&lt;/p&gt;&lt;p&gt;It's clear that the future of Alfresco platform is even more related to DevOps approaches with a brand new vision for UX. We have to consider that Alfresco is investing and bringing the previous effort from Share to new standard frameworks to improve the adoption.&lt;/p&gt;&lt;p&gt;Having a huge crowd of developers that can easily create apps on top of Alfresco using skills that now we found in the market can be very effective and I agree with this approach. I would have only wanted more community involvement before pulling ADF out of the cylinder.&lt;/p&gt;&lt;p&gt;Anyway I'm very happy to see that now we have an active discussion with the community about the future of ADF. The discussion started from a simple tweet by &lt;a href=&quot;https://twitter.com/jeffpotts01/status/954052157480747013&quot; target=&quot;_blank&quot;&gt;Jeff&lt;/a&gt; for passing to &lt;a href=&quot;https://twitter.com/binduwavell/status/955855501190881280&quot; target=&quot;_blank&quot;&gt;Bindu&lt;/a&gt; and then &lt;a href=&quot;https://twitter.com/pjlucidi/status/955847250856554498&quot; target=&quot;_blank&quot;&gt;Mario&lt;/a&gt;. If you take a look at what the community is doing it is simply awesome! Great job to everyone from Alfresco guys to community members :)&lt;/p&gt;&lt;p&gt;Alfresco Share is not actually deprecated but considering that is a ready to use application for achieving some generic and common collaboration functionalities, they consider this good enough for making easier an initial adoption of the platform.&lt;/p&gt;&lt;p&gt;I personally think that every time in Content Services and ECM area, it is hard to find a customer / use case that can fit with a generic user interface. Typically it makes sense to work on specific requirements aligned with functionalities across roles and the entire enterprise organization.&lt;/p&gt;&lt;p&gt;What we can expect from this new point of view is trying to bring different UX experiences built with a community approach but vertically specific for each industry or set of needed capabilities.&lt;/p&gt;&lt;p&gt;The new Application Developer Framework (ADF) is starting to be the supported and suggested way for implementing your own front-end apps. And here we see that all the previous energy invested in Share now is all focused on ADF that will be also supported by Alfresco itself.&lt;/p&gt;&lt;p&gt;Finally I want just to say that it was so fun to exchange opinions and considerations about the market and all the different aspects around Alfresco with all of you during the break, lunch and dinner.&lt;/p&gt;&lt;p class=&quot;text-align-center&quot;&gt;&lt;strong&gt;&lt;em&gt;Thank you all for having spent great moments together! &lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;See you at the next Alfresco DevCon!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;text-align-center&quot;&gt;&lt;em&gt;&lt;strong&gt;I'll update this post as soon as possible with new photos and all the material related to our session with the presentation and the demo videos when it will be published from Alfresco. &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p class=&quot;text-align-center&quot;&gt;&lt;em&gt;&lt;strong&gt;Stay tuned ;)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;



  

  



  
    
      

        
          
            
              
                &lt;img alt=&quot;  Nathan McMinn ,  Axel Faust ,  Luis Cabaceira , PJ,  Jeff Potts  and  Boriss Mejias .&amp;amp;nbsp;  Thanks a lot to  Nathan McMinn  for this epic shot!   &quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a67b5640d92973101ef5bf2/1516748473564/LXFactoryDinner.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      
                      &lt;p&gt;&lt;a href=&quot;https://twitter.com/ntmcminn&quot; target=&quot;_blank&quot;&gt;Nathan McMinn&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/ReluctantBird83&quot; target=&quot;_blank&quot;&gt;Axel Faust&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/luiscabaceira&quot; target=&quot;_blank&quot;&gt;Luis Cabaceira&lt;/a&gt;, PJ, &lt;a href=&quot;https://twitter.com/jeffpotts01&quot; target=&quot;_blank&quot;&gt;Jeff Potts&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/tchorix&quot; target=&quot;_blank&quot;&gt;Boriss Mejias&lt;/a&gt;. &lt;em&gt;&lt;strong&gt;Thanks a lot to &lt;a href=&quot;https://twitter.com/ntmcminn/status/955926780380139520&quot; target=&quot;_blank&quot;&gt;Nathan McMinn&lt;/a&gt; for this epic shot!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;Alfresco VIP Award by The Order of The Bee&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e1a253450a34f40b7459/1516626435947/VIP+Award+-+Alfresco+-+PJ.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      Alfresco VIP Award by The Order of The Bee
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;Award given to PJ&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e393652dea6b6a452e13/1516626898011/VipAward.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      Award given to PJ
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;Award given to PJ - Thanks to all :)&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e3e20d9297cda9c502d0/1516626951970/VIP+-+PJ+-+Award+2.jpeg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      Award given to PJ - Thanks to all :)
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;ECMCoreAveri - International Alfresco Certified Instructors&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e2178165f575c964bfa1/1516749006073/ECMCoreAveri+-+Team.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      ECMCoreAveri - International Alfresco Certified Instructors
                      &lt;p&gt;Me, &lt;strong&gt;Sabine&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/sarguroh&quot; target=&quot;_blank&quot;&gt;Shoeb&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/olaabs&quot; target=&quot;_blank&quot;&gt;Oliver&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://twitter.com/CristinaMartinR&quot; target=&quot;_blank&quot;&gt;Cristina&lt;/a&gt;&lt;/strong&gt;. &lt;strong&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://twitter.com/CristinaMartinR/status/953952470652346368&quot; target=&quot;_blank&quot;&gt;Cristina&lt;/a&gt; for this great shot :)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;PJ with Shoeb&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e295652dea6b6a45093c/1516626621130/PJ+with+Shoeb.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      PJ with Shoeb
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;PJ and Luis&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e36bc83025655ba92b77/1516626817083/PJ+with+Luis+1.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      PJ and Luis
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;  David ,  Francesco &amp;amp;nbsp;and PJ &quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a6767bd652dea882264abe0/1516748789800/PJ+with+Corti+and+Ciamberlano.jpeg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      
                      &lt;p&gt;&lt;a href=&quot;https://twitter.com/sonosolobit&quot; target=&quot;_blank&quot;&gt;David&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/FrkCorti&quot; target=&quot;_blank&quot;&gt;Francesco&lt;/a&gt; and PJ&lt;/p&gt;
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;Luis introducing the new swerve in Apache ManifoldCF: Content Migration&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a688494c830250731569c7e/1516799248172/PJ+with+Luis+-+4.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      Luis introducing the new swerve in Apache ManifoldCF: Content Migration
                      &lt;p&gt;&lt;em&gt;&lt;strong&gt;Thanks a lot to &lt;a href=&quot;https://twitter.com/ntmcminn/status/955926780380139520&quot; target=&quot;_blank&quot;&gt;Nathan McMinn&lt;/a&gt; for this epic shot!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;PJ with Luis on the stage talking about Content Migration&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e2c6e4966ba2423c352a/1516626680850/PJ+and+Luis+-+1.jpeg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      PJ with Luis on the stage talking about Content Migration
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;PJ with Luis on the stage talking about Content Migration&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e31871c10b2e8a6e8275/1516626741792/PJ+and+Luis+-+2.jpeg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      PJ with Luis on the stage talking about Content Migration
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;PJ with Luis on the stage talking about Content Migration&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e341c83025655ba924b6/1516626779450/PJ+and+Luis+-+3.jpeg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      PJ with Luis on the stage talking about Content Migration
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;Luis and PJ on the stage showing how to crawl contents&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e556085229c76f153e42/1516746032994/Luis+and+PJ.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      Luis and PJ on the stage showing how to crawl contents
                      &lt;p&gt;Thanks to &lt;a href=&quot;https://twitter.com/DjGonk/status/954027072418209792&quot; target=&quot;_blank&quot;&gt;sprouvez&lt;/a&gt; for this great shot!&lt;/p&gt;
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;John Newton introduced Destiny 2 as a good example of user interface interactions&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e64e652dea6b6a459add/1516746033057/John+Newton+with+Destiny+2.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      John Newton introduced Destiny 2 as a good example of user interface interactions
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot;John Newton discussing about the new architecture of the Alfresco Platform&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a65e686c83025655ba9a64e/1516746033173/John+Newton+-+Architecture.jpg?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      John Newton discussing about the new architecture of the Alfresco Platform
                      
                    
                  
                
              
              
            
          
          
        

        

        

      

        
          
            
              
                &lt;img alt=&quot; This meme was created after our presentation for a comment made by Nathan:  &amp;amp;lt;&amp;amp;lt;You guys are some kind of Starsky and Hutch for content migration!!! &amp;amp;gt;&amp;amp;gt;  &quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/5a65e06724a69487b674e7f4/5a686b5253450ae499512099/1516799105696/PJ+and+Luis+as+Starsky+and+Hutch.png?format=1000w&quot; /&gt;&lt;br /&gt;
              

              
                
                  
                    
                      
                      &lt;p&gt;This meme was created after our presentation for a comment made by Nathan: &lt;em&gt;&amp;lt;&amp;lt;You guys are some kind of Starsky and Hutch for content migration!!! &amp;gt;&amp;gt;&lt;/em&gt;&lt;/p&gt;
                    
                  
                
              
              
            
          
          
        

        

        

      
    
  

  
    
    
      
        
          &lt;a class=&quot;previous&quot; href=&quot;https://www.open4dev.com/journal?format=rss&quot;&gt;&lt;/a&gt;
          &lt;a class=&quot;next&quot; href=&quot;https://www.open4dev.com/journal?format=rss&quot;&gt;&lt;/a&gt;</description>
	<pubDate>Wed, 24 Jan 2018 11:11:29 +0000</pubDate>
</item>
<item>
	<title>Isabel Drost: FOSS Backstage - CfP open</title>
	<guid isPermaLink="true">http://blog.isabel-drost-fromm.de/posts/foss-backstage-cfp-open.html</guid>
	<link>http://blog.isabel-drost-fromm.de/posts/foss-backstage-cfp-open.html</link>
	<description>It's almost ten years ago that I attended my first ApacheCon EU in Amsterdam.
I wasn't entirely new to the topic of open source or free software. I attended
several talks on Apache Lucene, Apache Solr, Hadoop, Tomcat, httpd (I still
remember that the most impressive stories didn't necessarily come from the
project members, but from downstream users. They were the ones authorized to
talk publicly about what could be done with the project - and often became
committers themselves down the road.
&lt;br /&gt;&lt;br /&gt;
With &quot;community over code&quot; being one of the main values at Apache, ApacheCon
also hosted several non-technical tracks: Open source and business, Open
Development (nowadays better known as &lt;a href=&quot;http://innersourcecommons.org&quot;&gt;Inner Source&lt;/a&gt;), Open Source project
management, project governance, an Apache Way talk. Over the past decade one
learning survived any wave of tech buzzword: At the end of the day, success in
Open Source (much like in any project) is defined by how well the project is
run (read: managed). Reflecting on that the idea was born to create a space to
discuss just these topics: What does it take to be &quot;Leading the wave of open
source&quot;? 

&lt;br /&gt;&lt;br /&gt;
As announced on Berlin Buzzwords we (that is Isabel Drost-Fromm, Stefan
Rudnitzki as well as the eventing team over at newthinking communications GmbH)
are working on a new conference in summer in Berlin. The name of this new
conference will be &quot;FOSS Backstage&quot;. Backstage comprises all things
FOSS governance, open collaboration and how to build and manage communities
within the open source space.

&lt;br /&gt;&lt;br /&gt;
Submission URL: &lt;a href=&quot;https://foss-backstage.de/call-papers&quot;&gt;Call for
Presentations&lt;/a&gt;

&lt;br /&gt;&lt;br /&gt;
The event will comprise presentations on all things FOSS governance,
decentralised decision making, open collaboration. We invite you to submit talks
on the topics: FOSS project governance, collaboration, community management.
Asynchronous/ decentralised decision making.  Vendor neutrality in FOSS,
sustainable FOSS, cross team collaboration.  Dealing with poisonous people.
Project growth and hand-over. Trademarks. Strategic licensing.  While it's
primarily targeted at contributions from FOSS people, we would love to also
learn more on how typical FOSS collaboration models work well within
enterprises. Closely related topics not explicitly listed above are welcome. 

&lt;br /&gt;&lt;br /&gt;
Important Dates (all dates in GMT +2)

&lt;br /&gt;&lt;br /&gt;
Submission deadline: February 18th, 2018.

&lt;br /&gt;&lt;br /&gt;
Conference: June, 13th/14th, 2018

&lt;br /&gt;&lt;br /&gt;
High quality talks are called for, ranging from principles to practice. We are
looking for real world case studies, background on the social architecture of
specific projects and a deep dive into cross community collaboration.
Acceptance notifications will be sent out soon after the submission deadline.
Please include your name, bio and email, the title of the talk, a brief abstract
in English language.

&lt;br /&gt;&lt;br /&gt;
We have drafted the submission form to allow for regular talks, each 45 min in
length. However you are free to submit your own ideas on how to support the
event: If you would like to take our attendees out to show them your favourite
bar in Berlin, please submit this offer through the CfP form.  If you are
interested in sponsoring the event (e.g. we would be happy to provide videos
after the event, free drinks for attendees as well as an after-show party),
please contact us.

&lt;br /&gt;&lt;br /&gt;
Schedule and further updates on the event will be published soon on the event
web page.

&lt;br /&gt;&lt;br /&gt;
Please re-distribute this CfP to people who might be interested.

&lt;br /&gt;&lt;br /&gt;
 Contact us at:&lt;br /&gt;
 newthinking communications GmbH&lt;br /&gt;
 Schoenhauser Allee 6/7&lt;br /&gt;
 10119 Berlin, Germany&lt;br /&gt;
 info@foss-backstage.de&lt;br /&gt;

&lt;br /&gt;&lt;br /&gt;
Looking forward to meeting you all in person in summer :)</description>
	<pubDate>Tue, 23 Jan 2018 16:21:31 +0000</pubDate>
</item>
<item>
	<title>Colm O hEigeartaigh: Securing Apache Solr with Apache Sentry</title>
	<guid isPermaLink="true">http://coheigea.blogspot.com/2018/01/securing-apache-solr-with-apache-sentry.html</guid>
	<link>http://coheigea.blogspot.com/2018/01/securing-apache-solr-with-apache-sentry.html</link>
	<description>Last year I wrote a &lt;a href=&quot;http://coheigea.blogspot.ie/2017/06/securing-apache-solr-part-i.html&quot;&gt;series&lt;/a&gt; of posts on securing Apache &lt;a href=&quot;http://lucene.apache.org/solr/&quot;&gt;Solr&lt;/a&gt;, firstly using basic authentication and then using Apache &lt;a href=&quot;http://ranger.apache.org/&quot;&gt;Ranger&lt;/a&gt; for authorization. In this post we will look at an alternative authorization solution called Apache &lt;a href=&quot;http://sentry.apache.org/&quot;&gt;Sentry&lt;/a&gt;. Previously I have blogged about using Apache Sentry to secure Apache &lt;a href=&quot;http://coheigea.blogspot.ie/2017/09/securing-apache-hive-part-v.html&quot;&gt;Hive&lt;/a&gt; and Apache &lt;a href=&quot;http://coheigea.blogspot.ie/2016/09/securing-apache-kafka-broker-part-iv.html&quot;&gt;Kafka&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) &lt;/b&gt;&lt;b&gt; Install and deploy a SolrCloud example&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://lucene.apache.org/solr/&quot;&gt;Download&lt;/a&gt; and extract Apache Solr (7.1.0 was used for the purpose of this tutorial). Now start SolrCloud via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/solr -e cloud&lt;/li&gt;&lt;/ul&gt;Accept all of the default options. This creates a cluster of two nodes,  with a collection &quot;gettingstarted&quot; split into two shards and two  replicas per-shard. A web interface is available after startup at:  http://localhost:8983/solr/. Once the cluster is up and running we can post some data to the collection we have created via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/post -c gettingstarted example/exampledocs/books.csv&lt;/li&gt;&lt;/ul&gt;We can then perform a search for all books with author &quot;George R.R. Martin&quot; via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curl http://localhost:8983/solr/gettingstarted/query?q=author:George+R.R.+Martin &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;2) Authenticating users to our SolrCloud instance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now that our SolrCloud instance is up and running, let's look at how we can secure access to it, by using HTTP Basic Authentication to authenticate our REST requests. Download the following security configuration which enables Basic Authentication in Solr:&lt;br /&gt; Two users are defined - &quot;alice&quot; and &quot;bob&quot; - both with password &quot;SolrRocks&quot;. Now upload this configuration to the Apache Zookeeper instance that is running with Solr:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd putfile /security.json security.json&lt;/li&gt;&lt;/ul&gt;Now try to run the search query above again using Curl. A 401 error will be returned. Once we specify the correct credentials then the request will work as expected, e.g.:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curl -u alice:SolrRocks http://localhost:8983/solr/gettingstarted/query?q=author:George+R.R.+Martin &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;3) Using Apache Sentry for authorization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;a) Install the Apache Sentry distribution&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://sentry.apache.org/general/downloads.html&quot;&gt;Download&lt;/a&gt; the binary distribution of Apache Sentry (2.0.0 was used for the purposes of this tutorial).  Verify that the signature is valid and that the message digests match.  Now extract it to ${sentry.home}. Apache Sentry provides an RPC service which  stores authorization privileges in a database. For the purposes of this  tutorial we will just configure the authorization privileges in a  configuration file local to the Solr distrbution. Therefore we don't need to do  any further configuration to the Apache Sentry distribution at this point.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;b) Copy Apache Sentry jars into Apache Solr &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To get Sentry authorization working in Apache Solr, we need to copy some jars from the Sentry distribution into Solr. Copy the following jars from ${sentry.home}/lib into ${solr.home}/server/solr-webapp/webapp/WEB-INF/lib:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sentry-binding-solr-2.0.0.jar&lt;/li&gt;&lt;li&gt;sentry-core-model-solr-2.0.0.jar&lt;/li&gt;&lt;li&gt;sentry-core-model-db-2.0.0.jar&lt;/li&gt;&lt;li&gt;sentry-core-common-2.0.0.jar&lt;/li&gt;&lt;li&gt;shiro-core-1.4.0.jar&lt;/li&gt;&lt;li&gt;sentry-policy*.jar&lt;/li&gt;&lt;li&gt;sentry-provider-*&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;c) Add Apache Sentry configuration files&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Next we will configure Apache Solr to use Apache Sentry for authorization. Create a new file in the Solr distribution called &quot;sentry-site.xml&quot; with the following content (substituting the correct directory for &quot;sentry.solr.provider.resource&quot;):&lt;br /&gt; &lt;b&gt;&lt;/b&gt;This is the configuration file for the Sentry plugin for Solr. It  essentially says that the authorization privileges are stored in a local  file, and that the groups for authenticated users should be retrieved  from this file. Finally, we need to specify the authorization  privileges. Create a new file in the config directory called  &quot;sentry.ini&quot; with the following content:&lt;br /&gt;&lt;br /&gt;This configuration file contains three separate sections. The &quot;[users]&quot;  section maps the authenticated principals to local groups. The  &quot;[groups]&quot; section maps the groups to roles, and the &quot;[roles]&quot; section  lists the actual privileges.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;d) Update security.json to add authorization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Next we need to update the security.json to reference Apache Sentry for authorization. Use the following content, substituting the correct path for the &quot;authorization.sentry.site&quot; parameter. Also change the &quot;superuser&quot; to the user running Sentry:&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt; Upload this file via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd putfile /security.json security.json&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;5) Testing authorization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We need to restart Apache Solr to enable authorization with Apache Sentry. Stop Solr via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin/solr stop -all&lt;/li&gt;&lt;/ul&gt;Next edit 'bin/solr.in.sh' and add the following properties:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SOLR_AUTH_TYPE=&quot;basic&quot;&lt;/li&gt;&lt;li&gt;SOLR_AUTHENTICATION_OPTS=&quot;-Dbasicauth=colm:SolrRocks&quot;&lt;/li&gt;&lt;/ul&gt;Now restart Apache Solr and test authorization. When &quot;bob&quot; is used, an error should be returned (either 403 or in our case 500, as we have not configured a group for &quot;bob&quot;). &quot;alice&quot; should be able to query the collection, due to the authorization policy we have created for her.&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Tue, 23 Jan 2018 16:15:22 +0000</pubDate>
</item>
<item>
	<title>Justin Mason: Links for 2018-01-22</title>
	<guid isPermaLink="true">http://taint.org/2018/01/22/235801a.html</guid>
	<link>http://taint.org/2018/01/22/235801a.html</link>
	<description>&lt;ul&gt;&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;https://github.com/sgayou/medfusion-4000-research/blob/master/doc/README.md&quot; title=&quot;Remote Code Execution on the Smiths Medical Medfusion 4000 Infusion Pump&quot;&gt;Remote Code Execution on the Smiths Medical Medfusion 4000 Infusion Pump&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;‘Between March and June of 2017 I spent around 400 hours of personal time analyzing the Smiths Medical Medfusion 4000 infusion pump for security vulnerabilities. The devices analyzed had software versions 1.1.2 and 1.5.0. The flaws discovered (the most critical of which was a DHCP buffer overflow in the MQX operating system used) were disclosed in a coordinated fashion and are detailed by ICS-CERT in ICSMA-250-02A and CERT in VU#590639.  The goal of this exercise was to help protect patients that rely on therapy provided by the pump, to raise awareness of the risk present in unpatched versions of the device, and, finally, to contribute to the corpus of embedded/IoT security research.’&lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:medical&quot;&gt;medical&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:infusion-pumps&quot;&gt;infusion-pumps&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:security&quot;&gt;security&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:iot&quot;&gt;iot&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:safety&quot;&gt;safety&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:exploits&quot;&gt;exploits&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:embedded-systems&quot;&gt;embedded-systems&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:reversing&quot;&gt;reversing&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;https://markhardisty.wordpress.com/2018/01/14/the-gremlin-loader/&quot; title=&quot;The Gremlin Loader&quot;&gt;The Gremlin Loader&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Writeup of one of the classic tape loaders used on the ZX Spectrum, both for fast loading and piracy protection&lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:piracy&quot;&gt;piracy&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:reverse-engineering&quot;&gt;reverse-engineering&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:history&quot;&gt;history&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:zx-spectrum&quot;&gt;zx-spectrum&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:tape&quot;&gt;tape&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:loaders&quot;&gt;loaders&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:gremlin&quot;&gt;gremlin&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Mon, 22 Jan 2018 23:58:01 +0000</pubDate>
</item>
<item>
	<title>Danny Angus: Note to self: How to re-enable terminal escape sequences in new WindowsConsole</title>
	<guid isPermaLink="true">http://feedproxy.google.com/~r/killerbees/planetapache/~3/aYCMu9NOZTw/note-to-self-how-to-re-enable-terminal.html</guid>
	<link>http://feedproxy.google.com/~r/killerbees/planetapache/~3/aYCMu9NOZTw/note-to-self-how-to-re-enable-terminal.html</link>
	<description>Windows 10 &quot;fall creators update&quot; 2017, more precisely known as Windows 10 version 1709, brings with it a new version of the windows console.&lt;br /&gt;This is the terminal that is used to display cmd.exe and PowerShell commandline environments.&lt;br /&gt;&lt;br /&gt;Now the new version is nice, amongst other things it has is variable transparency, but it turns off processing terminal escape sequences from Python (and probably a load of other things) by default.&lt;br /&gt;&lt;br /&gt;This is how to turn on the processing of terminal escape sequences in Win10 console V2.&lt;br /&gt;&lt;br /&gt;Using RegEdit add &quot;VirtualTerminalLevel&quot; as a DWORD to ‘HKCU\Console’ set to value 0x1&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;restart the console and bob is your uncle.&lt;/div&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/killerbees/planetapache/~4/aYCMu9NOZTw&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 20 Jan 2018 14:26:24 +0000</pubDate>
</item>
<item>
	<title>Justin Mason: Links for 2018-01-19</title>
	<guid isPermaLink="true">http://taint.org/2018/01/19/235801a.html</guid>
	<link>http://taint.org/2018/01/19/235801a.html</link>
	<description>&lt;ul&gt;&lt;li&gt;&lt;p&gt;
&lt;a class=&quot;deliciouslink&quot; href=&quot;https://www.buzzfeed.com/tomphillips/twitterstorm-2018#.kqVav78p5&quot; title=&quot;The 29 Stages Of A Twitterstorm In 2018&quot;&gt;The 29 Stages Of A Twitterstorm In 2018&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;’14. Then suddenly there are Nazis everywhere.’ &lt;/p&gt;
&lt;p&gt;(tags: &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:twitter&quot;&gt;twitter&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:twitterstorms&quot;&gt;twitterstorms&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:funny&quot;&gt;funny&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:2018&quot;&gt;2018&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:nazis&quot;&gt;nazis&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:alt-right&quot;&gt;alt-right&lt;/a&gt; &lt;a class=&quot;delicioustag&quot; href=&quot;http://pinboard.in/u:jm/t:memes&quot;&gt;memes&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Fri, 19 Jan 2018 23:58:01 +0000</pubDate>
</item>
<item>
	<title>Jonathan Anstey: Camel in Action, Second Edition is Complete!</title>
	<guid isPermaLink="true">http://janstey.blogspot.com/2018/01/camel-in-action-second-edition-is.html</guid>
	<link>http://janstey.blogspot.com/2018/01/camel-in-action-second-edition-is.html</link>
	<description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-fijME3MPlNY/WmHtSGvWMxI/AAAAAAAAQgE/Db9JwwRe5vE0sXEvuHbvv4Gzh3YPdtIQACLcBGAs/s1600/Ibsen-Camel-2ED-7%2B%25281%2529.jpg&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://4.bp.blogspot.com/-fijME3MPlNY/WmHtSGvWMxI/AAAAAAAAQgE/Db9JwwRe5vE0sXEvuHbvv4Gzh3YPdtIQACLcBGAs/s320/Ibsen-Camel-2ED-7%2B%25281%2529.jpg&quot; width=&quot;247&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://www.manning.com/books/camel-in-action-second-edition&quot;&gt;Camel in Action Website&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;We did it again &lt;a class=&quot;g-profile&quot; href=&quot;https://plus.google.com/107832544350505823194&quot; target=&quot;_blank&quot;&gt;+Claus Ibsen&lt;/a&gt; :-) Camel in Action, 2nd edition is printing as I type this blog and will be in book stores in a few weeks. Time to celebrate!&lt;br /&gt;&lt;br /&gt;Our theme this time around is more - more of everything to help you get started with Apache Camel and more for seasoned integration vets too. Well, this has kinda been the approach in Apache Camel since the last book as well. Let's look at some stats from the Camel versions used in each book edition:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Camel 2.5.0&lt;/th&gt;&lt;th&gt;Camel 2.20.1&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;gt;80  components&lt;/td&gt;&lt;td&gt;&amp;gt;280 components&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;482,779 LOC&lt;/td&gt;&lt;td&gt;1307016 LOC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;23 named contributors&lt;/td&gt;&lt;td&gt;497 named contributors&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;So yeah, Camel is a lot bigger this time round and so our book had to be too :-) It's amazing how much the project has grown TBH. The component count has more than tripled, LOC near that as well and the number of contributors has just blown up. Now, granted back in the early days of Camel we used SVN which didn't allow named contributors to be counted until they were actual Apache Camel committers themselves (GitHub PRs to the rescue!!). Still, I estimate the actual number of contributors has doubled at the very least.&lt;br /&gt;&lt;br /&gt;It's not just components that have been added to Camel either. This time we needed to cover more topics like: microservices, RESTful web services, containers (think docker/kubernetes), clustering, reactive apps, security, and even IoT. Like last time we had a guest author contribute a chapter about a new emerging technology. Big thanks to Henryk Konsek for contributing the chapter on IoT. Neither myself or Claus has any experience in IoT so we probably wouldn't have covered it if we didn't get an expert on board :-)&lt;br /&gt;&lt;br /&gt;A huge thanks to Claus for being such a pleasure to work with (albeit being a bit hard to keep up with ;-) ). Looking forward to next time round!&lt;br /&gt;&lt;br /&gt;And finally, let me leave you with one of my favourite lines from our book:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;i&gt;&quot;To the Apache Camel community - may this book be a helpful companion on your journeys with Camel&quot;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;</description>
	<pubDate>Fri, 19 Jan 2018 19:46:00 +0000</pubDate>
</item>
<item>
	<title>Rohit Yadav: *** No MethodError Exception: undefined method 'split' for : &quot;content-type&quot;: Symbol</title>
	<guid isPermaLink="true">http://railsblogs.rohityadav.in/2018/01/no-methoderror-exception-undefined.html</guid>
	<link>http://railsblogs.rohityadav.in/2018/01/no-methoderror-exception-undefined.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;When we upload the videos using carrier wave or paperclip then we mostly getting some content-type error like -&lt;/h2&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;*** No MethodError Exception: undefined method 'split' for : &quot;content-type&quot;: Symbol&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Then we have to check our RVM Version if version is  &lt;/h3&gt; &lt;span&gt;&lt;b style=&quot;font-weight: bold;&quot;&gt;ruby-2.2.1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WE NEED TO CHANGE OUR RVM:-&lt;br /&gt;WE NEED TO USE :-&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;color: #38761d;&quot;&gt; ruby-2.3.1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 18 Jan 2018 07:27:01 +0000</pubDate>
</item>
<item>
	<title>Bryan Pendleton: Up, up, and away</title>
	<guid isPermaLink="true">http://bryanpendleton.blogspot.com/2018/01/up-up-and-away.html</guid>
	<link>http://bryanpendleton.blogspot.com/2018/01/up-up-and-away.html</link>
	<description>&lt;p&gt;OK, sports fans, here we go! &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.salesforce.com/blog/2018/01/a-look-inside-salesforce-tower.html&quot; target=&quot;blank_&quot;&gt;&lt;i&gt;A Look Inside Salesforce Tower&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;Get an inside look through the eyes of an employee working in the building! &lt;/blockquote&gt;</description>
	<pubDate>Thu, 18 Jan 2018 04:19:11 +0000</pubDate>
</item>
<item>
	<title>David Reid: Flirting with the dark side…</title>
	<guid isPermaLink="true">https://blog.david-reid.com/2018/01/17/flirting-with-the-dark-side/</guid>
	<link>https://blog.david-reid.com/2018/01/17/flirting-with-the-dark-side/</link>
	<description>&lt;p&gt;Last month our 2010 27″ iMac stopped working. There was no drama, just a black screen where previously had been the High Sierra backdrop. A quick bit of investigation showed that it wasn’t as simple as a dead machine. The fans still blew and when turned off and on it made all the expected noises. There was just no picture. Plugging in an external monitor soon showed that the machine was usable and still functioning normally. After 7 years of service it seemed as if the LCD panel had finally failed.&lt;/p&gt;
&lt;p&gt;The law of murphy stalks all such events and this time was no different. We’re in the midst of &lt;a href=&quot;http://ourupsidedownhome.david-reid.com/&quot;&gt;building a house&lt;/a&gt; so buying a replacement iMac wasn’t really an option. Looking at the pricing and specifications the offerings, none seemed like value for money – even if we had the money and wanted to splash out. However, as the machine was my wifes day to day workhorse, we would soon miss the abilities it offered. A solution was needed.&lt;/p&gt;
&lt;p&gt;When I built my desktop computer 15 months ago I chose standard, well supported components. Given the travel my work entails it often sits idle, so a possible low cost solution would have been for my wife to use my machine. Her MacBook Air is very old and frankly not very pleasant to use for anything beyond mail and surfing the web while my laptop is more than capable. Of course, my desktop runs Windows and she is happier with the world of Apple. But maybe…&lt;/p&gt;
&lt;h3&gt;The Dark Side beckons…&lt;/h3&gt;
&lt;p&gt;Hackintosh is a term I’ve seen a lot, but when I last looked it was very complex and involved a lot of jumping through hoops and using very specific components. Looking again in 2017 revealed how far things had evolved. A lot of reviews and blogs talked about success dual booting a single, home built machine with OSX and Windows. They all mentioned the &lt;a href=&quot;https://www.tonymacx86.com/&quot;&gt;tonymacx86&lt;/a&gt; website which has a lot of information, tutorials and downloads to help.&lt;br /&gt;
Using a monitor I found a suitable USB memory stick, registered with tonymacx86, downloaded the files and shortly afterwards had the USB stick ready for a try. I’ll be honest, I didn’t expect much when I plugged it and powered up my desktop. The black screen with the Apple logo was a surprise. The progress bar slowly filling in was an even bigger surprise but when I was asked to choose an installation language I was glad to be sitting. Perhaps this could work?&lt;/p&gt;
&lt;p&gt;Needing somewhere to install OSX on my desktop I found an older disk and after moving some wiring around had it installed and ready to receive OSX. Powering up again and going through the installtion instructions from the tonymacx86 website proved to be childs play and it didn’t take long for the install to commence. The reboots took me a little by surprise, but the process ran without any issues and soon I was filling in usernames and viewing the High Sierra backdrop.&lt;br /&gt;
Was everything perfect? No. That would have been too much to expect but I was sitting wondering what I was missing as up to this point it had been too simple.&lt;br /&gt;
Continuing with the tonymacx86 installation instructions I ran the &lt;a href=&quot;https://www.tonymacx86.com/resources/multibeast-high-sierra-10-2-0.360/&quot;&gt;MultiBeast&lt;/a&gt; app. This presented the first questions that caused me to pause. What drivers did I actually need? Looking at the OSX Preferences app it was clear no network or sound card had been recognised, so drivers would be needed for those. Ticking the boxes that seemed applicable and installing the Clover bootloader all went as expected and I rebooted – to a black screen.&lt;/p&gt;
&lt;h3&gt;D’oh&lt;/h3&gt;
&lt;p&gt;This was, ironically, the same situation as the existing iMac – a responsive computer with a black screen. The fact it had worked previously meant it wasn’t a total roadblock and after some research I copied the USB stick EFI folder over the same folder on the installed bootloader. Rebooting rewarded me with a login screen and working network! The sound card had been recognised and was listed but as my sound is via the HDMI cable I still wasn’t hearing anything. Having a 4K monitor on my desktop has been great, but when running OSX it wasn’t great as the font size was far too small. Without a way to change the display font using the machine was mildly frustrating despite the change from the i3 2010 processor to the i7 2016 processor being very evident.&lt;/p&gt;
&lt;p&gt;I tried a few things but wasn’t able to get the sound working via HDMI after trying a large number of different approaches outlined by people. The community seems to be gaining cohesion and the tools are certaiinly improving but I still found myself looking at version incompatibilities, outdated and incomplete instructions that were often filled with abbreviations that meant nothing to me. Clover is an interesting tool but isn’t as user friendly as many claim it to be.&lt;/p&gt;
&lt;h3&gt;Fixed!&lt;/h3&gt;
&lt;p&gt;We discovered a fix for the black screen on the iMac during this process. It was a bug related to the iMac goiong to sleep. Armed with this knowledge we were able to restore it to full working order, removing the need for me to continue. While I haven’t taken this any further when the iMac does eventually cease to be usable I will seriously consider building a Hackintosh. A quick costing with suitable components showed that it would save around £1000 over a comparable iMac, resulting in a machine that could be expanded and upgraded.&lt;/p&gt;</description>
	<pubDate>Wed, 17 Jan 2018 11:39:07 +0000</pubDate>
</item>
<item>
	<title>Rohit Yadav: HOW TO CALL RAILS API FROM SIMPLE HTML PAGE.</title>
	<guid isPermaLink="true">http://railsblogs.rohityadav.in/2018/01/calling-rails-api-from-simple-html-page.html</guid>
	<link>http://railsblogs.rohityadav.in/2018/01/calling-rails-api-from-simple-html-page.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Calling the rails API from simple HTML page.&lt;/h2&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Step 1:  Create new form in the HTML page.&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;index.html.erb&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&amp;lt;form action=&quot;javascript:void(0)&quot;&amp;gt;&lt;br /&gt;  &amp;lt;input type=&quot;text&quot; name=&quot;first_name&quot; id=&quot;first_name&quot;&amp;gt;&lt;br /&gt;  &amp;lt;select name=&quot;resident&quot; id=&quot;resident&quot;&amp;gt;&lt;br /&gt;    &amp;lt;option value=&quot;&quot;&amp;gt;Select&amp;lt;/option&amp;gt;&lt;br /&gt;    &amp;lt;option value=&quot;true&quot;&amp;gt;true&amp;lt;/option&amp;gt;&lt;br /&gt;    &amp;lt;option value=&quot;false&quot;&amp;gt;false&amp;lt;/option&amp;gt;&lt;br /&gt;  &amp;lt;/select&amp;gt;&lt;br /&gt;  &amp;lt;textarea type=&quot;textarea&quot; name=&quot;notes&quot; id=&quot;notes&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;  &amp;lt;input type=&quot;file&quot; name=&quot;image&quot; id=&quot;image&quot;&amp;gt;&lt;br /&gt;  &amp;lt;button type=&quot;button&quot; name=&quot;submit&quot; id=&quot;form_submit_api&quot;&amp;gt;Send Data&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js&quot; integrity=&quot;sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Step 2:  Write the script for passing the form data and post the data content to the Controller action using ajax.&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;    $(&quot;#form_submit_api&quot;).on(&quot;click&quot;, function(){&lt;br /&gt;      var formData = new FormData();&lt;br /&gt;      formData.append('image', $('input[type=file]')[0].files[0]); &lt;br /&gt;      formData.append('first_name', $(&quot;#first_name&quot;).val());&lt;br /&gt;      formData.append('resident', $(&quot;#resident&quot;).val()); &lt;br /&gt;      formData.append('notes', $(&quot;#notes&quot;).val()); &lt;br /&gt;      $.ajax({&lt;br /&gt;        type: &quot;POST&quot;, &lt;br /&gt;        url: &quot;http://localhost:3000/api/v1/users&quot;, &lt;br /&gt;        data: formData,  &lt;br /&gt;        processData: false, &lt;br /&gt;        contentType: false, &lt;br /&gt;        success: function(response) { &lt;br /&gt;          window.location.href = window.location.href;&lt;br /&gt;        },&lt;br /&gt;        error: function(response) { &lt;br /&gt;          alert(response.statusText); &lt;br /&gt;        }     &lt;br /&gt;      });  &lt;br /&gt;});    &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Now passing the image and other form data in the FormData :-&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/36448724/send-formdata-object-and-an-additional-parameter-via-ajax&quot;&gt;&lt;b&gt;https://stackoverflow.com/questions/36448724/send-formdata-object-and-an-additional-parameter-via-ajax&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 17 Jan 2018 10:53:37 +0000</pubDate>
</item>
<item>
	<title>Rohit Yadav: UNINITIALIZED CONSTANT PAPERCLIP::STORAGE::S3::AWS</title>
	<guid isPermaLink="true">http://railsblogs.rohityadav.in/2018/01/uninitialized-constant.html</guid>
	<link>http://railsblogs.rohityadav.in/2018/01/uninitialized-constant.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Set up Ruby on Rails with Paperclip and S3 using AWS SDK&lt;/h2&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Paperclip requires the following gems added to your Gemfile.&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;If your &lt;i&gt;paperclip version is 5.1.0 then we are using 'aws-sdk' version 2.3.&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;gem 'paperclip'&lt;br /&gt;gem 'aws-sdk', '~&amp;gt; 2.3'&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;or our &lt;i&gt;paperclip version is 4.1.0 then we need to use 'aws-sdk'  version &amp;lt; 2  (note: add version less than 2.0 otherwise you will get  paperclip error)&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;gem 'paperclip'&lt;br /&gt;gem 'aws-sdk', '&amp;lt; 2.0'&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Run bundle install and restart the Rails server after modifying the Gemfile.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WE CAN FOLLOW THE LINK BELOW :-&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/thoughtbot/paperclip/issues/2388&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;https://github.com/thoughtbot/paperclip/issues/2388&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://coderwall.com/p/vv1iwg/set-up-ruby-on-rails-with-paperclip-5-and-s3-using-aws-sdk-v2&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;https://coderwall.com/p/vv1iwg/set-up-ruby-on-rails-with-paperclip-5-and-s3-using-aws-sdk-v2 &lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 17 Jan 2018 10:20:10 +0000</pubDate>
</item>
<item>
	<title>Rohit Yadav: RAILS: UPLOADING PHOTOS VIA AMAZON S3 AND PAPERCLIP (UPLOADING FILES TO S3 IN RUBY WITH PAPERCLIP)</title>
	<guid isPermaLink="true">http://railsblogs.rohityadav.in/2018/01/rails-uploading-photos-via-amazon-s3.html</guid>
	<link>http://railsblogs.rohityadav.in/2018/01/rails-uploading-photos-via-amazon-s3.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Set up Ruby on Rails with Paperclip and S3 using AWS SDK&lt;br /&gt;Uploading Files to S3 in Ruby with Paperclip&lt;/h2&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Paperclip requires the following gems added to your Gemfile.&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;If your &lt;i&gt;paperclip version is 5.1.0 then we are using 'aws-sdk' version 2.3.&lt;/i&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;# Gemfile&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;gem 'paperclip'&lt;br /&gt;gem 'aws-sdk', '~&amp;gt; 2.3'&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;or our &lt;i&gt;paperclip version is 4.1.0 then we need to use 'aws-sdk' version &amp;lt; 2  (note: add version less than 2.0 otherwise you will get paperclip error)&lt;/i&gt;&lt;/b&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;gem 'paperclip'&lt;br /&gt;gem 'aws-sdk', '&amp;lt; 2.0'&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Run bundle install and restart the Rails server after modifying the Gemfile.&lt;/b&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Then run the command :-&lt;/b&gt;&lt;/h4&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;rails generate paperclip user image &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Define the file attribute in the Model&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;class User &amp;lt; ActiveRecord::Base&lt;br /&gt;    has_attached_file :image, styles: { medium: &quot;300x300&amp;gt;&quot;, thumb: &quot;100x100&amp;gt;&quot; }, default_url: &quot;/images/:style/missing.png&quot;&lt;br /&gt;      validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/&lt;br /&gt;end&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Migrations: Now our migration file look like :-&lt;/b&gt;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;class AddAvatarColumnsToUsers &amp;lt; ActiveRecord::Migration&lt;br /&gt;  def up&lt;br /&gt;    add_attachment :users, :image&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def down&lt;br /&gt;    remove_attachment :users, :image&lt;br /&gt;  end&lt;br /&gt;end&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;View Page :-&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&amp;lt;%= form_for @user, url: users_path, html: { multipart: true } do |form| %&amp;gt;&lt;br /&gt;  &amp;lt;%= form.file_field :image %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now in the controller :-&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;def create&lt;br /&gt;  @user = User.create( user_params )&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;private&lt;br /&gt;def user_params&lt;br /&gt;  params.require(:user).permit(:image)&lt;br /&gt;end&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In our view page we can show the image using :-&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&amp;lt;%= image_tag @user.image.url %&amp;gt;&lt;br /&gt;&amp;lt;%= image_tag @user.image.url(:medium) %&amp;gt;&lt;br /&gt;&amp;lt;%= image_tag @user.image.url(:thumb) %&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;After that :-&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;S3 bucket Implementation:-&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;b&gt;1. Go to Aws Console&lt;br /&gt;2. Create the s3 bucket with bucket name and choose specific region.&lt;br /&gt;3. Get the app_key and app_secret (link: https://www.multcloud.com/tutorials/s3-key.html)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;We’ll also need to specify the AWS configuration variables for the &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;development/production Environment&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;# config/environments/production.rb&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;config.paperclip_defaults = {&lt;br /&gt;    storage: :s3,&lt;br /&gt;    s3_credentials: {&lt;br /&gt;    bucket: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;ENV.fetch(&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;'S3_BUCKET_NAME'&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;    access_key_id: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;ENV.fetch(&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;'AWS_ACCESS_KEY_ID'&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;    secret_access_key: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;ENV.fetch(&lt;span style=&quot;color: #134f5c;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;'AWS_SECRET_ACCESS_KEY'&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;    s3_region: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;ENV.fetch(&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;'AWS_REGION'&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;   &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;    }&lt;br /&gt;  } &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;OR IF YOU ARE CREATING NEW FILE IN CONFIG FOLDER FOR SAVING THE S3 CREDENTIALS THEN WE JUST HAVE TO CHANGE OUR MODEL SETTING AND WE CAN GET THE S3_CREDENTIALS FROM CONFIG FILE :-&lt;/h3&gt;&lt;b&gt;Model :-&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;b&gt;class User &amp;lt; ActiveRecord::Base&lt;br /&gt;     has_attached_file :image,:styles =&amp;gt; { :icon =&amp;gt; &quot;50x50&amp;gt;&quot;, :small =&amp;gt; &quot;150x150&quot;, :medium =&amp;gt; &quot;300x300&amp;gt;&quot;, :thumb =&amp;gt; &quot;100x100&amp;gt;&quot; }, :default_url =&amp;gt; &quot;/assets/icons/picture.png&quot;, :storage =&amp;gt; :s3,:s3_credentials =&amp;gt; &quot;#{Rails.root}/config/aws_s3.yml&quot;,:url =&amp;gt; ':s3_domain_url', :path=&amp;gt; &quot;:attachment/:id/:style/:filename&quot;&lt;br /&gt;&lt;br /&gt;      validates_attachment_content_type :image, :content_type =&amp;gt; /\Aimage\/.*\Z/&lt;br /&gt;end&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;# config/aws_s3.yml&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;development:&lt;br /&gt;bucket: ENV.fetch('S3_BUCKET_NAME')&lt;br /&gt;access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID')&lt;br /&gt;secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY')&lt;br /&gt;s3_region: ENV.fetch('AWS_REGION') &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WE CAN REFER :-&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/thoughtbot/paperclip&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;https://github.com/thoughtbot/paperclip&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://devcenter.heroku.com/articles/paperclip-s3#define-the-file-attribute-in-the-model&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;https://devcenter.heroku.com/articles/paperclip-s3#define-the-file-attribute-in-the-model&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://coderwall.com/p/vv1iwg/set-up-ruby-on-rails-with-paperclip-5-and-s3-using-aws-sdk-v2&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;https://coderwall.com/p/vv1iwg/set-up-ruby-on-rails-with-paperclip-5-and-s3-using-aws-sdk-v2&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.korenlc.com/rails-uploading-photos-via-amazon-s3-and-paperclip/&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;http://www.korenlc.com/rails-uploading-photos-via-amazon-s3-and-paperclip/&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 17 Jan 2018 07:59:15 +0000</pubDate>
</item>
<item>
	<title>Bryan Pendleton: Oh this is a shame</title>
	<guid isPermaLink="true">http://bryanpendleton.blogspot.com/2018/01/oh-this-is-shame.html</guid>
	<link>http://bryanpendleton.blogspot.com/2018/01/oh-this-is-shame.html</link>
	<description>&lt;p&gt;For the last few years my favorite web site had become &lt;a href=&quot;https://www.theawl.com/2018/01/awl-ends/&quot; target=&quot;blank_&quot;&gt;The Awl&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;And now, no more. &lt;/p&gt;&lt;p&gt;Bummer. &lt;/p&gt;&lt;p&gt;I hope all those &lt;b&gt;EXTREMELY&lt;/b&gt; talented writers and editors find good new locations elsewhere.&lt;/p&gt;</description>
	<pubDate>Wed, 17 Jan 2018 04:17:11 +0000</pubDate>
</item>
<item>
	<title>Aaron Morton: Analyzing Cassandra Performance with Flame Graphs</title>
	<guid isPermaLink="true">http://thelastpickle.com/blog/2018/01/16/cassandra-flame-graphs.html</guid>
	<link>http://thelastpickle.com/blog/2018/01/16/cassandra-flame-graphs.html</link>
	<description>&lt;p&gt;One of the challenges of running large scale distributed systems is being able to pinpoint problems.  It’s all too common to blame a random component (usually a database) whenever there’s a hiccup even when there’s no evidence to support the claim.  We’ve already discussed the importance of &lt;a href=&quot;http://thelastpickle.com/blog/2017/04/13/monitoring-cassandra-using-intel-snap.html&quot;&gt;monitoring tools&lt;/a&gt;, graphing and alerting metrics, and using distributed tracing systems like &lt;a href=&quot;http://thelastpickle.com/blog/2016/05/05/self-tracing-zipkin.html&quot;&gt;ZipKin&lt;/a&gt; to correctly identify the source of a problem in a complex system.&lt;/p&gt;

&lt;p&gt;Once you’ve narrowed down the problem to a single system, what do you do?  To figure this out, it’s going to depend on the nature of the problem, of course.  Some issues are temporary, like a dead disk.  Some are related to a human-introduced change, like a deployment or a wrong configuration setting.  These have relatively straightforward solutions.  Replace the disk, or rollback the deployment.&lt;/p&gt;

&lt;p&gt;What about problems that are outside the scope of a simple change?  One external factor that we haven’t mentioned so far is growth.  Scale can be a difficult problem to understand because reproducing the issue is often nuanced and complex.  These challenges are sometimes measured in throughput, (requests per second), size (terabytes), or latency (5ms p99).  For instance, if a database server is able to serve every request out of memory, it may get excellent throughput.  As the size of the dataset increases, random lookups are more and more likely to go to disk, decreasing throughput.  &lt;a href=&quot;http://thelastpickle.com/blog/2016/12/08/TWCS-part1.html&quot;&gt;Time Window Compaction Strategy&lt;/a&gt; is a great example of a solution to a scale problem that’s hard to understand unless the numbers are there.  The pain of compaction isn’t felt until you’re dealing with a large enough volume of data to cause performance problems.&lt;/p&gt;

&lt;p&gt;During the times of failure we all too often find ourselves thinking of the machine and its processes as a black box.  Billions of instructions executing every second without the ability to peer inside and understand its mysteries.&lt;/p&gt;

&lt;p&gt;Fortunately, we’re not completely blind as to what a machine is doing.  For years we’ve had tools like debuggers and profilers available to us.  Oracle’s JDK offers us Java Flight Recorder, which we can use to analyze running processes locally or in production:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;mission control&quot; src=&quot;http://feeds.feedburner.com/files/flame-graphs/mission-control.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Profiling with flight recorder is straightforward, but interpreting the results takes a little bit of work.  Expanding the list of nested tables and looking for obvious issues is a bit more mental work than I’m interested in.  It would be a lot easier if we could visualize the information.  It requires a commercial license to use in production, and only works with the Oracle JDK.&lt;/p&gt;

&lt;p&gt;That brings us back to the subject of this post: a way of generating useful visual information called a flame graph.  A flame graph let’s us quickly identify the performance bottlenecks in a system.   They were invented by &lt;a href=&quot;http://www.brendangregg.com/flamegraphs.html&quot;&gt;Brendan Gregg&lt;/a&gt;.  This is also part one of a very long series of performance tuning posts, we will be referring back to it as we dive deeper into the internals of Cassandra.&lt;/p&gt;

&lt;h3 id=&quot;swiss-java-knife&quot;&gt;Swiss Java Knife&lt;/h3&gt;

&lt;p&gt;The approach we’ll examine in this post is utilizing the &lt;a href=&quot;https://github.com/aragozin/jvm-tools&quot;&gt;Swiss Java Knife&lt;/a&gt;, usually referred to as SJK, to capture the data from the JVM and generate the flame graphs.  SJK is a fantastic collection of tools.  Aside from generating flame graphs, we can inspect garbage collection statistics, watch threads, and do a variety of other diagnostic tasks.  It works on Mac, Linux, and both the Oracle JDK and the OpenJDK.&lt;/p&gt;

&lt;p&gt;I’ve downloaded the JAR, put it in my &lt;code class=&quot;highlighter-rouge&quot;&gt;$HOME/bin&lt;/code&gt; and set up a shell function to call it easily:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sjk &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; ~/bin/sjk-plus-0.8.jar &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On my laptop I’m running a workload with cassandra-stress.  I’ve prepopulated the database, and started the stress workload with the following command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cassandra-stress &lt;span class=&quot;nb&quot;&gt;read &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1000000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the first step of our analysis, we need to capture the stack frames of our running Java application using the stcap feature of SJK.  To do this, we need to pass in the process id and the file to which we will dump the data.  The dumps are written in a binary format that we’ll be able to query later:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sjk stcap &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 92541 &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; 10ms &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; dump.std
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we can analyze the data.  If all we have is a terminal, we can print out a histogram of the analysis.  This can be pretty useful on it’s own if there’s an obvious issue.   In this case, we can see that a lot of time is spent in &lt;code class=&quot;highlighter-rouge&quot;&gt;sun.misc.Unsafe.park&lt;/code&gt;, meaning threads are just waiting around, parked:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sjk ssa &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; dump.std &lt;span class=&quot;nt&quot;&gt;--histo&lt;/span&gt;
Trc     &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;%&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;  Frm  N  Term    &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;%&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;  Frame
372447  96%  372447       0   0%  java.lang.Thread.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Thread.java:745&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
309251  80%  309251  309251  80%  sun.misc.Unsafe.park&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Native Method&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
259376  67%  259376       0   0%  java.util.concurrent.locks.LockSupport.park&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;LockSupport.java:304&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
254388  66%  254388       0   0%  org.apache.cassandra.concurrent.SEPWorker.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;SEPWorker.java:87&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 55709  14%  55709        0   0%  java.util.concurrent.ThreadPoolExecutor&lt;span class=&quot;nv&quot;&gt;$Worker&lt;/span&gt;.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ThreadPoolExecutor.java:617&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 52374  13%  52374        0   0%  org.apache.cassandra.concurrent.NamedThreadFactory&lt;span class=&quot;nv&quot;&gt;$$&lt;/span&gt;Lambda&lt;span class=&quot;nv&quot;&gt;$6&lt;/span&gt;/1758056825.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Unknown Source&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 52374  13%  52374        0   0%  org.apache.cassandra.concurrent.NamedThreadFactory.lambda&lt;span class=&quot;nv&quot;&gt;$threadLocalDeallocator$0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;NamedThreadFactory.java:81&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 44892  11%  44892        0   0%  io.netty.util.concurrent.DefaultThreadFactory&lt;span class=&quot;nv&quot;&gt;$DefaultRunnableDecorator&lt;/span&gt;.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;DefaultThreadFactory.java:138&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 44887  11%  44887        0   0%  java.util.concurrent.ThreadPoolExecutor.runWorker&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ThreadPoolExecutor.java:1127&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  io.netty.channel.nio.NioEventLoop.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;NioEventLoop.java:409&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  io.netty.util.concurrent.SingleThreadEventExecutor&lt;span class=&quot;nv&quot;&gt;$5&lt;/span&gt;.run&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;SingleThreadEventExecutor.java:858&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  io.netty.channel.nio.NioEventLoop.select&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;NioEventLoop.java:753&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  sun.nio.ch.KQueueArrayWrapper.poll&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;KQueueArrayWrapper.java:198&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  sun.nio.ch.KQueueSelectorImpl.doSelect&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;KQueueSelectorImpl.java:117&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398    42398  11%  sun.nio.ch.KQueueArrayWrapper.kevent0&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Native Method&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  sun.nio.ch.SelectorImpl.lockAndDoSelect&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;SelectorImpl.java:86&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 42398  11%  42398        0   0%  sun.nio.ch.SelectorImpl.select&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;SelectorImpl.java:97&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that we have our &lt;code class=&quot;highlighter-rouge&quot;&gt;stcap&lt;/code&gt; dump, we can generate a flame graph with the following command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sjk ssa &lt;span class=&quot;nt&quot;&gt;--flame&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; dump.std &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; flame-sjk.svg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When you open the SVG in a browser, you should end up with an image which looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;sjk-flame-screen&quot; src=&quot;http://feeds.feedburner.com/files/flame-graphs/flame-sjk-screen.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you open the flame graph on your machine you can mouse over the different sections to see the method call and percentage of time it’s taking.  The wider the bar, the more frequent it’s present in the stacks.  It’s very easy to glance at the graph to understand where the time is spent in our program.&lt;/p&gt;

&lt;p&gt;This is not the only technique for generating flame graphs.  Brendan Gregg has a long list of links and references I recommend reading at the bottom of his &lt;a href=&quot;http://www.brendangregg.com/flamegraphs.html&quot;&gt;FlameGraph page&lt;/a&gt;.  I intend to write a utility to export the SJK format to the format that Brendan uses on his blog as it’s a little nicer to look, has a better mouseover, supports drill down, and has a search.  They also support &lt;a href=&quot;http://www.brendangregg.com/blog/2014-11-09/differential-flame-graphs.html&quot;&gt;differential flame graphs&lt;/a&gt;, which are nice if you’re doing performance comparisons across different builds.&lt;/p&gt;

&lt;p&gt;I hope you’ve enjoyed this post on visualizing Cassandra’s performance using FlameGraphs.  We’ve used this tool several times with the teams we’ve worked with to tune Cassandra’s configurations and optimize performance.  In the next post in this series we’ll be examining how to tune garbage collection parameters to maximize throughput while keeping latency to a minimum.&lt;/p&gt;</description>
	<pubDate>Tue, 16 Jan 2018 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Ortwin Glück: [Code] Gentoo intel-microcode reorg</title>
	<guid isPermaLink="true">http://www.odi.ch/weblog/posting.php?posting=724</guid>
	<link>http://www.odi.ch/weblog/posting.php?posting=724</link>
	<description>Gentoo has given more love to its &lt;code&gt;sys-firmware/intel-microcode&lt;/code&gt; package. It's now easier than ever to update microcode automatically early on boot. This is a valuable alternative to shipping microcode within the BIOS. I mean honestly, who regularly checks for BIOS updates? Much easier by doing that through an ebuild.&lt;br /&gt;
&lt;br /&gt;
The new USE flag &lt;code&gt;initramfs&lt;/code&gt; now builds a cpio archive at &lt;code&gt;/boot/intel-uc.img&lt;/code&gt; ready to be used by grub. In &lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt;:&lt;br /&gt;
&lt;pre&gt;menuentry 'Gentoo Linux 4.14' {
  root=hd0,1
  linux /boot/linux-4.14.12 root=LABEL=ROOT ro rootfstype=ext4 net.ifnames=0
  initrd &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;strong&gt;/boot/intel-uc.img&lt;/strong&gt;&lt;/span&gt; /boot/initrd.img
}
&lt;/pre&gt;
Note how the microcode intitramfs is simply prepended to the boot initramfs (initrd). A kernel that has microcode laoding support enabled will find it there, upload the microcode into the cpu and then discard the initramfs blob, and continue booting with the initrd.img.  The first line in your dmesg output will show:
&lt;pre&gt;microcode: microcode updated early to revision 0x80, date = 2018-01-04&lt;/pre&gt;</description>
	<pubDate>Mon, 15 Jan 2018 09:10:30 +0000</pubDate>
</item>
<item>
	<title>Bryan Pendleton: Artemis: a very short review</title>
	<guid isPermaLink="true">http://bryanpendleton.blogspot.com/2018/01/artemis-very-short-review.html</guid>
	<link>http://bryanpendleton.blogspot.com/2018/01/artemis-very-short-review.html</link>
	<description>&lt;p&gt;Andy Weir had the debut novel sensation that, surely, every novelist dreams of: &lt;i&gt;The Martian&lt;/i&gt; was a world-wide best-seller, stayed on the best-seller lists for almost two years, and was then adapted to become one of the top ten movies of 2015. &lt;/p&gt;&lt;p&gt;You can only imagine what a life-changing experience this must have been for a guy who &lt;a href=&quot;https://www.hollywoodreporter.com/news/how-a-99-cent-novel-842582&quot; target=&quot;blank_&quot;&gt;spent 15 years writing novels while working full time&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Anyway, Weir is now back with his second novel: &lt;a href=&quot;https://smile.amazon.com/Artemis-Novel-Andy-Weir/dp/0553448129&quot; target=&quot;blank_&quot;&gt;&lt;i&gt;Artemis&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;In various creative fields, people talk about the &quot;sophomore slump&quot;, and it surely can't have been easy for Weir to figure out how he wanted to write his next book. I'm sure he was also feeling pressure from both his readers and his publisher to hurry up and deliver another book. &lt;/p&gt;&lt;p&gt;So he did. &lt;/p&gt;&lt;p&gt;&lt;i&gt;Artemis&lt;/i&gt; is certainly not the book that &lt;i&gt;The Martian&lt;/i&gt; was. &lt;/p&gt;&lt;p&gt;However, both as a standalone effort and as a companion piece, it is quite interesting. &lt;/p&gt;&lt;p&gt;And, as you should probably grow to expect from Weir, it's a rollicking roller-coaster adventure ride of a book. &lt;/p&gt;&lt;p&gt;But while &lt;i&gt;The Martian&lt;/i&gt; was a book about humans who were in space, and wanted to get back to Earth, &lt;i&gt;Artemis&lt;/i&gt; is a book about people who were on Earth, and have decided that they want to live in space. &lt;/p&gt;&lt;p&gt;Weir is very interested in the notion of what it would mean for humans to be living somewhere other than on Earth, which is indeed a fascinating thing to think about, and &lt;i&gt;Artemis&lt;/i&gt; is of most interest when you look at it from that viewpoint. &lt;/p&gt;&lt;p&gt;&lt;i&gt;Artemis&lt;/i&gt;, as it turns out, spends most of its time spinning tales of completely ordinary experiences that have much more to do with being human beings, than with being in outer space. Rather than being just a sterile laboratory occupied by scientists, as so many &quot;outer space&quot; books are, Weir's outer space civilization is full of everything that makes us human. There are bars, casinos, and night clubs; there are prostitutes, drug dealers, and smugglers; there are petty rivalries, dirty laundry, and double-dealing. &lt;/p&gt;&lt;p&gt;But, most of all, there are complex systems, and, as was true with &lt;i&gt;The Martian&lt;/i&gt;, it is when dealing with interesting complex systems that Weir's book is at its most interesting (even if great literature it ain't): &lt;/p&gt;&lt;blockquote&gt;He wiggled his hand. &quot;That wasn't just you. There were a lot of engineering failures. Like: Why aren't there detectors in the air pipeline for complex toxins? Why did Sanchez store methane, oxygen, and chlorine in a room with an oven? Why doesn't Life Support have its own separate air partition to make sure they'll stay awake if the rest of the city has a problem? Why is Life Support centralized instead of having a separate zone for each bubble? These are the questions people are asking. &lt;/blockquote&gt;&lt;p&gt;Moreover, as Weir observes, these aren't actually engineering questions at their root; they are questions about how we organize our societies, a question which is just as important and relevant in outer space as it is here on Earth: &lt;/p&gt;&lt;blockquote&gt;&quot;The next big step is taxes.&quot; &lt;p&gt;&quot;Taxes?&quot; I snorted. &quot;People come here because they don't want to pay taxes.&quot; &lt;/p&gt;&lt;p&gt;&quot;They already pay taxes -- as rent to KSC. We need to change over to a property-ownership and tax model so the city's wealth is directly tied to the economy. But that's not for a while.&quot; &lt;/p&gt;&lt;p&gt;She took off her glasses. &quot;It's all part of the life-cycle of an economy. First it's lawless capitalism until that starts to impede growth. Next comes regulation, law enforcement, and taxes. After that: public benefits and entitlements. Then, finally, overexpenditure and collapse.&quot; &lt;/p&gt;&lt;p&gt;&quot;Wait. Collapse?&quot; &lt;/p&gt;&lt;p&gt;&quot;Yes, collapse. An economy is a living thing. It's born full of vitality and dies once it's rigid and worn out. Then, through necessity, people break into smaller economic groups and the cycle begins anew, but with more economies. Baby economies, like Artemis is right now.&quot;  &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Although &lt;i&gt;Artemis&lt;/i&gt; ultimately fails as a work of literature, it is promising as a hint of what Weir is interested in, and where he might go. &lt;/p&gt;&lt;p&gt;Humans in space is a fascinating concept, and thinking about it realistically, rather than in some fantastic sterile implausible laboratory fashion, is how we're going to get to a point where we're actually ready to have humans in space. Building space ships and sending people out in them is just an engineering problem, and we'll solve that, probably pretty soon. But economics, politics, crime, government? These are actually &lt;b&gt;HARD&lt;/b&gt; problems. &lt;/p&gt;&lt;p&gt;Writing about them, thinking about them, sharing those ideas, is one way to make it real, and for that, if for nothing else, I enjoyed reading &lt;i&gt;Artemis&lt;/i&gt; and will look forward to Weir's next work.&lt;/p&gt;</description>
	<pubDate>Sun, 14 Jan 2018 01:16:37 +0000</pubDate>
</item>
<item>
	<title>Bryan Pendleton: Public Equity 501</title>
	<guid isPermaLink="true">http://bryanpendleton.blogspot.com/2018/01/public-equity-501.html</guid>
	<link>http://bryanpendleton.blogspot.com/2018/01/public-equity-501.html</link>
	<description>&lt;p&gt;A short lesson, this time; perhaps our education is nearing completion and we are moving on to become graduate students? &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.businesswire.com/news/home/20180110005235/en/Clearlake-Capital-Acquires-Perforce-Software&quot; target=&quot;blank_&quot;&gt;&lt;i&gt;Clearlake Capital Acquires Perforce Software&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;Clearlake Capital Group, L.P. (together with its affiliates, “Clearlake”) today announced that it has acquired Perforce Software (“Perforce” or the “Company”), developer of the industry’s most flexible, scalable and secure version control and collaboration platform, from growth equity investor Summit Partners. The Company will continue to be led by Janet Dryer, CEO, and Mark Ties, COO, who will both join the Board of Directors alongside Clearlake. Financial terms were not disclosed. &lt;/blockquote&gt;</description>
	<pubDate>Wed, 10 Jan 2018 14:34:27 +0000</pubDate>
</item>
<item>
	<title>Steve Loughran: Berlin Buzzwords: CFP with an offer of abstract review</title>
	<guid isPermaLink="true">http://steveloughran.blogspot.com/2018/01/berlin-buzzwords-cfp-with-offer-of.html</guid>
	<link>http://steveloughran.blogspot.com/2018/01/berlin-buzzwords-cfp-with-offer-of.html</link>
	<description>Berlin Buzzwords &lt;a href=&quot;https://berlinbuzzwords.de/18/news/call-submissions-now-open&quot;&gt;CFP is open&lt;/a&gt;, which, along with &lt;a href=&quot;https://dataworkssummit.com/berlin-2018/&quot;&gt;Dataworks Summit&lt;/a&gt; in April, is going to make Berlin the place for technical conferences in 2018.&lt;br /&gt;&lt;a href=&quot;https://www.flickr.com/photos/steve_l/38715166195/in/dateposted/&quot; title=&quot;Berlin&quot;&gt;&lt;img alt=&quot;Berlin&quot; height=&quot;500&quot; src=&quot;https://farm5.staticflickr.com/4668/38715166195_3c02485dc1.jpg&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;br /&gt;As with last year, I'm offering to review people's abstracts before they're submitted; help edit them to get the text to be more in the style that reviewers to tend to go for.&lt;br /&gt;&lt;br /&gt;When we review the talks, we look for interesting things in the themes of the conference, try and balance topics, pick the fun stuff. And we measure that (interesting, fun) on the prose of the submissions, knowing that they get turned into the program for the attendees: we want the text to be compelling for the audience.&lt;br /&gt;&lt;br /&gt;The target audiences for submissions then are twofold. The ultimate audience is the attendees. The reviewers? We're the filter in the way.&lt;br /&gt;&lt;br /&gt;But alongside that content, we want a diverse set of speakers, including people who have never spoken before. Otherwise it gets a bit repetitive (oh, no, stevel will talk on something random, again), and that's no good for the audience. But how do we regulars get in, given that the submission process is anonymous?&lt;br /&gt;&lt;br /&gt;We do it by writing abstracts which we know the reviewers are looking for.&lt;br /&gt;&lt;br /&gt;The review process, then, is a barrier to getting new speakers into the talk, which is dangerous: we all miss out on the insights from other people. And for the possible speakers, they miss out on the fun you have being a speaker at a conf, trying to get your slides together, discovering an hour in advance that you only have 20 min and not 30 for your talk and picking 1/3 of the slides to hide. Or on a trip to say, Boston, having your laptop have a hardware fault and you being grateful you snapshotted it onto a USB stick before you set off. Those are the bad points. The good bits? People coming up to you afterwards and getting into discussion about how they worked on similar stuff but came up with a better answer, how you learn back from the audience about related issues, how you can spend time in Berlin in cafes and wandering round, enjoying the city in early summer, sitting outside at restaurants with other developers from around Europe and the rest of the world, sharing pizza and beer in the the evening. Berlin is a fun place for conferences.&lt;br /&gt;&lt;br /&gt;Which is why people should submit a talk, even if they've never presented before. And to help them, feel free to stick a draft up on google docs &amp;amp; then share with edit rights to my gmail address, steve.loughran@ ;  send me a note and I'll look through.&lt;br /&gt;&lt;br /&gt;yes, I'm one of the reviewers, but in my reviews I call out that I helped with the submission: fairness is everything.&lt;br /&gt;&lt;br /&gt;Last year only one person, &lt;a href=&quot;https://berlinbuzzwords.de/users/raam-rosh-hai&quot;&gt;Raam Rosh Hai&lt;/a&gt;, took this offer up, And he got in, with his talk &lt;a href=&quot;https://berlinbuzzwords.de/17/session/how-build-recommendation-system-overnight&quot;&gt;How to build a recommendation system overnight&lt;/a&gt;! This means that so far, all drafts which have been through this pre-review of submissions process, has a 100% success rate. And, if you look at the video, you'll see its a good talk: he deserved that place.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, Submission deadline: Feb 14. Conference June 10-12.  Happy to help with reviewing draft abstracts.</description>
	<pubDate>Wed, 10 Jan 2018 11:20:47 +0000</pubDate>
</item>
<item>
	<title>Aaron Morton: Meltdown's Impact on Cassandra Latency</title>
	<guid isPermaLink="true">http://thelastpickle.com/blog/2018/01/10/meltdown-impact-on-latency.html</guid>
	<link>http://thelastpickle.com/blog/2018/01/10/meltdown-impact-on-latency.html</link>
	<description>&lt;p&gt;What impact on latency should you expect from applying the kernel patches for the Meltdown security vulnerability?&lt;/p&gt;

&lt;p&gt;TL;DR expect a latency increase of at least 20% for both reads and writes.&lt;/p&gt;

&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://meltdownattack.com&quot;&gt;Meltdown&lt;/a&gt; vulnerability, formally &lt;a href=&quot;https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5754&quot;&gt;CVE-2017-5754&lt;/a&gt;, allows rogue processes to access kernel memory. Simple demonstrations have already appeared online on how to expose passwords and ssh private keys from memory. The consequences of this, in particular on shared hosts (ie cloud) are considered “catastrophic” by security analysts. Initially discovered in early 2017, the vulnerability was planned to be publicly announced on the 9th January 2018. However, due to the attention generated by the frequency of Linux kernel ‘page-table isolation’ (KPTI) patches committed late in 2017 the news broke early on 3rd January 2018.&lt;/p&gt;

&lt;h2 id=&quot;impact&quot;&gt;Impact&lt;/h2&gt;

&lt;p&gt;Without updated hardware, the Linux kernel patches impact CPU usage. While userspace programs are not directly affected, anything that triggers a lot of interrupts to the CPU, such as a database’s use of IO and network, will suffer. Early reports are showing evidence of CPU usage taking a hit between 5% and 70%. Because of the potential CPU performance hit and lack of evidence available, The Last Pickle used a little time to see what impacts we could record for ourselves.&lt;/p&gt;

&lt;h2 id=&quot;target&quot;&gt;Target&lt;/h2&gt;

&lt;p&gt;The hardware used for testing was a Lenovo X1 Carbon (gen 5) laptop. This machine runs an Intel Core i7-5600U CPU with 8Gb RAM. Running on it is Ubuntu 17.10 Artful. The unpatched kernel was version 4.13.0-21, and the patched kernel version 4.13.0-25. A physical machine was used to avoid the performance variances encountered in the different cloud environments.&lt;/p&gt;

&lt;p&gt;The Ubuntu kernel was patched according to instructions &lt;a href=&quot;https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown&quot;&gt;here&lt;/a&gt; and the &lt;a href=&quot;https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/pti/&quot;&gt;ppa:canonical-kernel-team/pti&lt;/a&gt; repository.&lt;/p&gt;

&lt;h2 id=&quot;stress&quot;&gt;Stress&lt;/h2&gt;

&lt;p&gt;A simple schema, but typical of many Cassandra usages, was used on top of Cassandra-3.11.1 via a 3 node ccm cluster. The stress execution ran with 32 threads. Running stress, three nodes, and a large number threads on one piece of hardware was intentional so to increase thread/context switching and kernel overhead.&lt;/p&gt;

&lt;p&gt;The stress run was limited to 5k requests per second so to avoid saturation, which occurred around 7k/s. The ratio of writes to reads was 1:1, with reads being split between whole partitions and single rows. The table used TWCS and was tuned down to 10 minute windows, so to ensure compactions ran during an otherwise short stress run. The stress ran for an hour against both the unpatched and patched kernels.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ccm stress user profile=stress.yaml ops\(insert=2,by_partition=1,by_row=1\) duration=1h -rate threads=32 throttle=5000/s -graph file=meltdown.html title=Meltdown revision=cassandra-3.11.1-unpatched
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;The following graphs show that over every percentile a 20%+ latency increase occurs. Sometimes the increase is up around 50%.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Meltdown Cassandra median&quot; src=&quot;http://feeds.feedburner.com/files/2018-01-10-meltdown-impact-on-latency/meltdown-cassandra-median.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Meltdown Cassandra 95th&quot; src=&quot;http://feeds.feedburner.com/files/2018-01-10-meltdown-impact-on-latency/meltdown-cassandra-95th.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Meltdown Cassandra 99th&quot; src=&quot;http://feeds.feedburner.com/files/2018-01-10-meltdown-impact-on-latency/meltdown-cassandra-99th.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Meltdown Cassandra stats&quot; src=&quot;http://feeds.feedburner.com/files/2018-01-10-meltdown-impact-on-latency/meltdown-cassandra-stats.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;The full stress results are available &lt;a href=&quot;http://feeds.feedburner.com/files/2018-01-10-meltdown-impact-on-latency/meltdown.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 10 Jan 2018 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Steve Loughran: Trying to Meltdown in Java -failing. Probably</title>
	<guid isPermaLink="true">http://steveloughran.blogspot.com/2018/01/trying-to-meltdown-in-java.html</guid>
	<link>http://steveloughran.blogspot.com/2018/01/trying-to-meltdown-in-java.html</link>
	<description>Meltdown has made for an &quot;interesting&quot; week in computing, as everyone is learning about/revising their knowledge of Speculative Execution. FWIW, I'd recommend the latest version of Patterson and Hennessey, &lt;a href=&quot;https://www.amazon.com/Computer-Architecture-Sixth-Quantitative-Approach/dp/0128119055/ref=dp_ob_title_bk&quot;&gt;Computer Architecture A Quantitative Approach&lt;/a&gt;. Not just for its details on speculative execution, but because it is the best book on microprocessor architecture and design that anyone has ever written, and lovely to read. I could read it repeatedly and not get bored.(And I see I need to get the 6th edition!)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.flickr.com/photos/steve_l/25663766638/in/dateposted/&quot; title=&quot;Stokes Croft drugs find&quot;&gt;&lt;img alt=&quot;Stokes Croft drugs find&quot; height=&quot;500&quot; src=&quot;https://farm5.staticflickr.com/4728/25663766638_26159f84dc.jpg&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This weekend, rather than read Patterson and Hennessey(*) I had a go to see if you could implement the meltdown attack in Java, hence in mapreduce, spark, or other non-native JAR&lt;br /&gt;&lt;br /&gt;My &lt;a href=&quot;https://github.com/steveloughran/speculate/blob/master/doc/java_and_meltdown.md&quot;&gt;initial attempt failed&lt;/a&gt; provided the part only speculates one branch in.&lt;br /&gt;&lt;br /&gt;More specifically &lt;i&gt;&quot;the range checking Java does on all array accesses blocks the standard exploit given steve's assumptions&quot;&lt;/i&gt;. You can speculatively execute the out of bounds query, but you can't read the second array at an offset which will trigger $L1 cache loading. &lt;br /&gt;&lt;br /&gt;If there's a way to do a reference to two separate memory locations which doesn't trigger branching range checks, then you stand a chance of pulling it off. I tried that using the ? : operator pair, something like&lt;br /&gt;&lt;br /&gt;&lt;span&gt;String ref = data ? refA : ref B;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;which I hoped might compile down to something like&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;mov ref, refB&lt;/span&gt;&lt;br /&gt;&lt;span&gt;cmp data, 0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;cmovnz ref, refB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This would do the move of the reference in the ongoing speculative branch, so, if &quot;ref&quot; was referenced in any way, trigger the resolution&lt;br /&gt;&lt;br /&gt;In my experiment (2009 macbook pro with OSX Yosemite + latest java 8 early access release), a branch was generated ... but there are some refs in the open JDK JIRA to using &lt;span&gt;CMOV&lt;/span&gt;, including the fact that hotspot compiler may be generating it if it things the probability of the move taking place is high enough.&lt;br /&gt;&lt;br /&gt;Accordingly, I can't say &lt;i&gt;&quot;the hotspot compiler doesn't generate exploitable codepaths&quot;&lt;/i&gt;, only &quot;&lt;i&gt;in this experiment, the hotspot compiler didn't appear to generate an exploitable codepath&quot;.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now the code is done, I might try on a Linux VM with Java 9 to see what is emitted&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you can get the exploit in, then you'd have access to other bits of the memory space of the same JVM, irrespective of what the OS does. That means one thread with a set of Kerberos tickets could perhaps grab the secrets of another. IT'd be pretty hard, given the way the JVM manages objects on the heap: I wouldn't know where to begin, but it would become hypothetically possible.&lt;/li&gt;&lt;li&gt;If you can get native code which you don't trust loaded into the JVM, then it can do whatever it wants. The original meltdown exploit is there. But native code running in JVM is going to have unrestricted access to the entire address space of the JVM -you don't need to use meltdown to grab secrets from the heap. All meltdown would do here is offer the possibility of grabbing kernel space data —which is what the OS patch does.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Anyway, I believe my first attempts failed &lt;i&gt;within the context of this experiment.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Code-wise, this kept me busy on Sunday afternoon. I managed to twist my ankle quite badly on a broken paving stone on the way to patisserie on Saturday, so sat around for an hour drinking coffee in Stokes Croft, then limped home, with all forms of exercise crossed off the TODO list for the w/e. Time for a bit of Java coding instead, as a break for what I'd been doing over the holiday (C coding &lt;a href=&quot;https://github.com/steveloughran/pingish&quot;&gt;a version of Ping&lt;/a&gt; which outputs CSV data and &lt;a href=&quot;https://github.com/steveloughran/zero-rename-committer&quot;&gt;a LaTeX paper on the S3A committers&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;It took as much time trying get hold of the OS/X disassembler for generated code as it did coding the exploit. Why so? Oracle have replaced all links in Java.sun.net which would point to the reference dynamic library with a 302 to the base Java page telling you how lucky you are that Java is embedded in cars. Or you see a ref to on-stack-replacement on a page in Project Kenai, under a URL which starts with &lt;a href=&quot;https://kenai.com/&quot;&gt;https://kenai.com/&lt;/a&gt;, point your browser there and end up on &lt;a href=&quot;http://www.oracle.com/splash/kenai.com/decommissioning/index.html&quot;&gt;http://www.oracle.com/splash/kenai.com/decommissioning/index.html&lt;/a&gt; and the message &quot;We're sorry the kenai.com site has closed.&quot;&lt;br /&gt;&lt;br /&gt;All the history and knowledge on JVM internals and how to work there is gone. You can find the blog posts from four years ago on the topic, but the links to the tools are dead.&lt;br /&gt;&lt;br /&gt;This is truly awful. It's the best argument I've seen for publishing this info as PDF files with DOI references, where you can move the artifact around, but citeseer will always find it. If the information doesn't last five years, then&lt;br /&gt;&lt;br /&gt;The irony is, it means that because Oracle have killed all those inbound links to Java tools, they're telling the kind of developer who wants to know these things to go away. That's strategically short-sighted. I can understand why you'd want to keep the cost of site maintenance down, but really, breaking every single link? It's a major loss to the Java platform —especially as I couldn't even find a replacement.&lt;br /&gt;&lt;br /&gt;I did manage to find a copy of the openjdk tarball people send you could D/L and run make on, but it was on a freebsd site, and even after a ./Configure &amp;amp;&amp;amp; make, it broke trying to create a bsd dynlib. Then I checked out the full openjdk source tree, branch -8, installed the various tools and tried to build there. Again, some error. I ended up finding a copy of the needed hsdis-amd64.dylib library &lt;a href=&quot;https://github.com/evolvedmicrobe/benchmarks/blob/master/hsdis-amd64.dylib&quot;&gt;on Github&lt;/a&gt;, but I had to then spend some time looking at &lt;a href=&quot;https://github.com/evolvedmicrobe&quot;&gt;evolvedmicrobe's w&lt;/a&gt;ork &amp;amp;c to see if I could trust this to &quot;probably&quot; not be malware itself. I've replicated the JAR in &lt;a href=&quot;https://github.com/steveloughran/speculate&quot;&gt;the speculate module&lt;/a&gt;, BTW.&lt;br /&gt;&lt;br /&gt;Anyway, once the disassembler was done and the other aspects of hotspot JIT compilation clear (if you can't see the method you wrote, run the loop a few thousand more times), I got to see some well annotated x86-64 assembler. Leaving me with a new problem: x86-64 assembler. It's a lot cleaner than classic 32 bit x86: having more registers does that, especially as it gives lots of scope for improving how function parameters and return values are managed.&lt;br /&gt;&lt;br /&gt;What next? This is only a spare time bit of work, and now I'm back from my EU-length xmas break, I'm doing other things. Maybe next weekend I'll do some more. At least now I know that exploiting meltdown from the JVM is not going be straightforward.&lt;br /&gt;&lt;br /&gt;Also I found it quite interesting playing with this, to see when the JVM kicks out native code, what it looks like. We code so far from the native hardware these days, its too &quot;low level&quot;. But the new speculation-side-channel attacks have shown that you'd better understand modern CPU architectures, including how your high-level code gets compiled down.&lt;br /&gt;&lt;br /&gt;I think I should submit a &lt;a href=&quot;https://berlinbuzzwords.de/18/news/call-submissions-now-open&quot;&gt;berlin buzzwords&lt;/a&gt; talk on this topic. &lt;br /&gt;&lt;br /&gt;(*) It is traditional to swap the names of the author on every use. If you are a purist you have to remember the last order you used.</description>
	<pubDate>Mon, 08 Jan 2018 12:16:09 +0000</pubDate>
</item>
<item>
	<title>Mukul Gandhi: XML validation. Some thoughts</title>
	<guid isPermaLink="true">http://mukulgandhi.blogspot.com/2018/01/xml-validation-some-thoughts.html</guid>
	<link>http://mukulgandhi.blogspot.com/2018/01/xml-validation-some-thoughts.html</link>
	<description>I think, there are various people using XML who like having XML data without any validation. I'm a strong proponent of having validation nearly always when using XML. Comparing the situation with RDBMS data, would make this clear I think (I don't mind proving things about a technology, taking cues from another technology which is hugely popular). Do we ever use data in RDBMS tables, without the schema (we don't)? The same should apply to XML, since validation is very closely defined alongside XML (DTD at least, and then XSD). If DTD or XSD is provided along with XML parsing, by the XML toolkit of choice, then why shouldn't we use validation whenever we're using XML -- as a consequence, we're working with a better design?&lt;br /&gt;&lt;br /&gt;Interestingly, validation doesn't always happen when using XML, because it hasn't been made mandatory in the XML language (like schemas with RDBMS). People using XML, sometimes like having XML data quickly transported between components or stored locally -- and they don't use validation in the process; which is fine since it meets the needs of an application.&lt;br /&gt;&lt;br /&gt;Sometimes, people using XML are influenced by how JSON is used. Presently, JSON doesn't has a schema language (but I came to know, that this may change in the future), and JSON is very popular &amp;amp; useful for certain use cases. Therefore, people try to use XML the same way -- i.e without validation.</description>
	<pubDate>Sun, 07 Jan 2018 10:37:23 +0000</pubDate>
</item>
<item>
	<title>Jim Jagielski: My 2017-2018 Introspections</title>
	<guid isPermaLink="true">http://jimjag.com/imo/index.php?/archives/273-My-2017-2018-Introspections.html</guid>
	<link>http://jimjag.com/imo/index.php?/archives/273-My-2017-2018-Introspections.html</link>
	<description>&lt;p&gt;As the old year falls away and the new year boots up, it is traditional for people to write &quot;&lt;em&gt;old year retrospectives&lt;/em&gt;&quot; as well as &quot;&lt;em&gt;new year predictions&lt;/em&gt;.&quot; Heck, I originally envisioned this entry as a duet of 2 separate blogs. But as much as I tried, it was just too difficult to keep them distinct and self-contained. There was simply too much overlap and as much as I expect &quot;new things&quot; in 2018, I think 2018 will mostly be a solidification of events and issues ramped up from 2017.&lt;/p&gt;

&lt;p&gt;So with all that in mind, I present my 2017-2018 Introspections... in no particular order:&lt;/p&gt;
 &lt;a class=&quot;block_level&quot; href=&quot;http://jimjag.com/imo/index.php?/archives/273-My-2017-2018-Introspections.html#extended&quot;&gt;Continue reading &quot;My 2017-2018 Introspections&quot;&lt;/a&gt;</description>
	<pubDate>Thu, 04 Jan 2018 15:18:14 +0000</pubDate>
</item>
<item>
	<title>Steve Loughran: Speculation</title>
	<guid isPermaLink="true">http://steveloughran.blogspot.com/2018/01/speculation.html</guid>
	<link>http://steveloughran.blogspot.com/2018/01/speculation.html</link>
	<description>&lt;br /&gt;Speculative execution has been intel's strategy for keeping the x86 architecture alive since the P6/Pentium Pro part shipped in '95.&lt;br /&gt;&lt;br /&gt;I remember coding explicitly for the P6 in a project in 1997; HPLabs was working with HP's IC Division to build their first CMOS-camera IC, which was an interesting problem. Suddenly your IC design needs to worry about light, aligning the optical colour filter with the sensors, making sure it all worked.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.flickr.com/photos/steve_l/39494089891/in/dateposted/&quot; title=&quot;Eyeris&quot;&gt;&lt;img alt=&quot;Eyeris&quot; height=&quot;500&quot; src=&quot;https://farm5.staticflickr.com/4690/39494089891_fd982b3172.jpg&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I ended up writing the code to capture the raw data at full frame rate, streaming to HDD, with an option to alternatively render it with/without the colour filtering (algorithms from another bit HPL team). Which means I get to nod knowingly when people complain about &quot;raw&quot; data. Yes, it's different for every device precisely because its raw.&lt;br /&gt;&lt;br /&gt;The data rates of the VGA-resolution sensor via the PCI boards used to pull this off meant that a both cores of a multiprocessor P6 box were needed. It was the first time I'd ever had a dual socket system, but both sockets were full with the 150MHz parts and with careful work we could get away with the &quot;full link rate&quot; data capture which was a core part of the qualification process. It's not enough to self test the chips any more see, you need to look at the pictures.&lt;br /&gt;&lt;br /&gt;Without too many crises, everything came together, which is why I have a framed but slightly skewed IC part to hand. And it's why I have memories of writing multithreaded windows C++ code with some of the core logic in x86 assembler. I also have memories of ripping out that ASM code as it turned out that it was broken, doing it as C pointer code and having it be just as fast. That's because: C code compiled to x86 by a good compiler, executed on a great CPU, is at least performant as hand-written x86 code by someone who isn't any good at assembler, and can be made to be correct more easily by the selfsame developer.&lt;br /&gt;&lt;br /&gt;150 MHz may be a number people laugh at today, but the CPU:RAM clock ratios weren't as bad as they are today: cache misses are less expensive in terms of pipeline stalls, and those parts were fast. Why? Speculative and out of order execution, amongst other things&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The P6 could provisionally guess which way a branch was going to go, speculatively executing that path until it became clear whether or not the guess was correct -and then commit/abort that speculative code path.&lt;/li&gt;&lt;li&gt;It uses a branch predictor to make that guess on the direction a branch was taken, based on the history of previous attempts, and a default option (FWIW, this is why I tend to place the most likely outcome first in my if() statements; tradition and superstition).&lt;/li&gt;&lt;li&gt;It could execute operations out of order. That is, it's predecessor, the P5, was the last time mainstream intel desktop/server parts executed x86 code in the order the compiler generated them, or the human wrote them.&lt;/li&gt;&lt;li&gt;register renaming meant that even though the parts had a limited set of registers, those OOO operations could reuse the same EAX, EBX, ECX registers without problems.&lt;/li&gt;&lt;li&gt;It had caching to deal with the speed mismatch between that 150 MHz CPU &amp;amp; RAM.&lt;/li&gt;&lt;li&gt;It supported dual CPU desktops, and I believe quad-CPU servers too. They'd be called &quot;dual core&quot; and &quot;quad core&quot; these days and looked down at.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Being the first multicore system I'd ever used, it was a learning experience. First was learning how too much windows NT4 code was still not stable in such a world. NTFS crashes with all all volumes corrupted? check. GDI rendering triggering kernel crash? check. And on a 4-core system I got hold of, everything crashed more often. Lesson: if you want a thread safe OS, give your kernel developers as many cores as you can.&lt;br /&gt;&lt;br /&gt;OOO forced me to learn about the x86 memory model itself: barrier opcodes, when things could get reordered and when they wouldn't. Summary: don't try and be clever about synchronization, as your assumptions are invalid.&lt;br /&gt;&lt;br /&gt;Speculation is always an unsatisfactory solution though. Every mis-speculation is lost cycles. And on a phone or laptop, that's wasted energy as much as time. And failed reads could fill up the cache with things you didn't want. I've tried to remember if I ever tried to use speculation to preload stuff if present, but doubt it. The CMOV command was a non-branching conditional assignment which was better, even if you had to hand code it.  The PIII/SSE added the &lt;a href=&quot;https://c9x.me/x86/html/file_module_x86_id_252.html&quot;&gt;PREFETCH&lt;/a&gt; opcode so you could a non-faulting hinted prefetch which you could stick into your non-branching code, but that was a niche opcode for people writing games/media codecs &amp;amp;c. And as Linus points out, &lt;a href=&quot;https://www.realworldtech.com/forum/?threadid=132668&amp;amp;curpostid=132772&quot;&gt;what was clever for one CPU model turns out to be a stupid idea a generation later&lt;/a&gt;. (arguably, that applies to Itanium/IA-64, though as it didn't speculate, it doesn't suffer from the Spectre &amp;amp; Meltdown attacks).&lt;br /&gt;&lt;br /&gt;Speculation, then: a wonderful use of transistors to compensate for how we developers write so many if() statements in our code. Wonderful, it kept the x86 line alive and so helped Intel deliver shareholder value and keep the RISC CPU out of the desktop, workstation and server businesses. Terrible because :&quot;transistors&quot; is another word for &quot;CPU die area&quot; with its yield equations and opportunity cost, and also for &quot;wasted energy on failed speculations&quot;. If we wrote code which had fewer branches in it, and that got compiled down to CMOV opcodes, life would be better. But we have so many layers of indirection these days; so many indirect references to resolve before those memory accesses. Things are probably getting worse now, not better. &lt;br /&gt;&lt;br /&gt;This week's speculation-side-channel attacks are fascinating then. These are very much architectural issues about speculation and branch prediction in general, rather than implementation details. Any CPU manufacturer whose parts do speculative execution has to be worried here, even if there's no evidence that your shipping parts aren't vulnerable to the current set of attacks. The whole point about speculation is to speed up operation based on the state of data held in registers or memory, so the time-to-execute is always going to be a side-channel providing information about the data used to make a branch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The fact that you can get at kernel memory, even from code running under a hypervisor, means, well, a lot. It means that VMs running in cloud infrastructure could get at the data of the host OS and/or those of other VMs running on the same host (those S3 SSE-C keys you passed up to your VM? 0wned, along with your current set of IAM role credentials). It potentially means that someone else's code could be playing games with branch prediction to determine what codepaths your code is taking. Which, in public cloud infrastructure is pretty serious, as the only way to stop people running their code alongside yours is currently to pay for the top of the line VMs and hope they get a dedicated part. I'm not even sure that dedicated cores in a multicore CPU are sufficient isolation, not for anything related to cache-side-channel attacks (they should be good for branch prediction, I think, if the attacker can't manipulate the branch predictor of the other cores).&lt;br /&gt;&lt;br /&gt;I can imagine the emails between cloud providers and CPU vendors being fairly strained, with the OEM/ODM teams on the CC: list. Even if the patches being rolled out mitigate things, if the slowdown on switching to kernelspace is as expensive as hinted, then that slows down applications, which means that the cost of running the same job in-cloud just got more expensive. Big cloud customers will be talking to their infrastructure suppliers on this, and then negotiating discounts for the extra CPU hours, which is a discount the cloud providers will expected to recover when they next buy servers. I feel as sorry for the cloud CPU account teams as I do for the x86 architecture group.&lt;br /&gt;&lt;br /&gt;Meanwhile, there's an interesting set of interview questions you could ask developers on this topic.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;What does the generated java assembly for the Ival++ on a java long look like?&lt;/li&gt;&lt;li&gt;What if the long is marked as volatile?&lt;/li&gt;&lt;li&gt;What does the generated x86 assembler for a Java Optional&amp;lt;AtomicLong&amp;gt; opt.map(AtomicLong::addAndGet(1)) look like?&lt;/li&gt;&lt;li&gt;What guarantees do you get about reordering?&lt;/li&gt;&lt;li&gt;How would you write code which attempted to defend against speculation timing attacks?&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I don't have the confidence to answer 1-4 myself, but I could at least go into detail about what I believed to be the case for 1-3; for #4 I should &lt;a href=&quot;http://gee.cs.oswego.edu/dl/jmm/cookbook.html&quot;&gt;do some revision&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As for #5, defending. I would love to see what others suggest. Conditional CMOV ops could help against branch-prediction attacks, by eliminating the branches. However, searching for references to CMOV and the JDK turns up some issues which imply that &lt;a href=&quot;https://bugs.openjdk.java.net/browse/JDK-8039104&quot;&gt;branch prediction can sometimes be faster&lt;/a&gt;...&quot;, including &quot;&lt;a href=&quot;https://bugs.openjdk.java.net/browse/JDK-8039104&quot;&gt;JDK-8039104. Don't use Math.min/max intrinsic on x86&lt;/a&gt;&quot; it may be that even CMOV gets speculated on; with the CPU prefetching what is moved and keeping the write uncommitted until the state of the condition is known.&lt;br /&gt;&lt;br /&gt;I suspect that the next edition of Hennessy and Patterson, &quot;Computer  Architecture, a Quantitative Approach&quot; will be covering this topic.I shall look forward to with even greater anticipation than I have had for all the previous, beloved, versions.&lt;br /&gt;&lt;br /&gt;As for all those people out there panicking about this, worrying if their nearly-new laptop is utterly exposed? You are running with Flash enabled on a laptop you use in cafe wifis without a VPN and with the same password, &quot;k1tten&quot;,  you use for gmail and paypal. You have other issues.&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 04 Jan 2018 13:43:24 +0000</pubDate>
</item>
<item>
	<title>Bertrand Delacretaz: Would you hire an open source developer?</title>
	<guid isPermaLink="true">https://grep.codeconsult.ch/2018/01/03/would-you-hire-an-open-source-developer/</guid>
	<link>https://grep.codeconsult.ch/2018/01/03/would-you-hire-an-open-source-developer/</link>
	<description>&lt;p&gt;&lt;em&gt;This blog post of mine was initially published by &lt;a href=&quot;https://www.computerworlduk.com/it-business/would-you-hire-an-open-source-developer-3570399/&quot;&gt;Computerworld UK&lt;/a&gt; in 2010&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As open source comes of age and becomes mainstream, more and more job postings include “open source skills” in their requirements.&lt;/p&gt;
&lt;p&gt;But do you really want to hire someone who spends their time exchanging flames with members of their own community in public forums? Someone who greets newcomers with “I have forwarded your question to /dev/null, thanks” and other RTFM answers?&lt;/p&gt;
&lt;p&gt;Luckily, open source communities are not just about being rude and unwelcoming to strangers. Most of them are not like that at all, and the skills you learn in an open source community can make a big difference in a corporate environment as well.&lt;/p&gt;
&lt;p&gt;One very important skill that you learn or improve in an open source community is to express yourself clearly in written form. The mailing lists or forums that we use are very limited compared to in-person communications, and extra care is required to get your message through. Being concise and complete, disagreeing respectfully, avoiding personal attacks and coping with what you perceive as personal attacks are all extremely useful skills on the job. Useful skills for your whole life actually.&lt;/p&gt;
&lt;p&gt;Once you master asynchronous written discussions as a way to build group consensus, doing the same in a face to face meeting can be much easier. But the basic skills are the same, so what you learn in an open source community definitely helps.&lt;/p&gt;
&lt;p&gt;Travel improves the mind, and although being active in open source can help one travel more, even without traveling you’ll be exposed to people from different cultures, different opinions, people who communicate in their second or third language, and that helps “improve your mind” by making you more tolerant and understanding of people who think differently. &lt;/p&gt;
&lt;p&gt;Not to mention people who perceive what you say in a different way than you expected – this happens all the time in our communities, due in part to the weak communications channels that we have to use. So you learn to be extra careful with jokes and sneaky comments, which might work when combined with the right body language, but can cause big misunderstandings on our mailing lists. Like when you travel to places with a different culture.&lt;/p&gt;
&lt;p&gt;Resilience to criticism and self-confidence is also something that you’ll often develop in an open source community. Even if not rude, criticism in public can hurt your ego at first. After a while you just get used to it, take care of fixing your actual mistakes if any, and start ignoring unwarranted negative comments. You learn to avoid feeding the troll, as we say. Once your work starts to produce useful results that are visible to the whole community, you don’t really care if someone thinks you’re not doing a good job.&lt;/p&gt;
&lt;p&gt;The technical benefits or working in open source communities are also extremely valuable. Being exposed to the work and way of thinking of many extremely bright developers, and quite a few geniuses, definitely helps you raise the bar on what you consider good software. I remember how my listening skills improved when I attended a full-time music school for one year in my youth: just listening to great teachers and fellow students play made me unconsciously raise the bar on what I consider good music.&lt;/p&gt;
&lt;p&gt;Open source communities, by exposing you to good and clever software, can have the same effect. And being exposed to people who are much better than you at certain things (which is bound to happen for anybody in an open source project) also helps make you more humble and realistic about your strengths and weaknesses. Like in soccer, the team is most efficient when all players are very clear about their own and other players’ strengths and weaknesses.&lt;/p&gt;
&lt;p&gt;You’ll know to whom you should pass or not pass the ball in a given situation.&lt;/p&gt;
&lt;p&gt;To summarise, actively participating in a balanced open source community will make you a better communicator, a more resilient and self-confident person, improve your technical skills and make you humbler and more realistic about your strengths and weaknesses.&lt;/p&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1662/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1662/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://pixel.wp.com/b.gif?host=grep.codeconsult.ch&amp;amp;blog=2844102&amp;amp;post=1662&amp;amp;subd=bdelacretaz&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 03 Jan 2018 12:27:42 +0000</pubDate>
</item>
<item>
	<title>Bertrand Delacretaz: Great software is like a great music teacher</title>
	<guid isPermaLink="true">https://grep.codeconsult.ch/2018/01/03/great-software-is-like-a-great-music-teacher/</guid>
	<link>https://grep.codeconsult.ch/2018/01/03/great-software-is-like-a-great-music-teacher/</link>
	<description>&lt;p&gt;&lt;em&gt;This blog post of mine was initially published by &lt;a href=&quot;https://www.computerworlduk.com/it-business/great-software-is-like-a-great-music-teacher-3570403/&quot;&gt;Computerworld UK&lt;/a&gt; in 2010&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I’m amazed at how many so-called “enterprise software systems” do not embrace the Web model in 2010, making them way much harder and much less fun to use than they should be.&lt;/p&gt;
&lt;p&gt;I have recently started making parallels between this and music teachers, and the analogy seems to work. Don’t ask where the parallel comes from…weird connections in my brain I guess.&lt;/p&gt;
&lt;p&gt;Say you want to learn to play the guitar. Someone recommended Joe, who’s teaching in his downtown studio.&lt;/p&gt;
&lt;p&gt;You get there almost on time. Traffic. You find Joe’s studio and here he is, dressed in a neat and simple casual outfit. Smiling at you.&lt;/p&gt;
&lt;p&gt;Joe: Hey welcome! So you wanna learn to play?&lt;/p&gt;
&lt;p&gt;You: Yes. I brought my guitar, got it from my uncle. It’s a bit worn out as you can see.&lt;/p&gt;
&lt;p&gt;Joe: I see…well, you might want to get a better one if you continue past the first few lessons, but for now that will do! Do you have something that you would like to play to get started?&lt;/p&gt;
&lt;p&gt;You: “Smoke on the water”, of course. The opening line.&lt;/p&gt;
&lt;p&gt;Joe: Let’s try that then, I’ll show you! Just plug your guitar in this amplifier, and let me setup some nice effects so you get a cool sound.&lt;/p&gt;
&lt;p&gt;Joe plays the first few bars a few times, shows you how that works and you give it a try. Ten minutes later you start sounding half-decent and you’re having loads of fun playing together with Joe.&lt;/p&gt;
&lt;p&gt;Joe: Okay, you’re doing good! I’ll show you my rough course plan so you know what’s up next. I’m quite flexible when it comes to the curriculum – as long as you’re having fun and progressing we’ll be fine.&lt;/p&gt;
&lt;p&gt;It’s easy to imagine the bad teacher version of this story:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unwelcoming&lt;/li&gt;
&lt;li&gt;Complains because you’re three minutes late.&lt;/li&gt;
&lt;li&gt;Wears a boring old-fashioned suit, and not willing to let you play that crappy old guitar.&lt;/li&gt;
&lt;li&gt;Boring you with tons of scales before you can start playing a song.&lt;/li&gt;
&lt;li&gt;Not giving you an overview of what comes next.&lt;/li&gt;
&lt;li&gt;Not ready to compromise on His Mighty Standard Teaching Program.&lt;/li&gt;
&lt;li&gt;Making you feel stupid about how bad a player you are.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bad software is like that bad teacher:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hard to get started with.&lt;/li&gt;
&lt;li&gt;Requires tons of specific client software of just the right version.&lt;/li&gt;
&lt;li&gt;Requires you to enter loads of useless information before doing anything useful or fun.&lt;/li&gt;
&lt;li&gt;Not willing to let you explore and do your own mistakes, and making sure you feel stupid when mistakes occur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Web model is the way to go, of course.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubiquitous access.&lt;/li&gt;
&lt;li&gt;Welcoming to various types of client software.&lt;/li&gt;
&lt;li&gt;Easy to point to by way of permanent URLs.&lt;/li&gt;
&lt;li&gt;Doing its best (fail whales anyone?) to keep you informed and avoid making you feel stupid when something goes wrong.&lt;/li&gt;
&lt;li&gt;Letting you explore its universe with simple web-based navigation, and rewarding your efforts with new discoveries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is 2010, and this is the Web. Don’t let any useless software stand between you and the information and services that you need.&lt;/p&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1659/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1659/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://pixel.wp.com/b.gif?host=grep.codeconsult.ch&amp;amp;blog=2844102&amp;amp;post=1659&amp;amp;subd=bdelacretaz&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 03 Jan 2018 12:25:01 +0000</pubDate>
</item>
<item>
	<title>Mukul Gandhi: Xerces bug XERCESJ-1687</title>
	<guid isPermaLink="true">http://mukulgandhi.blogspot.com/2017/12/xerces-bug-xercesj-1687.html</guid>
	<link>http://mukulgandhi.blogspot.com/2017/12/xerces-bug-xercesj-1687.html</link>
	<description>I wish to share my anguish, that following Xerces bug has caused me:&lt;br /&gt;&lt;br /&gt;https://issues.apache.org/jira/browse/XERCESJ-1687&lt;br /&gt;&lt;br /&gt;The bug reporter is very right in his arguments. But somehow I've to say, the Xerces team cannot fix this bug right now. I've also been thinking to &quot;resolve&quot; this bug with a fix reason &quot;later&quot; (but my conscience doesn't allow that either).&lt;br /&gt;&lt;br /&gt;I hope the situation will improve.</description>
	<pubDate>Sun, 31 Dec 2017 10:50:24 +0000</pubDate>
</item>
<item>
	<title>Sergey Beryozkin: Simple Reuse of org.reactivestreams in CXF</title>
	<guid isPermaLink="true">http://sberyozkin.blogspot.com/2017/12/simple-reuse-of-orgreactivestreams-in.html</guid>
	<link>http://sberyozkin.blogspot.com/2017/12/simple-reuse-of-orgreactivestreams-in.html</link>
	<description>I mentioned earlier that one could link RxJava2 Flowable with JAX-RS AsyncResponse with Subscriber which will do the best effort at streaming the data pieces converted to JSON array elements, &lt;a href=&quot;http://cxf.apache.org/docs/jax-rs-rxjava.html#JAX-RSRxJava-CombiningFlowablewithAsyncResponse&quot;&gt;see this example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That works but requires the application code refer to both JAX-RS AsyncResponse and CXF specific JsonStreamingAsyncSubscriber (RxJava2 specific at the earlier stage), as opposed to simply returning Flowable from the resource method.&lt;br /&gt;&lt;br /&gt;In meantime, John Ament added the initial &lt;a href=&quot;https://projectreactor.io/&quot;&gt;Reactor&lt;/a&gt; integration code, and as part of this work John also provided the org.reactivestreams compatible JsonStreamingAsyncSubscriber to be optionally used with the CXF Reactor invoker.&lt;br /&gt;&lt;br /&gt;As a result we've found the opportunity to do some refactoring and introduce the simple org.reactivestreams &lt;a href=&quot;https://github.com/apache/cxf/tree/master/rt/rs/extensions/reactivestreams/src/main/java/org/apache/cxf/jaxrs/reactivestreams/server&quot;&gt;utility module&lt;/a&gt; which is now reused between CXF RxJava2 &lt;a href=&quot;https://github.com/apache/cxf/blob/master/rt/rs/extensions/rx/src/main/java/org/apache/cxf/jaxrs/rx2/server/ReactiveIOInvoker.java#L48&quot;&gt;invoker&lt;/a&gt; and Reactor &lt;a href=&quot;https://github.com/apache/cxf/blob/master/rt/rs/extensions/reactor/src/main/java/org/apache/cxf/jaxrs/reactor/server/ReactorInvoker.java#L32&quot;&gt;invoker&lt;/a&gt;: the &lt;a href=&quot;https://github.com/apache/cxf/blob/master/rt/rs/extensions/reactivestreams/src/main/java/org/apache/cxf/jaxrs/reactivestreams/server/AbstractReactiveInvoker.java&quot;&gt;common invoker code&lt;/a&gt; both invokers delegate to will check if JSON is expected and if yes then will register &lt;a href=&quot;https://github.com/apache/cxf/blob/master/rt/rs/extensions/reactivestreams/src/main/java/org/apache/cxf/jaxrs/reactivestreams/server/JsonStreamingAsyncSubscriber.java&quot;&gt;JsonStreamingAsyncSubscriber&lt;/a&gt; as org.reactivestreams.Subscriber with org.reactivestreams.Publisher which can be either RxJava2 Flowable or Reactor Flux.&lt;br /&gt;&lt;br /&gt;The end result is that users can now write simpler code by returning &lt;a href=&quot;https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/reactive/RxJava2FlowableService.java#L81&quot;&gt;Flowable&lt;/a&gt; or &lt;a href=&quot;https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/reactor/FluxService.java#L51&quot;&gt;Flux&lt;/a&gt; from the service methods.&lt;br /&gt;&lt;br /&gt;It is an interesting but simple example of reusing the org.reactivestreams aware code between different org.reactivestreams implementations.</description>
	<pubDate>Sat, 30 Dec 2017 21:21:46 +0000</pubDate>
</item>
<item>
	<title>Matt Raible: SpringOne, The Rich Web Experience, and Being Home for the Holidays</title>
	<guid isPermaLink="true">http://raibledesigns.com/rd/entry/springone_the_rich_web_experience</guid>
	<link>http://raibledesigns.com/rd/entry/springone_the_rich_web_experience</link>
	<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's most impressive feature was spectacular too!
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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;/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;margin: 0 auto;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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;/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;margin: 0 auto;&quot;&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;margin: 0 auto;&quot;&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;margin: 0 auto;&quot;&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'&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;margin: 0 auto;&quot;&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'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;margin: 0 auto;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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;margin: 0 auto;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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'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'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's a great feeling to be home for the holidays. It was Trish's birthday weekend last weekend, so we watched her compete in a couple horse shows with Tucker. They sure do look good together, don't they?&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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'm done traveling for the year and I don't have any overnight travel scheduled until mid-February. My TripIt stats show I traveled quite a bit this year, and I'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; rel=&quot;lightbox[springone-rwx-2017]&quot; title=&quot;2017 TripIt Stats&quot;&gt;&lt;img alt=&quot;2017 TripIt Stats&quot; src=&quot;https://farm5.staticflickr.com/4588/39195736632_44d08a364e.jpg&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'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; rel=&quot;lightbox[springone-rwx-2017]&quot; title=&quot;2017 Conferences&quot;&gt;&lt;img alt=&quot;2017 Conferences&quot; src=&quot;https://farm5.staticflickr.com/4634/38516035974_9910bd1df0.jpg&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'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; 😊&lt;/p&gt;</description>
	<pubDate>Sat, 30 Dec 2017 17:55:27 +0000</pubDate>
</item>
<item>
	<title>Sam Ruby: Realtime Updates of Web Content Using WebSockets</title>
	<guid isPermaLink="true">http://www.intertwingly.net/blog/2017/12/29/Realtime-Updates-of-Web-Content-Using-WebSockets</guid>
	<link>http://www.intertwingly.net/blog/2017/12/29/Realtime-Updates-of-Web-Content-Using-WebSockets</link>
	<description>&lt;svg height=&quot;57&quot; style=&quot;float: right;&quot; viewBox=&quot;0 0 175 57&quot; width=&quot;175&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
  &lt;path d=&quot;M60,2l12,12l-12,12l-12-12zM88,2l12,12l-12,12l-12-12zM116,2l12,12l-12,12l-12-12zM18,16l12,12l-12,12l-12-12zM46,16l12,12l-12,12l-12-12zM74,16l12,12l-12,12l-12-12zM102,16l12,12l-12,12l-12-12zM130,16l12,12l-12,12l-12-12zM158,16l12,12l-12,12l-12-12zM60,30l12,12l-12,12l-12-12zM88,30l12,12l-12,12l-12-12zM116,30l12,12l-12,12l-12-12z&quot; fill=&quot;#bdbdc5&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M7,27h26l13,13l14-14l14,14l28-28l14,14l14-14l15,15h26v3h-27l-14-14l-14,14l-14-14l-28,28l-14-14l-14,14l-14-14h-25z&quot; fill=&quot;#ffd652&quot; stroke=&quot;#000&quot; stroke-width=&quot;0.5&quot;&gt;&lt;/path&gt;
  &lt;path d=&quot;M3,26h5v5h-5zM168,26h5v5h-5z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;h3 id=&quot;preface&quot;&gt;Preface&lt;/h3&gt;

&lt;p&gt;You've seen web sites with stock prices or retweet counts that update in real time.  However, such sites are more the exception rather than the norm.  &lt;a href=&quot;https://tools.ietf.org/html/rfc6455&quot;&gt;WebSockets&lt;/a&gt; make it easy, and are &lt;a href=&quot;https://caniuse.com/#feat=websockets&quot;&gt;widely supported&lt;/a&gt;, but not used as much as they could be.&lt;/p&gt;

&lt;p&gt;Examples provided for WebSockets typically don't focus on the &quot;pubsub&quot; use case; instead they tend to focus on echo servers and the occasional chat server.  These are OK as far as they go.&lt;/p&gt;

&lt;p&gt;This post provides three mini-demos that implement the same design pattern in JavaScript on both the client and server.  &lt;/p&gt;

&lt;h3 id=&quot;quick_start&quot;&gt;Quick Start&lt;/h3&gt;

&lt;p&gt;For the impatient who want to see running code, &lt;/p&gt;

&lt;div&gt;&lt;pre&gt;git clone https://github.com/rubys/websocket-demo.git
cd websocket-demos
npm install
node server.js&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After running this, visit &lt;a href=&quot;http://localhost:8080/&quot;&gt;&lt;code&gt;http://localhost:8080/&lt;/code&gt;&lt;/a&gt; in a browser, and you should see something like this:&lt;/p&gt;



&lt;div class=&quot;screenshot&quot;&gt;
  &lt;textarea disabled=&quot;disabled&quot;&gt;# header
  
  * one
  * two
  * three&lt;/textarea&gt;
  &lt;div&gt;
    &lt;h3&gt;header&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;one&lt;/li&gt;
      &lt;li&gt;two&lt;/li&gt;
      &lt;li&gt;three&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&quot;server_support&quot;&gt;Server support&lt;/h3&gt;

&lt;p&gt;The primary responsibility of the server is to maintain a list of active websocket connections.  The code below will maintain three such sets, one for each of the demos provided.&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;span&gt;// attach to web server&lt;/span&gt;
&lt;span&gt;var&lt;/span&gt; wsServer = &lt;span&gt;new&lt;/span&gt; websocket.server({&lt;span&gt;httpServer&lt;/span&gt;: httpServer});

&lt;span&gt;// three sets of connections&lt;/span&gt;
&lt;span&gt;var&lt;/span&gt; connections = {
  &lt;span&gt;text&lt;/span&gt;: &lt;span&gt;new&lt;/span&gt; Set(),
  &lt;span&gt;html&lt;/span&gt;: &lt;span&gt;new&lt;/span&gt; Set(),
  &lt;span&gt;json&lt;/span&gt;: &lt;span&gt;new&lt;/span&gt; Set()
};

&lt;span&gt;// when a request comes in for one of these streams, add the websocket to the&lt;/span&gt;
&lt;span&gt;// appropriate set, and upon receipt of close events, remove the websocket&lt;/span&gt;
&lt;span&gt;// from that set.&lt;/span&gt;
wsServer.on(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (request) =&amp;gt; {
  &lt;span&gt;var&lt;/span&gt; url = request.httpRequest.url.slice(&lt;span&gt;1&lt;/span&gt;);

  &lt;span&gt;if&lt;/span&gt; (!connections[url]) {
    &lt;span&gt;// reject request if not for one of the pre-identified paths&lt;/span&gt;
    request.reject();
    console.log((&lt;span&gt;new&lt;/span&gt; Date()) + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt; + url + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; connection rejected.&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
    &lt;span&gt;return&lt;/span&gt;;
  };

  &lt;span&gt;// accept request and add to the connection set based on the request url&lt;/span&gt;
  &lt;span&gt;var&lt;/span&gt; connection = request.accept(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;ws-demo&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, request.origin);
  console.log((&lt;span&gt;new&lt;/span&gt; Date()) + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt; + url + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; connection accepted.&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
  connections[url].add(connection);

  &lt;span&gt;// whenever the connection closes, remove connection from the relevant set&lt;/span&gt;
  connection.on(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (reasonCode, description) =&amp;gt; {
    console.log((&lt;span&gt;new&lt;/span&gt; Date()) + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt; + url + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; connection disconnected.&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
    connections[url].&lt;span&gt;delete&lt;/span&gt;(connection)
  })
});&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code is fairly straightforward.  Three sets are defined; and when a request comes in it is either accepted or rejected based on the path part of the URL of the request.  If accepted, the connection is added to the appropriate set.  When a connection is closed, the connection is removed from the set.&lt;/p&gt;

&lt;p&gt;EZPZ!&lt;/p&gt;

&lt;h3 id=&quot;client_support&quot;&gt;Client Support&lt;/h3&gt;

&lt;p&gt;The client's responsibitlity is to open the socket, and to keep it open.&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;subscribe&lt;/span&gt;(path, callback) {    
  &lt;span&gt;var&lt;/span&gt; ws = &lt;span&gt;null&lt;/span&gt;;
  &lt;span&gt;var&lt;/span&gt; base = window.top.location.href

  &lt;span&gt;function&lt;/span&gt; &lt;span&gt;openchannel&lt;/span&gt;() {
    &lt;span&gt;if&lt;/span&gt; (ws) &lt;span&gt;return&lt;/span&gt;;
    &lt;span&gt;var&lt;/span&gt; url = &lt;span&gt;new&lt;/span&gt; URL(path, base.replace(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;ws&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;));
    ws = &lt;span&gt;new&lt;/span&gt; WebSocket(url.href, &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;ws-demo&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);

    ws.onopen = (event) =&amp;gt; {
      console.log(path + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; web socket opened!&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
    };

    ws.onmessage = (event) =&amp;gt; {
      callback(event.data);
    };

    ws.onerror = (event) =&amp;gt; {
      console.log(path + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; web socket error:&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
      console.log(event);
      ws = &lt;span&gt;null&lt;/span&gt;;
    };

    ws.onclose = (event) =&amp;gt; {
      console.log(path + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; web socket closed&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
      ws = &lt;span&gt;null&lt;/span&gt;;
    }
  }

  &lt;span&gt;// open (and keep open) the channel&lt;/span&gt;
  openchannel();
  setInterval(() =&amp;gt; openchannel(), &lt;span&gt;2000&lt;/span&gt;);
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A subscribe method is defined that accepts a path and a callback.  The path is used to construct the URL to open.  The callback is called whenever a message is received.  Errors and closures cause the &lt;code&gt;ws&lt;/code&gt; variable to be set to &lt;code&gt;null&lt;/code&gt;.  Every two seconds, the &lt;code&gt;ws&lt;/code&gt; variable is checked, and an attempt is made to reestablish the socket connection when this value is &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;textarea&quot;&gt;First example - textarea&lt;/h3&gt;

&lt;p&gt;Now it is time to put the sets of server &lt;code&gt;connections&lt;/code&gt;, and client &lt;code&gt;subscribe&lt;/code&gt; function to use.&lt;/p&gt;

&lt;p&gt;Starting with the client:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;span&gt;var&lt;/span&gt; textarea = document.querySelector(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;textarea&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);

&lt;span&gt;// initially populate the textarea with the contents of data.txt from the&lt;/span&gt;
&lt;span&gt;// server&lt;/span&gt;
fetch(&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;).then((response) =&amp;gt; {
  response.text().then((body) =&amp;gt; { textarea.value = body })
});

&lt;span&gt;// whenever the textarea changes, send the new value to the server&lt;/span&gt;
textarea.addEventListener(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (event) =&amp;gt; {
  fetch(&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;, {&lt;span&gt;method&lt;/span&gt;: &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;body&lt;/span&gt;: textarea.value});
});

&lt;span&gt;// whenever data is received, update textarea with the value&lt;/span&gt;
subscribe(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (data) =&amp;gt; { textarea.value = data });&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The value of the textarea is fetched from the server on page load.  Changes made to the textarea are posted to the server as they occur.  Updates received from the server are loaded into the textarea.  Nothing to it!&lt;/p&gt;

&lt;p&gt;Now, onto the server:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;span&gt;// Return the current contents of data.txt&lt;/span&gt;
app.get(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (request, response) =&amp;gt; {
 response.sendFile(dirname + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
});

&lt;span&gt;// Update contents of data.txt&lt;/span&gt;
app.post(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (request, response) =&amp;gt; {
 &lt;span&gt;var&lt;/span&gt; fd = fs.openSync(dirname + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
 request.on(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (data) =&amp;gt; fs.writeSync(fd, data));
 request.on(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, () =&amp;gt; {
   fs.closeSync(fd);
   response.sendFile(dirname + &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;);
 })
})

&lt;span&gt;// watch for file system changes.  when data.txt changes, send new raw&lt;/span&gt;
&lt;span&gt;// contents to all /text connections.&lt;/span&gt;
fs.watch(dirname, {}, (event, filename) =&amp;gt; {
  &lt;span&gt;if&lt;/span&gt; (filename == &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;) {
    fs.readFile(filename, &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;utf8&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (err, data) =&amp;gt; {
      &lt;span&gt;if&lt;/span&gt; (data &amp;amp;&amp;amp; !err) {
        &lt;span&gt;for&lt;/span&gt; (connection of connections.text) {
          connection.sendUTF(data)
        };
      }
    })
  }
})&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Requests to get &lt;code&gt;data.txt&lt;/code&gt; cause the contents of the file to be returned.  Post requests cause the contents to be updated.  It is the last block of code that we are most interested in here: the file system is watched for changes, and whenever &lt;code&gt;data.txt&lt;/code&gt; is updated, it is read and the results are sent to each &lt;code&gt;text&lt;/code&gt; connection.  Pretty straightforward!&lt;/p&gt;

&lt;p&gt;If you visit &lt;a href=&quot;http://localhost:8080/textarea&quot;&gt;&lt;code&gt;http://localhost:8080/textarea&lt;/code&gt;&lt;/a&gt; in multiple browser windows, you will see a textarea in each.  Updating any one window will update all.  What you have is the beginning of a collaborative editing application, though there would really need to be more logic put in place to properly serialize concurrent updates.&lt;/p&gt;

&lt;h3 id=&quot;markdown&quot;&gt;Second example - markdown&lt;/h3&gt;

&lt;p&gt;The first example has the server sending plain text content.  This next example deals with HTML.  The &lt;a href=&quot;https://www.npmjs.com/package/marked&quot;&gt;marked&lt;/a&gt; package is used to convert text to HTML on the server.&lt;/p&gt;

&lt;p&gt;This client is simpler in that it doesn't have to deal with sending updates to the server:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;span&gt;// initially populate the textarea with the converted markdown obtained&lt;/span&gt;
&lt;span&gt;// from the server&lt;/span&gt;
fetch(&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/data.html&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;).then((response) =&amp;gt; {
  response.text().then((body) =&amp;gt; { document.body.innerHTML = body })
});

&lt;span&gt;// whenever data is received, update body with the data&lt;/span&gt;
subscribe(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (data) =&amp;gt; { document.body.innerHTML = data });&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The primary difference between this example and the previous one is that the content is placed into &lt;code&gt;document.body.innerHTML&lt;/code&gt; instead of &lt;code&gt;textarea.value&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Like the client, the server portion of this demo consists of two blocks of code:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;app.get(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/data.html&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (request, response) =&amp;gt; {
  fs.readFile(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;utf8&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (error, data) =&amp;gt; {
    &lt;span&gt;if&lt;/span&gt; (error) {
      response.status(&lt;span&gt;404&lt;/span&gt;).end();
    } &lt;span&gt;else&lt;/span&gt; {
      marked(data, (error, content) =&amp;gt; {
        &lt;span&gt;if&lt;/span&gt; (error) {
          console.log(error);
          response.status(&lt;span&gt;500&lt;/span&gt;).send(error);
        } &lt;span&gt;else&lt;/span&gt; {
          response.send(content);
        }
      })
    }
  })
});

&lt;span&gt;// watch for file system changes.  when data.txt changes, send converted&lt;/span&gt;
&lt;span&gt;// markdown output to all /html connections.&lt;/span&gt;
fs.watch(dirname, {}, (event, filename) =&amp;gt; {
  &lt;span&gt;if&lt;/span&gt; (filename == &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;data.txt&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;) {
    fs.readFile(filename, &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;utf8&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (err, data) =&amp;gt; {
      &lt;span&gt;if&lt;/span&gt; (data &amp;amp;&amp;amp; !err) {
        marked(data, (err, content) =&amp;gt; {
          &lt;span&gt;if&lt;/span&gt; (!err) {
            &lt;span&gt;for&lt;/span&gt; (connection of connections.html) {
              connection.sendUTF(content);
            }
          }
        }) 
      }
    })
  }
})&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The salient difference between this example and the previous example is call to the &lt;code&gt;marked&lt;/code&gt; function to perform the conversion.&lt;/p&gt;

&lt;p&gt;If you visit &lt;a href=&quot;http://localhost:8080/markdown&quot;&gt;&lt;code&gt;http://localhost:8080/markdown&lt;/code&gt;&lt;/a&gt;, you will see the text converted to markdown.  You can also visit &lt;a href=&quot;http://localhost:8080/&quot;&gt;&lt;code&gt;http://localhost:8080/&lt;/code&gt;&lt;/a&gt; to see both of these demos side by side, in separate frames.  Updates make in the window on the left will be reflected on the right.&lt;/p&gt;

&lt;p&gt;No changes were required to the first demo to make this happen as both demos watch for file system changes.  In fact, you can edit &lt;code&gt;data.txt&lt;/code&gt; on the server with your favorite text area and whenever you save your changes all clients will be updated.&lt;/p&gt;

&lt;h3 id=&quot;json&quot;&gt;Final example - JSON&lt;/h3&gt;

&lt;p&gt;In this final example, the server will be sending down a recursive directory listing, complete with file names, sizes, and last modified dates.  On the client, &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt; will be used to present the data.  We start with a template:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&amp;lt;tbody&amp;gt;
  &amp;lt;tr v-for=&quot;file in filelist&quot;&amp;gt;
    &amp;lt;td&amp;gt;{{ file.name }}&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;{{ file.size }}&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;{{ file.mtime }}&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And add a bit of code:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;span&gt;var&lt;/span&gt; app = &lt;span&gt;new&lt;/span&gt; Vue({&lt;span&gt;el&lt;/span&gt;: &lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;tbody&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;data&lt;/span&gt;: {&lt;span&gt;filelist&lt;/span&gt;: []}});

fetch(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;filelist.json&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;).then((response) =&amp;gt; {
  response.json().then((json) =&amp;gt; { app.filelist = json });
});

subscribe(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (data) =&amp;gt; { app.filelist = JSON.parse(data) });&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The first line associates some data (initially an empty array) with an HTML element (in this case &lt;code&gt;tbody&lt;/code&gt;).  The remaining code should look very familiar by now.  Because of the way Vue.js works, all that is required to update the display is to update the data.&lt;/p&gt;

&lt;p&gt;The server side should also seem pretty familiar:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;app.get(&lt;span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;/dir.json&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;/span&gt;, (request, response) =&amp;gt; {
  response.json(stats(dirname));
});

fs.watch(dirname, {&lt;span&gt;recursive&lt;/span&gt;: &lt;span&gt;true&lt;/span&gt;}, (event, filename) =&amp;gt; {
  &lt;span&gt;var&lt;/span&gt; data = JSON.stringify(stats(dirname));
  &lt;span&gt;for&lt;/span&gt; (connection of connections.json) {
    connection.sendUTF(data)
  }
})&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Not shown is the code that extracts the information from the filesystem, the rest is the same basic pattern that has been used for each of these demos.&lt;/p&gt;

&lt;p&gt;If you visit &lt;a href=&quot;http://localhost:8080/filelist&quot;&gt;&lt;code&gt;http://localhost:8080/filelist&lt;/code&gt;&lt;/a&gt;, you will see a table showing each of the files on the server.  This list will be updated whenever you create, delete, or update any file.  The server will push a new (and complete) set of data, and Vue.js will determine what needs to be changed in the browser window.  All this generally takes place in a fraction of a second.&lt;/p&gt;

&lt;p&gt;Vue.js is only one such framework that can be used in this way.  &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://www.emberjs.com/&quot;&gt;Ember.js&lt;/a&gt;, and &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt; are additional frameworks that are worth exploring.&lt;/p&gt;

&lt;h3 id=&quot;recap&quot;&gt;Recap&lt;/h3&gt;

&lt;p&gt;By focusing on file system modified events, these demos have tried to demonstrate server initiated updates.&lt;/p&gt;

&lt;p&gt;With comparatively little code, web sites can be prepared to receive and apply unsolicited updates from the server.  The granularity of the updates can be as little as a single string, can be a HTML fragment, or can be arbitrary data encoded in JSON.&lt;/p&gt;

&lt;p&gt;Reserving web sockets for server initiated broadcast operations can keep your code small and understandable. Traditional HTTP GET and POST requests can be used for all client initiated retrieval and update operations.&lt;/p&gt;

&lt;p&gt;This makes the division of labor between the client and server straightforward: the server is responsible for providing state -- both on demand and as the state changes.  The client is responsible for updating the view to match the state.&lt;/p&gt;</description>
	<pubDate>Fri, 29 Dec 2017 17:18:24 +0000</pubDate>
</item>
<item>
	<title>Sergey Beryozkin: [OT] Work Next Year the way Arsenal and Liverpool played their football</title>
	<guid isPermaLink="true">http://sberyozkin.blogspot.com/2017/12/ot-work-next-year-way-arsenal-and.html</guid>
	<link>http://sberyozkin.blogspot.com/2017/12/ot-work-next-year-way-arsenal-and.html</link>
	<description>I've been lacking the ideas on how to write the regular and last off-topic post of the year, thinking which piece of music I should link to.&lt;br /&gt;&lt;br /&gt;And then the inspiration came from the completely unexpected source.&lt;br /&gt;&lt;br /&gt;Those of you who follow Arsenal FC in the English Premier League know that Arsenal can either draw against Liverpool but in such a way that fans will remember it for years (yes, that Liverpool 4 to Arsenal 4 draw), or, most likely, lose badly to this Merseyside team, something like 1:4 or similar.&lt;br /&gt;&lt;br /&gt;So less than a week earlier, Arsenal was playing with Liverpool in London, losing 0:2. Oh well, most Arsenal fans thought, one of those days which can only be described in &lt;a href=&quot;https://en.wikipedia.org/wiki/Fever_Pitch&quot;&gt;Fever Pitch&lt;/a&gt;. Then, in the 2nd half, after the few minutes, while the fans were having &lt;a href=&quot;http://www.bbc.com/sport/live/football/40956002?ns_mchannel=social&amp;amp;ns_source=twitter&amp;amp;ns_campaign=bbc_live&amp;amp;ns_linkname=5a3d74b5e4b0f9d014c49adb%26Get%20Involved%26&amp;amp;ns_fee=0#post_5a3d74b5e4b0f9d014c49adb&quot;&gt;mince pies and tea&lt;/a&gt;,  Arsenal were 3:2 up, with Liverpool managing to equalize. The game saw many mistakes and brilliant moves and fans just had the day of the year watching the game. I liked this &lt;a href=&quot;http://www.bbc.com/sport/live/football/40956002?ns_mchannel=social&amp;amp;ns_source=twitter&amp;amp;ns_campaign=bbc_live&amp;amp;ns_linkname=5a3d7b49e4b06f06e8399248%26FULL-TIME%26&amp;amp;ns_fee=0#post_5a3d7b49e4b06f06e8399248&quot;&gt;summary&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;How would I translate that to a New Year wish for you, the software engineers ? Here it is:&lt;br /&gt;&lt;br /&gt;Enjoy your work next year, try to do something extraordinary, something new, and don't be afraid to make mistakes :-)&lt;br /&gt;&lt;br /&gt;Happy New Year !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 27 Dec 2017 17:26:55 +0000</pubDate>
</item>
<item>
	<title>Sergey Beryozkin: Get OpenAPI v3 JSON with CXF Now !</title>
	<guid isPermaLink="true">http://sberyozkin.blogspot.com/2017/12/get-openapi-v3-json-with-cxf-now.html</guid>
	<link>http://sberyozkin.blogspot.com/2017/12/get-openapi-v3-json-with-cxf-now.html</link>
	<description>The Apache CXF has done some initial work to have &lt;a href=&quot;https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md&quot;&gt;OpenAPI v3&lt;/a&gt; JSON reported from the JAX-RS endpoints. &lt;br /&gt;&lt;br /&gt;Andriy Redko has started with the OpenApiFeature implementation which depends on the latest OpenApi v3 aware swagger-core and swagger-jaxrs libraries and demoed it &lt;a href=&quot;https://github.com/apache/cxf/tree/master/distribution/src/main/release/samples/jax_rs/description_openapi_v3&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In meantime I did a &lt;a href=&quot;http://cxf.apache.org/docs/swagger2feature.html#Swagger2Feature-ConvertingtoOpenAPIJSON&quot;&gt;Swagger2 to OpenApi v3 JSON conversion filter&lt;/a&gt; which reacts to openapi.json queries by converting Swagger2 swagger.json produced by Swagger2Feature to openapi.json with the idea of making it easier for the existing upstream code (which has already integrated Swagger2Feature) to start experimenting with OpenAPI v3, before doing the switch to the new feature (and dependencies).   &lt;br /&gt;&lt;br /&gt;This effort is still a work in progress but the results in both cases are promising. The new feature and the conversion filter will require some more improvements but you can start experimenting with them right now. And if you are someone like me then you will be positively surprised that SwaggerUI  3.6.1 and newer can handle both Swagger2 and OpenAPI v3 JSON :-).&lt;br /&gt;&lt;br /&gt;Enjoy !</description>
	<pubDate>Wed, 27 Dec 2017 16:56:29 +0000</pubDate>
</item>
<item>
	<title>Nick Kew: Clearing the air</title>
	<guid isPermaLink="true">https://bahumbug.wordpress.com/2017/12/25/clearing-the-air-2/</guid>
	<link>https://bahumbug.wordpress.com/2017/12/25/clearing-the-air-2/</link>
	<description>&lt;p&gt;It’s been a long time since I’ve blogged any good rant about matters in the news here.  It’s not that I don’t sometimes have things I could say, nor even that my words would be superfluous because the Chattering Classes in the mainstream media are already saying them.  Rather it’s a lack of round tuits, and perhaps because I might sometimes post a rant elsewhere instead (for example, &lt;a href=&quot;https://www.theregister.co.uk/&quot;&gt;El Reg&lt;/a&gt; on predominantly techie matters).&lt;/p&gt;
&lt;p&gt;So how better to try and restart than by blogging a positive story.  One of those rare occasions where out government appears possibly to be doing the Right Thing about one of today’s most serious problems.  I can’t find it on the BBC website (where I looked after hearing it on the radio), but Google finds it &lt;a href=&quot;https://www.ft.com/content/f7f18806-e6c1-11e7-97e2-916d4fbac0da&quot;&gt;at the FT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The story is rather different between the BBC and the FT, but the gist of it is that Michael Gove and/or the Department of the Environment (of which he is minister in charge) is at last considering proposals to clean up our air, by restricting or banning domestic wood and coal fires.  These fires have become a huge problem in recent years.  I believe they have standards about keeping their own house unpolluted, but for anyone who happens to live downwind[1] of such fires, it can fill the house with smoke for extended periods: many hours a day, many months a year.  We’re talking levels of smoke comparable to not one or two but a great many smokers in the house, and this is seriously nasty smoke that hasn’t gone through the considerable cleanup that’s been forced onto the tobacco industry in recent decades.&lt;/p&gt;
&lt;p&gt;In summary, for people affected by this, it’s an order of magnitude worse than regular exposure to passive smoking, or to those diesel emissions that have created such a fuss in recent times.&lt;/p&gt;
&lt;p&gt;Governments have occasionally been known to do the right thing on pollution.  In the 1950s we had clean air legislation to clear up a reportedly-serious smog problem.  In my lifetime we’ve rid ourselves of most of the blight of tobacco smoke (including legislation that has been very successful despite &lt;a href=&quot;https://bahumbug.wordpress.com/2007/06/30/clean-air/&quot;&gt;my reservations at the time&lt;/a&gt;).  Let’s hope we can see the spirit of that 1950s legislation revived and give us back our air!&lt;/p&gt;
&lt;p&gt;[1] The prevailing wind here is approximately west-south-west, and a very common winter weather pattern includes mild damp weather and very light westerly winds.  So the greatest killer is to be between east and northeast of a woodburner.&lt;/p&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bahumbug.wordpress.com/4899/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bahumbug.wordpress.com/4899/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://pixel.wp.com/b.gif?host=bahumbug.wordpress.com&amp;amp;blog=471959&amp;amp;post=4899&amp;amp;subd=bahumbug&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 25 Dec 2017 00:22:43 +0000</pubDate>
</item>
<item>
	<title>Piergiorgio Lucidi: My involvement at Alfresco DevCon 2018</title>
	<guid isPermaLink="true">https://www.open4dev.com/journal/2017/12/20/my-involvement-at-alfresco-devcon-2018</guid>
	<link>https://www.open4dev.com/journal/2017/12/20/my-involvement-at-alfresco-devcon-2018</link>
	<description>&lt;p&gt;Finally the next Alfresco DevCon is arriving in January and I'm very proud to have the opportunity to contribute on this event as a trainer and a speaker. I'm pretty sure that also passing some good time with other Alfresco friends in Lisbon will be nice :)&lt;/p&gt;&lt;h1&gt;Training sessions - Tuesday 16th&lt;/h1&gt;&lt;p&gt;If you don't know nothing about Alfresco but you want to put your fingers on it, you can join the training sessions that will be held during the first day of the conference.&lt;/p&gt;&lt;p&gt;This can be a good way for any newbies to become familiar with all the approaches and best practices needed for developing your content and business platform on top of Alfresco.&lt;/p&gt;&lt;p&gt;We will cover both the Content Services and the Process Services platform so this is a fantastic occasion for learning the basics from people that works on it from a decade.&lt;/p&gt;&lt;p&gt;The final session will be held by Ole Hejlskov (Developer Evangelist at Alfresco) and he will share with us how to create your own application using ADF. Practically this is the most intensive and the most comprehensive training day that Alfresco has ever made!!!&lt;/p&gt;&lt;p&gt;I'll work in partnership with the &lt;a href=&quot;https://ecmcoreaveri.com/instructors.html&quot; target=&quot;_blank&quot;&gt;ECMCoreAveri Team&lt;/a&gt; together with my old friends Shoeb Sarguroh and Oliver Laabs, we are Certified Alfresco Instructors helping the Alfresco Training Team for delivering the introduction intensive course. We will support all the attendees on installing, configuring and developing labs during all the day.&lt;/p&gt;

  

  	
      
      
        
          
            &lt;a href=&quot;https://ecmcoreaveri.com/instructors.html&quot; target=&quot;_blank&quot;&gt;
          
            
              &lt;img alt=&quot;ecmcore-averi-logo.png&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a3d238df9619a4e3148c182/1513956349667/ecmcore-averi-logo.png?format=1000w&quot; /&gt;
            
          
            &lt;/a&gt;
          

          

        
      
      
    

  


&lt;p&gt;We hope that this intensive training day will be useful for all of you that want to start a project using Alfresco.&lt;/p&gt;&lt;h1&gt;Speaking about content migration - Thursday 18th at 15:45-16:15&lt;/h1&gt;&lt;p&gt;After some years spent on contributing on Apache ManifoldCF inside the PMC we have started a new, and potentially overwhelming, swerve on the project: content migration.&lt;/p&gt;&lt;p&gt;ManifoldCF is a repository crawler that had as a primary goal manage the indexing process using scheduled jobs. After a discussion in the community, we realized that we could use it also for content migration and not only for searching purpose.&lt;/p&gt;&lt;p&gt;Then we started to implement some Output Connectors dedicated to this new scenario. The first connector that I have implemented is the CMIS Output Connector that allow you to migrate contents from any ManifoldCF supported repos to any CMIS-compliant repo. Notice that the core framework will manage for you also the incremental injection considering also the removed contents.&lt;/p&gt;&lt;p&gt;I'm very happy to have started this new adventure and during this journey, I met one of the persons that allowed me to understand better the Alfresco platform and that gave me a lot in terms of knowledge and experience: Luis Cabaceira (Solutions Architect at Alfresco).&lt;/p&gt;&lt;p&gt;I learnt a lot reading his white papers about sizing and performance tuning and now working strictly with him it is a huge and priceless thing for me, really, thank you man ;)&lt;/p&gt;&lt;p&gt;Luis started to contribute on ManifoldCF implementing an Alfresco BFSI Output Connector for making easier any migration to Alfresco. He is also became a Committer inside the project and I'm sure that he will bring a lot of value and contributions taking care of some of the current Alfresco connectors and giving a huge help on the content migration area.&lt;/p&gt;&lt;p&gt;We hope that our session will bring value and ideas to all of you and &lt;strong&gt;we really hope to receive any kind of feedback on our current work &lt;/strong&gt;and if you want to contribute, feel free to contact me and please &lt;a href=&quot;http://manifoldcf.apache.org/en_US/mail.html&quot; target=&quot;_blank&quot;&gt;subscribe the ManifoldCF mailing lists&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This will help us for making a huge release of ManifoldCF that will be tagged as Content Migration Enabler scheduled on the next 2.10 version (around Q2 2018).&lt;/p&gt;&lt;p class=&quot;text-align-center&quot;&gt;&lt;em&gt;&lt;strong&gt;See you at the conference for sharing awesome experiences or only just to say hello :)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Below you will find the abstract of our presentation:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://devcon.alfresco.com/speaker/piergiorgio-lucidi/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Content migration using Apache ManifoldCF Output Connectors&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;In our days, enterprise digital content is scattered on several independent systems and subsystems, which perform services such as user authentication, document storage, and provide search capabilities. Centralising enterprise data into a single repository is a growing necessity for organisations. Our talk proposes an approach that could be the &quot;silver bullet&quot; that will open a clear path for Enterprise digital content centralisation . In its genesis , Apache ManifoldCF is a crawler that allows you to manage content indexes in your search engines, this was the main goal of the product. We've realised that we could leverage ManifoldCF to also migrate content, and not only indexes, making it a very good migration tool. This talk will focus on 2 new output connectors for Apache ManifoldCF that are being developed by us.&lt;/em&gt;&lt;/p&gt;

  

  	
      
      
        
          
            
              &lt;img alt=&quot;This is just the first slide of our presentation, stay tuned and come to see me and Luis speaking about content migration using Apache ManifoldCF&quot; class=&quot;thumb-image&quot; src=&quot;https://static1.squarespace.com/static/59d1061890badead478a76d5/t/5a3f88c20d9297d1689de173/1514113281177/presentationStart2-alfrescoDevCon2018-ManifoldCF.png?format=1000w&quot; /&gt;
            
          

          
          
            &lt;p&gt;This is just the first slide of our presentation, stay tuned and come to see me and Luis speaking about content migration using Apache ManifoldCF&lt;/p&gt;</description>
	<pubDate>Fri, 22 Dec 2017 15:33:43 +0000</pubDate>
</item>
<item>
	<title>Claus Ibsen: Camel in Action 2nd edition - To be done by start of January 2018</title>
	<guid isPermaLink="true">http://feedproxy.google.com/~r/ApacheCamel/~3/wo90AZBZNrk/camel-in-action-2nd-edition-to-be-done.html</guid>
	<link>http://feedproxy.google.com/~r/ApacheCamel/~3/wo90AZBZNrk/camel-in-action-2nd-edition-to-be-done.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;We just wanted to share the latest status of the &lt;a href=&quot;https://www.manning.com/books/camel-in-action-second-edition&quot; target=&quot;_blank&quot;&gt;Camel in Action 2nd edition book&lt;/a&gt; here a few days before Christmas.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We had hoped the book would have been done today. However there has been unexpected holdup due to the indexing of this big book is causing longer time to process than usual. In light of this Manning has pushed the schedule so the book is expected to be done by end of first week in January 2018.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This gives us, the authors, an extra opportunity to review all the pages of the book, yet one more time, which would be our 5th review. It's unusual that a book has as many final reviews as we end up doing with this book. Its all good in the end as it means that higher quality and that we will correct cosmetic details that may otherwise have been missed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example we spotted a glitch in figure 17.9, where the dashed box is not 100% horizontal in the bottom as shown in the following before vs after screenshots.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-KW7etOeGAss/Wj0NwWhKCfI/AAAAAAAABgg/fkjmOhLJQ7I3u2mS3QT-qNJsyXrYcdvzwCLcBGAs/s1600/before.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-KW7etOeGAss/Wj0NwWhKCfI/AAAAAAAABgg/fkjmOhLJQ7I3u2mS3QT-qNJsyXrYcdvzwCLcBGAs/s1600/before.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figure 17.9 - Before with the glitch in the dashed line in the bottom not being 100% horizontal line&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-UdUnRlnw1GY/Wj0N58pYDqI/AAAAAAAABgk/kgnQYTxmspIGKX8I-dFtkvnE2ADzB7qNgCLcBGAs/s1600/after.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;194&quot; src=&quot;https://2.bp.blogspot.com/-UdUnRlnw1GY/Wj0N58pYDqI/AAAAAAAABgk/kgnQYTxmspIGKX8I-dFtkvnE2ADzB7qNgCLcBGAs/s320/after.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figure 17.9 - After with the dashed lined in the bottom fixed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Manning has told us that they expect the page total in the print book to be around 900. In addition we have two bonus chapters that are available for download of readers, which are 26 and 18 pages long. All together is nearly a double of the number of pages of the first edition which was already a big book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So hold on a little longer and we will be on a great start of 2018 with a up-to-date modern book covering all aspects of Apache Camel. The book uses the latest Camel release 2.20.1 at this time of writing, and we have some tips, what is coming in Camel 2.21 release, whenever relevant to our readers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Merry x-mas and happy new-year&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Claus Ibsen&lt;/div&gt;&lt;div&gt;Jonathan Anstey&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=wo90AZBZNrk:z6zyn0PEpds:yIl2AUoC8zA&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?d=yIl2AUoC8zA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=wo90AZBZNrk:z6zyn0PEpds:4cEx4HpKnUU&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?i=wo90AZBZNrk:z6zyn0PEpds:4cEx4HpKnUU&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=wo90AZBZNrk:z6zyn0PEpds:F7zBnMyn0Lo&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?i=wo90AZBZNrk:z6zyn0PEpds:F7zBnMyn0Lo&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=wo90AZBZNrk:z6zyn0PEpds:V_sGLiPBpWU&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?i=wo90AZBZNrk:z6zyn0PEpds:V_sGLiPBpWU&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/ApacheCamel/~4/wo90AZBZNrk&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 22 Dec 2017 14:01:10 +0000</pubDate>
</item>
<item>
	<title>Bertrand Delacretaz: Open source is done. Welcome to Open Development!</title>
	<guid isPermaLink="true">https://grep.codeconsult.ch/2017/12/14/open-source-is-done-welcome-to-open-development/</guid>
	<link>https://grep.codeconsult.ch/2017/12/14/open-source-is-done-welcome-to-open-development/</link>
	<description>&lt;p&gt;I originally published this article on SD Times, republishing it to keep it around for posterity…&lt;/p&gt;
&lt;p&gt;If you’re looking at embracing open source today, you might be a bit late to the game. Using open-source software is mainstream now, and being involved in open-source projects is nothing to write home about either. Everybody does it, we know how it works, its value is proven. &lt;/p&gt;
&lt;p&gt;But what’s next? Sharing source code openly is a given in open-source projects, but in the end it’s only about sharing lines of text. The real long-term power of successful open-source projects lies in how their communities operate, and that’s where open development comes in. &lt;/p&gt;
&lt;p&gt;Shared communications channels. Meritocracy. Commit early, commit often. Back your work by issues in a shared tracker. Archive all discussions, decisions and issues about your project, and make that searchable. All simple principles that, when combined, make a huge difference to the efficiency of our corporate projects. &lt;/p&gt;
&lt;p&gt;But, of course, the chaotic meritocracies of open-source projects won’t work for corporate teams, right? Such teams require a chain of command with strictly defined roles. Corporate meritocracy? You must be kidding. &lt;/p&gt;
&lt;p&gt;I’m not kidding, actually: Open development works very well in corporate settings, and from my experience in both very small and fairly large organizations, much better than old-fashioned top-to-bottom chains of command and information segregation principles. Empower your engineers, trust them, make everything transparent so that mistakes can be caught early, and make sure the project’s flow of information is continuous and archived. Big rewards are just around the corner—if you dive in, that is. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;What’s open development?&lt;/b&gt;&lt;br /&gt;Open development starts by using shared digital channels to communicate between project members, as opposed to one-to-one e-mails and meetings. If your team’s e-mail clients are their knowledge base, that will go away with them when they leave, and it’s impossible for new project members to acquire that knowledge easily. &lt;/p&gt;
&lt;p&gt;A centralized channel, like a mailing list, allows team members to be aware of everything that’s going on. A busy mailing list requires discipline, but the rewards are huge in terms of spreading knowledge around, avoiding duplicate work and providing a way for newcomers to get a feel for the project by reviewing the discussion archives. At the Apache Software Foundation, we even declare that “If it didn’t happen on the dev list, it didn’t happen,” which is a way of saying that whatever is worth saying must be made available to all team members. No more discrepancies in what information team members get; it’s all in there. &lt;/p&gt;
&lt;p&gt;The next step is sharing all your code openly, all the time, with all stakeholders. Not just in a static way, but as a continuous flow of commits that can tell you how fast your software is evolving and where it’s going, in real time. &lt;/p&gt;
&lt;p&gt;Software developers will sometimes tell you that they cannot show their code because it’s not finished. But code is never finished, and it’s not always beautiful, so who cares? Sharing code early and continuously brings huge benefits in terms of peer reviews, learning from others, and creating a sense of belonging among team members. It’s not “my” code anymore, it’s “our” code. I’m happy when someone sees a way to improve it and just does it, sometimes without even asking for permission, because the fix is obvious. One less bug, quality goes up, and “shared neurons in the air” as we sometimes say: all big benefits to a team’s efficiency and cohesion. &lt;/p&gt;
&lt;p&gt;Openly sharing the descriptions and resolutions of issues is equally important and helps optimize usage of a team’s skills, especially in a crisis. As in a well-managed open-source project, every code change is backed by an issue in the tracker, so you end up with one Web page per issue, which tells the full history of why the change was made, how, when, and by whom. Invaluable information when you need to revisit the issue later, maybe much later when whoever wrote that code is gone.&lt;/p&gt;
&lt;p&gt;Corporate projects too often skip this step because their developers are co-located and can just ask their colleague next door directly. By doing that, they lose an easy opportunity to create a living knowledgebase of their projects, without much effort from the developers. It’s not much work to write a few lines of explanation in an issue tracker when an issue is resolved, and, with good integration, rich links will be created between the issue tracker and the corresponding source code, creating a web of valuable information. &lt;/p&gt;
&lt;p&gt;The dreaded “When can we ship?” question is also much easier to answer based on a dynamic list of specific issues and corresponding metadata than by asking around the office, or worse, having boring status meetings. &lt;/p&gt;
&lt;p&gt;The last critical tool in our open development setup is in self-service archives of all that information. Archived mailing lists, resolved issues that stay around in the tracker, source-code control history, and log messages, once made searchable, make project knowledge available in self-service to all team members. Here as well, forget about access control and leave everything open. You want your engineers to be curious when they need to, and to find at least basic information about everything that’s going on by themselves, without having to bother their colleagues with meetings or tons of questions. Given sufficient self-service information, adding more competent people to a project does increase productivity, as people can largely get up to speed on their own. &lt;/p&gt;
&lt;p&gt;While all this openness may seem chaotic and noisy to the corporate managers of yesterday, that’s how open-source projects work. The simple fact that loose groups of software developers with no common boss consistently produce some of the best software around should open your eyes. This works. &lt;/p&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1657/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1657/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://pixel.wp.com/b.gif?host=grep.codeconsult.ch&amp;amp;blog=2844102&amp;amp;post=1657&amp;amp;subd=bdelacretaz&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 14 Dec 2017 08:30:43 +0000</pubDate>
</item>
<item>
	<title>Aaron Morton: Should you use incremental repair?</title>
	<guid isPermaLink="true">http://thelastpickle.com/blog/2017/12/14/should-you-use-incremental-repair.html</guid>
	<link>http://thelastpickle.com/blog/2017/12/14/should-you-use-incremental-repair.html</link>
	<description>&lt;p&gt;After seeing a lot of questions surrounding incremental repair on the mailing list and after observing several outages caused by it, we figured it would be good to write down our advices in a blog post.&lt;/p&gt;

&lt;p&gt;Repair in Apache Cassandra is a maintenance operation that restores data consistency throughout a cluster.
It is advised to run repair operations at leasts every &lt;code class=&quot;highlighter-rouge&quot;&gt;gc_grace_seconds&lt;/code&gt; to ensure that tombstones will get replicated consistently to avoid zombie records if you perform DELETE statements on your tables.&lt;/p&gt;

&lt;p&gt;Repair also facilitates recovery from outages that last longer than the hint window, or in case hints were dropped.
For those operators already familiar with the repair concepts, there were a few back-to-basics moments when the behavior of repair changed significantly in the release of Apache Cassandra 2.2. The introduction of incremental repair as the default along with the generalization of anti-compaction created a whole new set of challenges.&lt;/p&gt;

&lt;h2 id=&quot;how-does-repair-work&quot;&gt;How does repair work?&lt;/h2&gt;

&lt;p&gt;To perform repairs without comparing all data between all replicas, Apache Cassandra uses merkle trees to compare trees of hashed values instead.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Merkle tree&quot; src=&quot;http://feeds.feedburner.com/files/2017-should-you-use-incremental-repair/merkletree.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;During a repair, each replica will build a merkle tree, using what is called a “validation compaction”. It is basically a compaction without the write phase, the output being a tree of hashes.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Validation compaction&quot; src=&quot;http://feeds.feedburner.com/files/2017-should-you-use-incremental-repair/validation-compaction.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Merkle trees will then be compared between replicas to identify mismatching leaves, each leaf containing several partitions. No difference check is made on a per partition basis : if one partition in a leaf is not in sync, then all partitions in the leaf are considered as not being in sync. When more data is sent over than is required it’s typically called overstreaming. Gigabytes of data can be streamed, even for one bit of difference.
To mitigate overstreaming, people started performing subrange repairs by specifying the start/end tokens to repair by smaller chunks, which results in having less partitions per leaf.&lt;/p&gt;

&lt;p&gt;With clusters growing in size and density, performing repairs within &lt;code class=&quot;highlighter-rouge&quot;&gt;gc_grace_seconds&lt;/code&gt; started to get more and more challenging, with repairs sometimes lasting for tens of days.
Some clever folks leveraged the immutable nature of SSTables and introduced incremental repair in Apache Cassandra 2.1.&lt;/p&gt;

&lt;h2 id=&quot;what-is-incremental-repair&quot;&gt;What is incremental repair?&lt;/h2&gt;

&lt;p&gt;The plan with incremental repair was that once some data had been repaired, it would be marked as such and never needed to be repaired anymore.&lt;br /&gt;
Since SSTables can contain tokens from multiple token ranges, and repair is performed by token range, it was necessary to be able to separate repaired data from unrepaired data.  That process is called &lt;strong&gt;anticompaction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Anticompaction&quot; src=&quot;http://feeds.feedburner.com/files/2017-should-you-use-incremental-repair/anticompaction.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once a repair session ends, each repaired SSTable will be split into 2 SSTables : one that contains the data that was repaired in the session (ie : data that belonged to the repaired token range) and another one with the remaining unrepaired data. The newly created SSTable containing repaired data will be marked as such by setting its &lt;strong&gt;repairedAt&lt;/strong&gt; timestamp to the time of the repair session.&lt;br /&gt;
When performing validation compaction during the next incremental repair, Cassandra will skip the SSTables with a repairedAt timestamp higher than 0, and thus only compare data that is unrepaired.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Incremental repair&quot; src=&quot;http://feeds.feedburner.com/files/2017-should-you-use-incremental-repair/incremental-repair.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Incremental repair was actually promising enough that it was promoted as the default repair mode in C* 2.2, and anticompaction was since then also performed during full repairs.&lt;br /&gt;
To say the least, this was a bit of a premature move from the community as incremental repair has a few very annoying drawbacks and caveats that would make us consider it an experimental feature instead.&lt;/p&gt;

&lt;h2 id=&quot;the-problems-of-incremental-repair&quot;&gt;The problems of incremental repair&lt;/h2&gt;

&lt;p&gt;The most nasty one is filed in the Apache Cassandra JIRA as &lt;a href=&quot;https://issues.apache.org/jira/browse/CASSANDRA-9143&quot;&gt;CASSANDRA-9143&lt;/a&gt; with a fix ready for the unplanned &lt;a href=&quot;https://issues.apache.org/jira/projects/CASSANDRA/versions/12336842&quot;&gt;4.0 release&lt;/a&gt;. Between validation compaction and anticompaction, an SSTable that is involved in a repair can be compacted away as part of the standard compaction process on one node and not on the others. Such an SSTable will not get marked as repaired on that specific node while the rest of the cluster will consider the data it contained as repaired.&lt;br /&gt;
Thus, on the next incremental repair run, all the partitions contained by that SSTable will be seen as inconsistent and it can generate a fairly large amount of overstreaming.
This is a particularly nasty bug when incremental repair is used in conjunction with Level Compaction Strategy (LCS). LCS is a very intensive strategy where SSTables get compacted way more often than with STCS and TWCS.
LCS creates fixed sized SSTables, which can easily lead to have thousands of SSTables for a single table. The way streaming occurs in Apache Cassandra during repair makes that overstreaming of LCS tables could create tens of thousands of small SSTables in L0 which can ultimately bring nodes down and affect the whole cluster. This is particularly true when the nodes use a large number of vnodes.&lt;br /&gt;
We have seen happening on several customers clusters, and it requires then a lot of operational expertise to bring back the cluster to a sane state.&lt;/p&gt;

&lt;p&gt;In addition to the bugs related to incorrectly marked sstables, there is significant overhead of anti-compaction. It was kind of a big surprise for users upgrading from 2.0/2.1 to 2.2 when trying to run repair. If there is already a lot of data on disk, the first incremental repair can take a lot of time (if not forever) and create a similar situation as above with a lot of SSTables being created due to anticompaction. Keep in mind that anticompaction will rewrite all SSTables on disk to separate repaired and unrepaired data.&lt;br /&gt;
While it’s not necessary anymore to “prepare” the migration to incremental repair, we would strongly advise against running it on a cluster with a lot of unrepaired data, without first marking SSTables as repaired. This would require to run a full repair first to make sure data is actually repaired, but now even full repair performs anticompaction, so… you see the problem.&lt;/p&gt;

&lt;p&gt;A safety measure has been set in place to prevent SSTables going through anticompaction to be compacted, for valid reasons. The problem is that it will also prevent that SSTable from going through validation compaction which will lead repair sessions to fail if an SSTable is being anticompacted. Given that anticompaction also occurs with full repairs, this creates the following limitation : you cannot run repair on more than one node at a time without risking to have failed sessions due to concurrency on SSTables. This is true for incremental repair but also full repair, and it changes a lot of the habit you had to run repair in previous versions.&lt;/p&gt;

&lt;p&gt;The only way to perform repair without anticompaction in “modern” versions of Apache Cassandra is subrange repair, which fully skips anticompaction. To perform a subrange repair correctly, you have three options :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Compute valid token subranges yourself and script repairs accordingly&lt;/li&gt;
  &lt;li&gt;Use the &lt;a href=&quot;https://github.com/BrianGallew/cassandra_range_repair&quot;&gt;Cassandra range repair script&lt;/a&gt; which performs subrange repair&lt;/li&gt;
  &lt;li&gt;Use &lt;a href=&quot;http://cassandra-reaper.io&quot;&gt;Cassandra Reaper&lt;/a&gt;, which also performs subrange repair&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless, it is extremely important to note that repaired and unrepaired SSTables can &lt;em&gt;never be compacted together&lt;/em&gt;. If you stop performing incremental repairs once you started, you could end up with outdated data not being cleaned up on disk due to the presence of the same partition in both states.
So if you want to continue using incremental repair, make sure it runs very regularly, and if you want to move back to full subrange repairs you will need to mark all SSTables as unrepaired using sstablerepairedset.&lt;/p&gt;

&lt;p&gt;Note that due to subrange repair not performing anti-compaction, is not possible to perform subrange repair in incremental mode.&lt;/p&gt;

&lt;h2 id=&quot;repair--state-of-the-art-in-late-2017&quot;&gt;Repair : state of the art in late 2017&lt;/h2&gt;

&lt;p&gt;Here’s our advice at the time of writing this blog post, based on our experience with customers : perform full subrange repair exclusively for now and do not ever run incremental repair. Just pretend that feature does not exist for now.&lt;/p&gt;

&lt;p&gt;While the idea behind incremental repair is brilliant, the implementation still has flaws that can cause severe damage to a production cluster, especially when using LCS and DTCS.
The improvements and fixes planned for 4.0 will need to be thoroughly tested to prove they fixed incremental repair and allow it to be safely used as a daily routine.&lt;/p&gt;

&lt;p&gt;We are confident that future releases will make incremental repair better, allowing the operation to be safe and blazing fast compared to full repairs.&lt;/p&gt;</description>
	<pubDate>Thu, 14 Dec 2017 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Colm O hEigeartaigh: A fast way to get membership counts in Apache Syncope</title>
	<guid isPermaLink="true">http://coheigea.blogspot.com/2017/12/a-fast-way-to-get-membership-counts-in.html</guid>
	<link>http://coheigea.blogspot.com/2017/12/a-fast-way-to-get-membership-counts-in.html</link>
	<description>Apache &lt;a href=&quot;http://syncope.apache.org/&quot;&gt;Syncope&lt;/a&gt; is a powerful open source Identity Management project, covered extensively on this blog. Amongst many other features, it allows the management of three core types - Users, Groups and &quot;Any Objects&quot;, the latter which can be used to model arbitrary types. These core types can be accessed via a flexible REST API powered by Apache &lt;a href=&quot;http://cxf.apache.org/&quot;&gt;CXF&lt;/a&gt;. In this post we will explore the concept of &quot;membership&quot; in Apache Syncope, as well as a new feature that was added for Syncope 2.0.7 which allows an easy way to see membership counts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Membership in Apache Syncope&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Users and &quot;Any Objects&quot; can be members of Groups in two ways - statically and dynamically. &quot;Static&quot; membership is when the User or &quot;Any Object&quot; is explicitly assigned membership of a given Group. &quot;Dynamic&quot; membership is when the Group is defined with a set of rules, which if they evaluate to true for a given User or &quot;Any Object&quot;, then that User or &quot;Any Object&quot; is a member of the group. For example, a User could be a dynamic member of a group based on the value for a given User attribute. So we could have an Apache group with a dynamic User membership rule of &quot;*@apache.org&quot; matching an &quot;email&quot; attribute.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Exploring group membership via the REST API&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let's examine group membership with some practical examples. Start Apache Syncope and log in to the admin console. Click on &quot;Groups&quot; and add a new group called &quot;employee&quot;, accepting the default options. Now click on the &quot;User&quot; tab and add new Users called &quot;alice&quot; and &quot;bob&quot;, with static membership of the &quot;employee&quot; group.&lt;br /&gt;&lt;br /&gt;Using a tool like &quot;curl&quot;, we can access the REST API using the admin credentials to obtain information on &quot;alice&quot;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curl -u admin:password http://localhost:9080/syncope/rest/users/alice&lt;/li&gt;&lt;/ul&gt;Note that &quot;alice&quot; has a &quot;memberships&quot; attribute pointing to the &quot;employee&quot; group. Next we can see information on the &quot;employee&quot; group via:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curl -u admin:password http://localhost:9080/syncope/rest/groups/employee&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;3) Obtaining membership counts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now consider obtaining the membership count of a given group. Let's say we are interested in finding out how many employees we have - how can this be done? Prior to Apache Syncope 2.0.7, we have to leverage the power of FIQL which underpins the search capabilities of the REST API of Apache Syncope:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curl -u admin:password http://localhost:9080/syncope/rest/users?fiql=%24groups==employee&lt;/li&gt;&lt;/ul&gt;In other words, search for all Users who are members of the &quot;employee&quot; group. This returns a long list of all Users, even though all we care about is the count (which is encoded in the &quot;totalCount&quot; attribute). There is a &lt;a href=&quot;https://issues.apache.org/jira/browse/SYNCOPE-1243&quot;&gt;new&lt;/a&gt; way to do this Apache Syncope 2.0.7. Instead of having to search for Users, membership counts are now encoded in groups. So we can see the total membership counts for a given group just by doing a GET call:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curl -u admin:password http://localhost:9080/syncope/rest/groups/employee&lt;/li&gt;&lt;/ul&gt;Following the example above, you should see an &quot;staticUserMembershipCount&quot; attribute with a value of &quot;2&quot;. Four new attributes are defined for GroupTO:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;staticUserMembershipCount: The static user membership count of a given group&lt;/li&gt;&lt;li&gt;dynamicUserMembershipCount: The dynamic user membership count of a given group&lt;/li&gt;&lt;li&gt;staticAnyObjectMembershipCount: The static &quot;Any Object&quot; membership count of a given group&lt;/li&gt;&lt;li&gt;dynamicAnyObjectMembershipCount: The dynamic &quot;Any Object&quot; membership count of a given group.&lt;/li&gt;&lt;/ul&gt;Some consideration was given to returning the Any Object counts associated with a given Any Object type, but this was abandoned due to performance reasons.</description>
	<pubDate>Wed, 13 Dec 2017 16:47:08 +0000</pubDate>
</item>
<item>
	<title>Colm O hEigeartaigh: SAML SSO support for the Apache Syncope web console</title>
	<guid isPermaLink="true">http://coheigea.blogspot.com/2017/12/saml-sso-support-for-apache-syncope-web.html</guid>
	<link>http://coheigea.blogspot.com/2017/12/saml-sso-support-for-apache-syncope-web.html</link>
	<description>Apache &lt;a href=&quot;http://syncope.apache.org/&quot;&gt;Syncope&lt;/a&gt; is a powerful open source Identity Management project, that has &lt;a href=&quot;https://twitter.com/syncopeidm/status/933232982122381312&quot;&gt;recently&lt;/a&gt; celebrated 5 years as an Apache top level project. Up to recently, a username and password must be supplied to log onto either the admin or enduser web consoles of Apache Syncope. However SAML SSO login is now &lt;a href=&quot;https://issues.apache.org/jira/browse/SYNCOPE-1041&quot;&gt;supported&lt;/a&gt; since the 2.0.3 release. Instead of supplying a username/password, the user is redirected to a third party IdP for login, before redirecting back to the Apache Syncope web console. In 2.0.5, support for the IdP-initiated flow of SAML SSO was &lt;a href=&quot;https://issues.apache.org/jira/browse/SYNCOPE-1202&quot;&gt;added&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this post we will show how to configure Apache Syncope to use SAML SSO as an alternative to logging in using a username and password. We will use Apache CXF &lt;a href=&quot;http://cxf.apache.org/fediz.html&quot;&gt;Fediz&lt;/a&gt; as the SAML SSO IdP. In addition, we will show how to achieve IdP-initiated SSO using &lt;a href=&quot;https://www.okta.com/&quot;&gt;Okta&lt;/a&gt;. Please also refer to this &lt;a href=&quot;http://blog.tirasa.net/saml-single-signon-to-apache-syncope.html&quot;&gt;tutorial&lt;/a&gt; on achieving SAML SSO with Syncope and Shibboleth.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Logging in to Apache Syncope using SAML SSO&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In this section, we will cover setting up Apache Syncope to re-direct to a third party IdP so that the user can enter their credentials. The next section will cover the IdP-initiated case.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;1.a) Enable SAML SSO support in Apache Syncope&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First we will configure Apache Syncope to enable SAML SSO support. &lt;a href=&quot;https://syncope.apache.org/downloads.html&quot;&gt;Download&lt;/a&gt; and extract the most recent standalone distribution release of Apache Syncope (2.0.6 was used in this post). Start the embedded Apache Tomcat instance and then open a web browser and navigate to &quot;http://localhost:9080/syncope-console&quot;, logging in as &quot;admin&quot; and &quot;password&quot;.&lt;br /&gt;&lt;br /&gt;Apache Syncope is configured with some sample data to show how it can be used. Click on &quot;Users&quot; and add a new user called &quot;alice&quot; by clicking on the subsequent &quot;+&quot; button. Specify a password for &quot;alice&quot; and then select the default values wherever possible (you will need to specify some required attributes, such as &quot;surname&quot;). Now in the left-hand column, click on &quot;Extensions&quot; and then &quot;SAML 2.0 SP&quot;. Click on the &quot;Service Provider&quot; tab and then &quot;Metadata&quot;. Save the resulting Metadata document, as it will be required to set up the SAML SSO IdP.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;1.b) Set up the Apache CXF Fediz SAML SSO IdP&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Next we will turn our attention to setting up the Apache CXF Fediz SAML SSO IdP. &lt;a href=&quot;http://cxf.apache.org/fediz-downloads.html&quot;&gt;Download&lt;/a&gt; the most recent source release of Apache CXF Fediz (1.4.3 was used for this tutorial). Unzip the release and build it using maven (&quot;mvn clean install -DskipTests&quot;). In the meantime, &lt;a href=&quot;https://tomcat.apache.org/download-80.cgi&quot;&gt;download&lt;/a&gt; and extract the latest Apache Tomcat 8.5.x distribution (tested with 8.5.24). Once Fediz has finished building, copy all of the &quot;IdP&quot; wars (e.g. in fediz-1.4.3/apache-fediz/target/apache-fediz-1.4.3/apache-fediz-1.4.3/idp/war/fediz-*) to the Tomcat &quot;webapps&quot; directory.&lt;br /&gt;&lt;br /&gt;There are a few configuration changes to be made to Apache Tomcat before starting it.&lt;a href=&quot;http://repo1.maven.org/maven2/org/hsqldb/hsqldb/2.3.5/&quot;&gt; Download&lt;/a&gt; the HSQLDB jar and copy it to the Tomcat &quot;lib&quot; directory. Next edit 'conf/server.xml' and configure TLS on port 8443:&lt;br /&gt;&lt;br /&gt; The two keys referenced here can be obtained from 'apache-fediz/target/apache-fediz-1.4.3/apache-fediz-1.4.3/examples/samplekeys/' and should be copied to the root directory of Apache Tomcat. Tomcat can now be started.&lt;br /&gt;&lt;br /&gt;Next we have to configure Apache CXF Fediz to support Apache Syncope as a &quot;service&quot; via SAML SSO. Edit 'webapps/fediz-idp/WEB-INF/classes/entities-realma.xml' and add the following configuration:&lt;br /&gt;&lt;br /&gt; In addition, we need to make some changes to the &quot;idp-realmA&quot; bean in this file:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add a reference to this bean in the &quot;applications&quot; list: &amp;lt;ref bean=&quot;srv-syncope&quot; /&amp;gt;&lt;/li&gt;&lt;li&gt;Change the &quot;idpUrl&quot; property to: https://localhost:8443/fediz-idp/saml&lt;/li&gt;&lt;li&gt;Change the port for &quot;stsUrl&quot; from &quot;9443&quot; to &quot;8443&quot;. &lt;/li&gt;&lt;/ul&gt;Now we need to configure Fediz to accept Syncope's signing cert. Edit the Metadata file you saved from Syncope in step 1.a. Copy the Base-64 encoded certificate in the &quot;KeyDescriptor&quot; section, and paste it (including line breaks) into 'webapps/fediz-idp/WEB-INF/classes/syncope.cert', enclosing it in between &quot;-----BEGIN CERTIFICATE-----&quot; and &quot;-----END CERTIFICATE-----&quot;.&lt;br /&gt;&lt;br /&gt;Now restart Apache Tomcat. Open a browser and save the Fediz metadata which is available at &quot;http://localhost:8080/fediz-idp/metadata?protocol=saml&quot;, which we will require when configuring Apache Syncope.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.c) Configure the Apache CXF Fediz IdP in Syncope&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The final configuration step takes place in Apache Syncope again. In the &quot;SAML 2.0 SP&quot; configuration screen, click on the &quot;Identity Providers&quot; tab and click the &quot;+&quot; button and select the Fediz metadata that you saved in the previous step. Now logout and an additional login option can be seen:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-H1KDxO0zev0/Wiq6zkguB-I/AAAAAAAABJA/eHilraOO8QkLaocP473-pM_DPoA97j3AQCLcBGAs/s1600/syncope-saml.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://2.bp.blogspot.com/-H1KDxO0zev0/Wiq6zkguB-I/AAAAAAAABJA/eHilraOO8QkLaocP473-pM_DPoA97j3AQCLcBGAs/s400/syncope-saml.png&quot; width=&quot;351&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Select the URL for the SAML SSO IdP and you will be redirected to Fediz. Select the IdP in realm &quot;A&quot; as the home realm and enter credentials of &quot;alice/ecila&quot; when prompted. You will be successfully authenticated to Fediz and redirected back to the Syncope admin console, where you will be logged in as the user &quot;alice&quot;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Using IdP-initiated SAML SSO&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Instead of the user starting with the Syncope web console, being redirected to the IdP for authentication, and then redirected back to Syncope - it is possible instead to start from the IdP. In this section we will show how to configure Apache Syncope to support IdP-initiated SAML SSO using Okta.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;2.a) Configuring a SAML application in Okta&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The first step is to create an account at Okta and configure a SAML application. This process is mapped out at the following &lt;a href=&quot;http://developer.okta.com/standards/SAML/setting_up_a_saml_application_in_okta&quot;&gt;link&lt;/a&gt;. Follow the steps listed on this page with the following additional changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Specify the following for the Single Sign On URL: http://localhost:9080/syncope-console/saml2sp/assertion-consumer&lt;/li&gt;&lt;li&gt;Specify the following for the audience URL: http://localhost:9080/syncope-console/ &lt;/li&gt;&lt;li&gt;Specify the following for the default RelayState: idpInitiated&lt;/li&gt;&lt;/ul&gt;When the application is configured, you will see an option to &quot;View  Setup Instructions&quot;. Open this link in a new tab and find the section about the IdP Metadata. Save this to a local file and set it aside for the moment. Next you need to assign the application to  the username that you have created at Okta.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.b) Configure Apache Syncope to support IdP-Initiated SAML SSO&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Log on to the Apache Syncope admin console using the admin credentials, and add a new IdP Provider in the SAML 2.0 SP extension as before, using the Okta metadata file that you have saved in the previous section. Edit the metadata and select the 'Support Unsolicited Logins' checkbox. Save the metadata and make sure that the Okta user is also a valid user in Apache Syncope.&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;Now go back to the Okta console and click on the application you have configured for Apache Syncope. You should seemlessly be logged into the Apache Syncope admin console.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-1XSWsZVNN94/Wiq-ls_JdEI/AAAAAAAABJE/s3rbE9O37Iw-187EZwso-s0Pdh34H8pkACLcBGAs/s1600/okta.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;226&quot; src=&quot;https://2.bp.blogspot.com/-1XSWsZVNN94/Wiq-ls_JdEI/AAAAAAAABJE/s3rbE9O37Iw-187EZwso-s0Pdh34H8pkACLcBGAs/s400/okta.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;</description>
	<pubDate>Fri, 08 Dec 2017 17:09:00 +0000</pubDate>
</item>
<item>
	<title>Ortwin Glück: [Code] Gentoo enables PIE</title>
	<guid isPermaLink="true">http://www.odi.ch/weblog/posting.php?posting=723</guid>
	<link>http://www.odi.ch/weblog/posting.php?posting=723</link>
	<description>&lt;a href=&quot;https://www.gentoo.org/support/news-items/2017-11-30-new-17-profiles.html&quot;&gt;Gentoo has new profiles&lt;/a&gt; that require you to &quot;recompile everything&quot;. That is technically not really necessary. Only static libraries really need recompiling.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://lists.debian.org/debian-devel/2016/05/msg00309.html&quot;&gt;Here is why&lt;/a&gt;:&lt;br /&gt;
&lt;cite&gt;A static library is just an archive of .o files (similar to tar), nothing more, and linking against a static library is roughly the same as just adding more .o files to the linker line. You can also link a static library into a shared library - the code in &lt;strong&gt;the static library is then just copied into the shared library &lt;/strong&gt;(but the code then must be compiled with -fPIC, as with all other code that is used in shared libraries). &lt;/cite&gt;&lt;br /&gt;
&lt;br /&gt;
You can find static libs like so:
&lt;pre&gt;equery b $(find /usr/lib/ /lib/ -name *.a) | awk '{ print $1; }' | sort | uniq&lt;/pre&gt;
Typically this yields packages like &lt;code&gt;elfutils, libbsd, nss, iproute2, keyutils, texinfo, flex, db, numactl.&lt;/code&gt;&lt;br /&gt;
&lt;br type=&quot;_moz&quot; /&gt;</description>
	<pubDate>Thu, 07 Dec 2017 10:59:09 +0000</pubDate>
</item>
<item>
	<title>Sam Ruby: Achieving Response Time Goals with Service Workers</title>
	<guid isPermaLink="true">http://www.intertwingly.net/blog/2017/12/06/Achieving-Response-Time-Goals-with-Service-Workers</guid>
	<link>http://www.intertwingly.net/blog/2017/12/06/Achieving-Response-Time-Goals-with-Service-Workers</link>
	<description>&lt;svg height=&quot;100&quot; style=&quot;float: right;&quot; viewBox=&quot;0 0 100 100&quot; width=&quot;100&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
&lt;g fill=&quot;#000&quot; stroke=&quot;none&quot; transform=&quot;translate(-5,100) scale(0.035,-0.035)&quot;&gt;
&lt;path d=&quot;M1041 2503 c-32 -92 -63 -139 -111 -163 -61 -31 -120 -26 -213 17 l-78 37 -79 -79 c-44 -44 -80 -85 -80 -91 0 -7 16 -45 35 -85 40 -84 44 -133 16 -195 -25 -54 -57 -77 -152 -111 l-79 -28 0 -120 0 -120 79 -28 c95 -34 127 -57 152 -111 28 -62 24 -111 -16 -195 -19 -40 -35 -78 -35 -85 0 -6 36 -47 80 -91 l79 -79 78 37 c93 43 152 48 213 17 48 -24 79 -71 111 -163 l23 -68 119 3 119 3 28 78 c59 166 152 205 313 130 l78 -37 85 86 86 85 -35 69 c-44 87 -51 122 -37 174 18 68 68 114 160 146 l80 27 0 122 0 122 -80 27 c-92 32 -142 78 -160 146 -14 52 -7 87 37 174 l35 69 -86 85 -85 86 -78 -37 c-161 -75 -254 -36 -313 130 l-28 78 -119 3 -119 3 -23 -68z m286 -533 c63 -31 112 -80 149 -150 27 -50 27 -220 0 -270 -38 -71 -86 -119 -153 -152 -132 -65 -274 -38 -375 70 -113 121 -116 309 -5 429 106 115 245 141 384 73z&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M2306 1346 c-13 -30 -33 -59 -44 -65 -31 -17 -78 -13 -121 8 l-38 20 -43 -44 -43 -44 16 -43 c35 -91 12 -144 -72 -169 l-42 -12 3 -65 3 -65 40 -14 c60 -20 88 -57 82 -107 -2 -23 -10 -56 -18 -73 -13 -32 -12 -34 26 -73 21 -22 44 -40 51 -40 6 0 31 9 55 19 74 32 124 8 152 -74 l14 -40 61 -3 62 -3 25 56 c19 44 32 59 59 70 32 14 40 13 92 -6 l56 -21 43 42 44 43 -20 38 c-40 79 -18 138 62 169 l44 18 3 64 3 65 -42 12 c-85 26 -111 89 -70 170 l20 38 -47 46 -47 46 -35 -19 c-79 -43 -145 -16 -171 69 l-12 41 -64 0 -63 0 -24 -54z m161 -262 c86 -41 119 -153 69 -238 -60 -103 -193 -114 -273 -23 -120 137 38 339 204 261z&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M1586 820 c-7 -40 -31 -48 -60 -21 -27 25 -34 26 -64 3 -19 -15 -21 -22 -13 -43 14 -38 0 -53 -43 -46 -33 5 -38 3 -52 -25 -15 -28 -14 -31 6 -54 28 -29 20 -52 -20 -61 -28 -5 -31 -9 -28 -41 3 -31 7 -37 36 -44 38 -10 42 -32 11 -64 -19 -21 -20 -24 -5 -52 15 -28 18 -30 48 -21 42 12 62 -9 47 -49 -10 -26 -8 -29 34 -53 15 -8 24 -6 41 10 31 29 45 26 62 -14 12 -29 19 -35 44 -35 25 0 32 6 44 35 17 40 31 43 62 14 21 -19 24 -20 52 -5 27 14 30 19 25 54 -6 46 3 55 46 42 29 -8 32 -6 47 22 15 29 14 31 -7 54 -27 29 -18 55 22 64 19 5 25 13 27 42 3 32 1 36 -28 41 -41 9 -48 32 -19 63 22 24 22 26 7 52 -15 24 -22 27 -58 24 l-42 -4 4 42 c3 36 0 43 -24 58 -26 15 -28 15 -52 -7 -31 -29 -54 -22 -62 19 -6 27 -10 30 -44 30 -34 0 -38 -3 -44 -30z m91 -175 c12 -3 34 -20 48 -36 30 -36 35 -111 9 -147 -49 -71 -170 -67 -209 8 -36 70 -3 159 68 179 32 9 41 8 84 -4z&quot;&gt;&lt;/path&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;p&gt;Service Workers enable a web application to be responsive even if the network isn't.  Frameworks like &lt;a href=&quot;https://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt;, &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt; and &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt; enable web applications to efficiently update and render web pages as data changes.&lt;/p&gt;

&lt;p&gt;The Apache Software Foundation's &lt;a href=&quot;https://github.com/apache/whimsy/tree/master/www/board/agenda&quot;&gt;Whimsy board agenda&lt;/a&gt; application uses both in combination to achieve a responsive user experience - both in terms of quick responses to user requests and quick updates based on changes made on the server.&lt;/p&gt;

&lt;p&gt;From a performance perspective, the two cases easiest to optimize for are (1) the server fully up and running accessed across a fast network with all possible items cached, and (2) the application fully offline as once you make offline possible at all, it will be fast.&lt;/p&gt;

&lt;p&gt;The harder cases ones where the server has received a significant update and needs to get that information to users, and even harder is when the server has no instances running and needs to spin up a new instance to process a request.  While it is possible to do &lt;a href=&quot;https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html&quot;&gt;blue/green&lt;/a&gt; deployment for applications that are &quot;always on&quot;, this isn't practical or appropriate for applications which only used in periodic bursts.  The board agenda tool is one such application.&lt;/p&gt;

&lt;p&gt;This article describes how a goal of sub-second response time is achieved in such an environment.  There are plenty of articles on the web that show snippets or sanitized approaches, this one focuses on real world usage.&lt;/p&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction to Service Workers&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://w3c.github.io/ServiceWorker/&quot;&gt;Service Workers&lt;/a&gt; are JavaScript files that can intercept and provide responses to navigation and resource requests.  Service Workers &lt;a href=&quot;https://caniuse.com/#search=serviceworker&quot;&gt;are supported&lt;/a&gt; today by Chrome and FireFox, and are under development in Microsoft Edge and WebKit/Safari.&lt;/p&gt;

&lt;p&gt;Service Workers are part of a larger effort dubbed &quot;&lt;a href=&quot;https://developers.google.com/web/progressive-web-apps/&quot;&gt;Progressive Web Apps&lt;/a&gt;&quot; that aim to make web applications reliable and fast, no matter what the state of the network may happen to be.  The word &quot;progressive&quot; in this name is there to indicate that these applications will work with any browser to the best of that browser's ability.&lt;/p&gt;

&lt;p&gt;The signature or premier feature of Service Workers is &lt;a href=&quot;https://hacks.mozilla.org/2015/11/offline-service-workers/&quot;&gt;offline&lt;/a&gt; applications.  Such web applications are loaded normally the first time, and cached.  When offline, requests are served by the cache, and any input made by users can be stored in &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage&quot;&gt;local storage&lt;/a&gt; or in an &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API&quot;&gt;index db&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://serviceworke.rs/&quot;&gt;serviceworke.rs&lt;/a&gt; and &lt;a href=&quot;https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/&quot;&gt;The Offline Cookbook&lt;/a&gt; provide a number of recipes that can be used.  &lt;/p&gt;

&lt;h3 id=&quot;board-agenda-overview&quot;&gt;Overview of the Board Agenda Tool&lt;/h3&gt;

&lt;p&gt;This information is for background purposes only.  Feel free to skim or skip.&lt;/p&gt;

&lt;p&gt;The ASF Board meets monthly, and &lt;a href=&quot;https://www.apache.org/foundation/board/calendar.html&quot;&gt;minutes&lt;/a&gt; are published publicly on the web.  A typical meeting has over one hundred agenda items, though the board agenda tool assists in resolving most off them offline, leaving a manageable 9 officer reports, around 20 PMC reports that may or may not require action, and a handful of special orders.&lt;/p&gt;

&lt;p&gt;While the full agenda is several thousand lines long, this file size is only a quarter of a megabyte or the size of a small image.  The server side of this application parses the agenda and presents it to the client in JSON format, and the result is roughly the same size as the original.&lt;/p&gt;

&lt;p&gt;To optimize the response of the first page access, the server is structured to do &lt;a href=&quot;https://vuejs.org/v2/guide/ssr.html&quot;&gt;server side rendering&lt;/a&gt; of the page that is requested, and the resulting response starts with links to stylesheets, then contains the rendered HTML, and finally any scripts and data needed.  This allows the browser to incrementally render the page as it is received.  This set of scripts includes a script that can render any page (or component) that the board agenda tool can produce, and the data includes all the information necessary to do so.  The current implementation is based on Vue.js.&lt;/p&gt;

&lt;p&gt;Once loaded, traversals between pages is immeasurably quick.  By that I mean that you can go to the first page and lean on the right arrow button and pages will smoothly scroll through the pages by at roughly the rate at which you can see the faces in a deck of cards shuffled upside down.&lt;/p&gt;

&lt;p&gt;The pages generally contain buttons and hidden forms; which buttons appear often depends on the user who requests the page.  For example, only Directors will see approve and unapprove buttons; and individual directors will only see one of these two buttons based on whether or not they have already approved the report.&lt;/p&gt;

&lt;p&gt;A &lt;a href=&quot;https://tools.ietf.org/html/rfc6455&quot;&gt;WebSocket&lt;/a&gt; between the server and client is made mostly so the server can push changes to each client; changes that then cause re-rendering and updated displays.  Requests from the client to the server generally are done via &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest&quot;&gt;XMLHttpRequest&lt;/a&gt; as it wasn't until very recently that Safari &lt;a href=&quot;https://caniuse.com/#feat=fetch&quot;&gt;supported fetch&lt;/a&gt;.  IE still doesn't, but Edge does.&lt;/p&gt;

&lt;p&gt;Total (uncompressed) size of the application script is another quarter of a megabyte, and dependencies include Vue.js and &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;, the latter being the biggest requiring over a half a megabyte of minimized CSS.&lt;/p&gt;

&lt;p&gt;All scripts and stylesheets are served with a &lt;a href=&quot;https://hacks.mozilla.org/2017/01/using-immutable-caching-to-speed-up-the-web/&quot;&gt;Cache-Control: immutable&lt;/a&gt; header as well as an expiration date a year from when the request was made.  This is made possible by the expedient of utilizing a cache &lt;a href=&quot;https://css-tricks.com/strategies-for-cache-busting-css/&quot;&gt;busting query string&lt;/a&gt; that contains the last modified date.  &lt;a href=&quot;https://tools.ietf.org/html/rfc7232#section-2.3&quot;&gt;Etag&lt;/a&gt; and &lt;a href=&quot;https://httpstatuses.com/304&quot;&gt;304&lt;/a&gt; responses are also supported.&lt;/p&gt;

&lt;p&gt;Offline support was added recently.  Updates made when offline are stored in an &lt;a href=&quot;https://www.w3.org/TR/IndexedDB-2/&quot;&gt;IndexDB&lt;/a&gt; and sent as a batch when the user returns online.  Having all of the code and data to render any page made this support very straightforward.&lt;/p&gt;

&lt;h3 id=&quot;performance-observations&quot;&gt;Performance observations (pre-optimization)&lt;/h3&gt;

&lt;p&gt;As mentioned at the top of this article, offline operations are virtually instantaneous.  Generally, immeasurably so.  As described above, this also applies to transitions between pages.&lt;/p&gt;

&lt;p&gt;This leaves the initial visit, and returning visits, the latter includes opening the application in new tabs.&lt;/p&gt;

&lt;p&gt;Best case response times for these cases is about a second.  This may be due to the way that server side rendering is done or perhaps due to the fact that each page is customized to the individual.  Improving on this is not a current priority, though the solution described later in this article addresses this.&lt;/p&gt;

&lt;p&gt;Worst case response times are when there are no active server processes and all caches (both server side and client side) are either empty or stale.  It is hard to get precise numbers for this, but it is on the order of eight to ten seconds.  Somewhere around four is the starting of the server.  Building the JSON form of the agenda can take another two given all of the validation (involving things like LDAP queries) involved in the process.  Regenerating the ES5 JavaScript from sources can take another second or so.  Producing the custom rendered HTML is another second.  And then there is all of the client side processing.&lt;/p&gt;

&lt;p&gt;In all, probably just under ten seconds if the server is otherwise idle.  It can be a little more if the server is under moderate to heavy load.&lt;/p&gt;

&lt;p&gt;The worst parts of this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No change is seen on the browser window until the last second or so.&lt;/li&gt;
&lt;li&gt;While the worst case scenario is comparatively rare in production, it virtually precisely matches what happens in development.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;selecting-approach&quot;&gt;Selecting an approach&lt;/h3&gt;

&lt;p&gt;Given that the application can be brought up quickly in an entirely offline mode, one possibility would be to show the last cached status and then request updated information and process that information when received.  This approach works well if the only change is to agenda data, but doesn't work so well in production whenever a script change is involved.&lt;/p&gt;

&lt;p&gt;This can be solved with a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Location/reload&quot;&gt;window.location.reload()&lt;/a&gt; call, which is described (and somewhat discouraged) as &lt;a href=&quot;https://redfin.engineering/how-to-fix-the-refresh-button-when-using-service-workers-a8e27af6df68#793f&quot;&gt;approach #2 in Dan Fabulic's &quot;How to Fix the Refresh Button When Using Service Workers&quot;&lt;/a&gt;.  Note the code below was written before Dan's page was published, but in any case, Dan accurately describes the issue.&lt;/p&gt;

&lt;p&gt;Taking some measurements on this produces interesting results.  What is needed to determine if a script or stylesheet has changed is a current inventory from the server.  This can consistently be provided quickly and is independent of the user requesting the data, so it can be cached.  But since the data size is small enough, caching (in the sense of HTTP 304 reponses) isn't all that helpful.&lt;/p&gt;

&lt;p&gt;Response time for this request in realistic network conditions when there is an available server process is around 200 milliseconds, and doesn't tend to vary very much.&lt;/p&gt;

&lt;p&gt;The good news is that this completely addresses the &quot;reload flash&quot; problem.&lt;/p&gt;

&lt;p&gt;Unfortunately, the key words here are &quot;available server process&quot; as that was the original problem to solve.&lt;/p&gt;

&lt;p&gt;Fortunately, a combination approach is possible:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Attempt to fetch the inventory page from the network, but give it a deadline that it should generally beat.  Say, 500 milliseconds or a half a second.&lt;/li&gt;
&lt;li&gt;If the deadline isn't met, load potentially stale data from the cache, and request newer data.  Once the network response is received (which had a 500 millisecond head start), determine if any scripts or stylesheets changed.  If not, we are done.&lt;/li&gt;
&lt;li&gt;Only if the deadline wasn't met AND there was a change to a stylesheet or more commonly a script, perform a reload; and figure out a way to address the poor user experience associated with a reload.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additional exploration lead to the solution where the inventory page mentioned below could be formatted in HTML and, in fact, be the equivalent to a blank agenda page.  Such a page would still be less than 2K bytes, and performance would be equivalent to loading a blank page and then navigating to the desired page, in other words, immeasurably fast.&lt;/p&gt;

&lt;h3 id=&quot;implementation&quot;&gt;Implementation&lt;/h3&gt;

&lt;p&gt;If you look at existing &lt;a href=&quot;https://serviceworke.rs/&quot;&gt;recipes&lt;/a&gt;, &lt;a href=&quot;https://serviceworke.rs/strategy-network-or-cache.html&quot;&gt;Network or Cache&lt;/a&gt; is pretty close; the problem is that it leaves the user with stale data if the network is slow.  It can be improved upon.&lt;/p&gt;

&lt;p&gt;Starting with the fetch from the network:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;code class=&quot;language-none&quot;&gt;  // attempt to fetch bootstrap.html from the network
  fetch(request).then(function(response) {
    // cache the response if OK, fulfill the response if not timed out
    if (response.ok) {
      cache.put(request, response.clone());

      // preload stylesheets and javascripts
      if (/bootstrap\.html$/.test(request.url)) {
        response.clone().text().then(function(text) {
          var toolate = !timeoutId;

          setTimeout(
            function() {
              preload(cache, request.url, text, toolate)
            },

            (toolate ? 0 : 3000)
          )
        })
      };

      if (timeoutId) {
        clearTimeout(timeoutId);
        resolve(response)
      }
    } else {
      // bad response: use cache instead
      replyFromCache(true)
    }
  }).catch(function(failure) {
    // no response: use cache instead
    replyFromCache(true)
  })&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code needs to be wrapped in a Promise that provides a &lt;code&gt;resolve&lt;/code&gt; function, and needs access to a &lt;code&gt;cache&lt;/code&gt; as well as a variable named &lt;code&gt;timeoutid&lt;/code&gt; and that determines whether or not the response has timed out.&lt;/p&gt;

&lt;p&gt;If the response is ok, it and will be cached and a &lt;code&gt;preload&lt;/code&gt; method will be called to load resources mentioned in the page.  That will either be done immediately if not &lt;code&gt;toolate&lt;/code&gt;, or after a short delay the timer expired to allow updates to be processed.  Finally, if such a response was received in time, the timer will be cleared, and the promise will be resolved.&lt;/p&gt;

&lt;p&gt;If either a bad response or no response was received (typically, this represents a network failure), the cache will be used instead.&lt;/p&gt;

&lt;p&gt;Next the logic to reply from the cache:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;code class=&quot;language-none&quot;&gt;  // common logic to reply from cache
  var replyFromCache = function(refetch) {
    return cache.match(request).then(function(response) {
      clearTimeout(timeoutId);

      if (response) {
        resolve(response);
        timeoutId = null
      } else if (refetch) {
        fetch(event.request).then(resolve, reject)
      }
    })
  };

  // respond from cache if the server isn't fast enough
  timeoutId = setTimeout(function() {replyFromCache(false)}, timeout);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code looks for a cache match, and if it finds one, it will &lt;code&gt;resolve&lt;/code&gt; the response, and clear the &lt;code&gt;timeoutId&lt;/code&gt; enabling the fetch code to detect if it was too late.&lt;/p&gt;

&lt;p&gt;If no response is found, the action taken will be determined by the &lt;code&gt;refetch&lt;/code&gt; argument.  The fetch logic above passes &lt;code&gt;true&lt;/code&gt; for this, and the timeout logic passes &lt;code&gt;false&lt;/code&gt;.  If true, it will retry the original request (which presumably will fail) and return that result to the user.  This is handling a &lt;em&gt;never should happen&lt;/em&gt; scenario where the cache doesn't contain the bootstrap page.&lt;/p&gt;

&lt;p&gt;The above two snippets of code are then wrapped by a function, providing the &lt;code&gt;event&lt;/code&gt;, &lt;code&gt;resolve&lt;/code&gt;, &lt;code&gt;reject&lt;/code&gt;, and &lt;code&gt;cache&lt;/code&gt; variables, as well as declaring and initializing the &lt;code&gt;timeoutId&lt;/code&gt; variable:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;code class=&quot;language-none&quot;&gt;// Return a bootstrap.html page within 0.5 seconds.  If the network responds
// in time, go with that response, otherwise respond with a cached version.
function bootstrap(event, request) {
  return new Promise(function(resolve, reject) {
    var timeoutId = null;

    caches.open(&quot;board/agenda&quot;).then(function(cache) {
        ...
    }
})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next, we need to implement the &lt;code&gt;preload&lt;/code&gt; function:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;code class=&quot;language-none&quot;&gt;// look for css and js files and in HTML response ensure that each are cached
function preload(cache, base, text, toolate) {
  var pattern = /&quot;[-.\w+/]+\.(css|js)\?\d+&quot;/g;
  var count = 0;
  var changed = false;

  while (match = pattern.exec(text)) {
    count++;
    var path = match[0].split(&quot;\&quot;&quot;)[1];
    var request = new Request(new URL(path, base));

    cache.match(request).then(function(response) {
      if (response) {
        count--
      } else {
        fetch(request).then(function(response) {
          if (response.ok) cacheReplace(cache, request, response);
          count--;
          if (count == 0 &amp;amp;&amp;amp; toolate) {
            clients.matchAll().then(function(clients) {
              clients.forEach(function(client) {
                client.postMessage({type: &quot;reload&quot;})
              })
            })
          }
        })
      }
    })
  }
};&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code parses the HTML response, looking for &lt;code&gt;.css&lt;/code&gt;, and &lt;code&gt;.js&lt;/code&gt; files, based on a knowledge as to how this particular server will format the HTML.  For each such entry in the HTML, the cache is searched for a match.  If one is found, nothing more needs to be done.  Otherwise, the resource is fetched and placed in the cache.&lt;/p&gt;

&lt;p&gt;Once all requests are processed, and if this involved requesting a response from the network, then a check is made to see if this was a late response, and if so, a &lt;code&gt;reload&lt;/code&gt; request is sent to all client windows.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cacheReplace&lt;/code&gt; is another application specific function:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;code class=&quot;language-none&quot;&gt;// insert or replace a response into the cache.  Delete other responses
// with the same path (ignoring the query string).
function cacheReplace(cache, request, response) {
  var path = request.url.split(&quot;?&quot;)[0];

  cache.keys().then(function(keys) {
    keys.forEach(function(key) {
      if (key.url.split(&quot;?&quot;)[0] == path &amp;amp;&amp;amp; key.url != path) {
        cache.delete(key).then(function() {})
      }
    })
  });

  cache.put(request, response)
};&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The purpose of this method is as stated: to delete from the cache other responses that differ only in the query string.  It also adds the response to the cache.&lt;/p&gt;

&lt;p&gt;The remainder is either straightforward or application specific in a way that has no performance relevance.  The scripts and stylesheets are served with a &lt;a href=&quot;https://jakearchibald.com/2014/offline-cookbook/#cache-falling-back-to-network&quot;&gt;cache falling back to network&lt;/a&gt; strategy.  The initial preloading which normally could be as simple as a call to &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Cache/addAll&quot;&gt;cache.addAll&lt;/a&gt; needs to be aware of query strings and for this application it turns out that a different bootstrap HTML file is needed for each meeting.&lt;/p&gt;

&lt;p&gt;Finally, here is the client side logic which handles reload messages from the service worker:&lt;/p&gt;

&lt;div&gt;&lt;pre&gt;&lt;code class=&quot;language-none&quot;&gt;navigator.serviceWorker.register(scope + &quot;sw.js&quot;, scope).then(function() {
  // watch for reload requests from the service worker
  navigator.serviceWorker.addEventListener(&quot;message&quot;, function(event) {
    if (event.data.type == &quot;reload&quot;) {
      // ignore reload request if any input or textarea element is visible
      var inputs = document.querySelectorAll(&quot;input, textarea&quot;);

      if (Math.max.apply(
        Math,

        Array.prototype.slice.call(inputs).map(function(element) {
          return element.offsetWidth
        })
      ) &amp;lt;= 0) window.location.reload()
    }
  });
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code watches for &lt;code&gt;type: &quot;reload&quot;&lt;/code&gt; messages from the service worker and invokes &lt;code&gt;window.location.reload()&lt;/code&gt; only if there are no input or text area elements visible, which is determined using the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth&quot;&gt;&lt;code&gt;offsetWidth&lt;/code&gt;&lt;/a&gt; property of each element.  Very few board agenda pages have visible input fields by default; many, however, have &lt;a href=&quot;https://getbootstrap.com/docs/4.0/components/modal/&quot;&gt;bootstrap modal dialog boxes&lt;/a&gt; containing forms.&lt;/p&gt;

&lt;h3 id=&quot;performance-results&quot;&gt;Performance Results&lt;/h3&gt;

&lt;p&gt;In production when using a browser that supports Service Workers, requests for the bootstrap page now typically range from 100 to 300 milliseconds, with the resulting page fully loaded in 400 to 600 milliseconds.  Generally, this includes the time it takes to fetch and render updated data, but in rare cases that may take up to an additional 200 milliseconds.&lt;/p&gt;

&lt;p&gt;In development, and in production when there are no server processes available and when accessed using a browser that supports Service Workers, the page initially loads in 700 to 1200 milliseconds.  It is not clear to me why this sees a greater range of response times; but in any case, this is still a notable improvement.  Often in development, and in rare cases in production, there may be a noticeable refresh that occurs one to five seconds later.&lt;/p&gt;

&lt;p&gt;Visitations by browsers that do not support service workers, and for that matter the first time a new user visits the board agenda tool, do not see any performance improvement or degradation with these changes.&lt;/p&gt;

&lt;p&gt;Not a bad result from less than 100 lines of code.&lt;/p&gt;</description>
	<pubDate>Wed, 06 Dec 2017 21:23:55 +0000</pubDate>
</item>
<item>
	<title>Isabel Drost: Trust and confidence</title>
	<guid isPermaLink="true">http://blog.isabel-drost-fromm.de/posts/trust-and-confidence.html</guid>
	<link>http://blog.isabel-drost-fromm.de/posts/trust-and-confidence.html</link>
	<description>One of the main principles at Apache (as in The Apache Software Foundation) is
&quot;Community over Code&quot; - having the goal to build projects that survive
single community members loosing interest or time to contribute.
&lt;br /&gt;&lt;br /&gt;
In his book &quot;Producing Open Source Software&quot; Karl Fogel describes this model of
development as &lt;a href=&quot;http://producingoss.com/en/producingoss.html#consensus-democracy&quot;&gt;Consensus-based
Democracy&lt;/a&gt; (in contrast to benevolent dictatorship):
&quot;Consensus simply means an agreement that everyone is willing to live with. It
is not an ambiguous state: a group has reached consensus on a given question
when someone proposes that consensus has been reached and no one contradicts the
assertion. The person proposing consensus should, of course, state specifically
what the consensus is, and what actions would be taken in consequence of it, if
those are not obvious.&quot;

&lt;br /&gt;&lt;br /&gt;
What that means is that not only one person can take decisions but pretty much
anyone can declare a final decision was made. It also means decisions can be 
stopped by individuals on the project.

&lt;br /&gt;&lt;br /&gt;
This model of development works well if what you want for your project is
resilience to people, in particular those high up in the ranks, leaving 
at the cost of nobody having complete control. It means you are moving slower,
at the benefit of getting more people on board and carrying on with your mission
after you leave.

&lt;br /&gt;&lt;br /&gt;
There are a couple implications to this goal: If for whatever reason one single
entity needs to retain control over the project, you better not enter the
incubator like &lt;a href=&quot;https://lists.apache.org/thread.html/14f2b7eee6d80fe1757249f17b20c869a0f0abaedc62bff31aef8603@%3Cdev.community.apache.org%3E&quot;&gt;suggested
here&lt;/a&gt;. Balancing control and longevity is particularly tricky if you or your
company believes they need to own the roadmap of the project. It's also tricky
if your intuitive reaction to hiring a new engineer is to give them
committership to the project on their first day - think again keeping in mind
that &lt;a href=&quot;http://producingoss.com/en/producingoss.html#money-vs-love&quot;&gt;Money
can't buy love&lt;/a&gt;. If you're still convinced they should be made committer,
Apache probably isn't the right place for your project.

&lt;br /&gt;&lt;br /&gt;
Once you go through the process of giving up control with the help from your
mentors you will learn to trust others - trust others to pick up tasks you leave
open, trust others they are taking the right decision even if you would have
done things otherwise, trust others to come up with solutions where you are
lost. Essentially like Sharan Foga said to &lt;a href=&quot;https://www.youtube.com/watch?v=n3Un8sTyszI&amp;amp;t=437s&quot;&gt;Trust the water&lt;/a&gt;.

&lt;br /&gt;&lt;br /&gt;
Even coming to the project at a later stage as an individual contributor you'll
go through the same learning experience: You'll learn to trust others with the
patch you wrote. You'll have to learn to trust others to take your bug report
seriously. If the project is well run, people will treat you as an equal peer,
with respect and with appreciation. They'll likely treat you as part of the
development team with as many decisions as possible - after all that's what
these people want to recruit you for: For a position as volunteer in their
project. Doing that means starting to &lt;a href=&quot;https://www.youtube.com/watch?v=h3MPewsk5PU&quot;&gt;Delegate like a Pro&lt;/a&gt; as
Deb Nicholson once explained at ApacheCon. It also means training your
capability for &lt;a href=&quot;https://www.youtube.com/watch?v=LgB1s3buccI&quot;&gt;Empathy&lt;/a&gt; like Leslie
Hawthorn explained at FOSDEM. It also means treating all contributions alike.

&lt;br /&gt;&lt;br /&gt;
There's one pre-requesite to all of this working out though: Working in the open
(as in &quot;will be crawled, indexed and made visible by the major search engine of
the day&quot;), giving control to others over your baby project and potentially over
what earns your daily living means you need a lot of trust not onnly in others
but also in yourself. If you're in a position where you're afraid that missteps
will have negative repercussions on your daily life you won't become comfortable
with all of that. For projects coming to the incubator as well as companies
paying contributors to become open source developers in their projects in my
personal view that's an important lesson: Unless committers already feel self
confident and independent enough of your organisation as well as the team they are part
of to take decisions on their own, you will run into trouble walking towards
at least Apache.</description>
	<pubDate>Wed, 06 Dec 2017 05:48:23 +0000</pubDate>
</item>
<item>
	<title>Ortwin Glück: [Code] Gentoo python-3.5 update woes</title>
	<guid isPermaLink="true">http://www.odi.ch/weblog/posting.php?posting=722</guid>
	<link>http://www.odi.ch/weblog/posting.php?posting=722</link>
	<description>Your latest emerge -uavD @world may result in the following error:
&lt;pre&gt;# required by sys-apps/portage-2.3.13-r1::gentoo[python_targets_python3_4,-build,python_targets_python2_7,-python_targets_python3_5]
# required by virtual/package-manager-0::gentoo
# required by @system
# required by @world (argument)
&amp;gt;=dev-python/pyblake2-0.9.3-r1 python_targets_python3_4&lt;/pre&gt;
That's because python-3.5 as well as python-3.6 and a new version of portage went stable, that in turn causes python USE flag changes and portage can't figure out correctly what to do.&lt;br /&gt;
&lt;br /&gt;
Solve this by manually installing python-3.5 (only) first and recompiling the resulting USE flag changes:&lt;br /&gt;
&lt;pre&gt;emerge -1av python:3.5
eselect python update
emerge -1avD --changed-use @world&lt;/pre&gt;
That should let you update world again and depclean will remove python-3.4 for you.
&lt;pre&gt;emerge -uavD @world
emerge --depclean&lt;/pre&gt;
&lt;br /&gt;
&lt;br type=&quot;_moz&quot; /&gt;</description>
	<pubDate>Tue, 05 Dec 2017 10:37:49 +0000</pubDate>
</item>
<item>
	<title>Aaron Morton: TLP Dashboards for Datadog users, out of the box.</title>
	<guid isPermaLink="true">http://thelastpickle.com/blog/2017/12/05/datadog-tlp-dashboards.html</guid>
	<link>http://thelastpickle.com/blog/2017/12/05/datadog-tlp-dashboards.html</link>
	<description>&lt;p&gt;We had the pleasure to release our monitoring dashboards designed for &lt;a href=&quot;https://cassandra.apache.org/&quot;&gt;Apache Cassandra&lt;/a&gt; on &lt;a href=&quot;https://www.datadoghq.com/&quot;&gt;Datadog&lt;/a&gt; last week. It is a nice occasion to share our thoughts around Cassandra Dashboards design as it is a recurrent question in the community.&lt;/p&gt;

&lt;p&gt;We wrote a post about this on the Datadog website &lt;a href=&quot;https://www.datadoghq.com/blog/tlp-cassandra-dashboards/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For people using Datadog we hope this will give more details on how the dashboards were designed, thus on how to use the dashboards we provided.
For others, we hope this information will be useful in the process of building and then using your own dashboards, with the technology of your choice.&lt;/p&gt;

&lt;h1 id=&quot;the-project&quot;&gt;The Project&lt;/h1&gt;

&lt;p&gt;Building an efficient, complete, and readable set of dashboards to monitor Apache Cassandra is time consuming and far from being straightforward.&lt;/p&gt;

&lt;p&gt;Those who tried it probably noticed it requires a fair amount of time and knowledge with both the monitoring technology in use (Datadog, Grafana, Graphite or InfluxDB, metrics-reporter, etc) and of Apache Cassandra. Creating dashboards is about picking the most relevant metrics, aggregations, units, chart type and then gather them in a way that this huge amount of data actually provides usable information. Dashboards need to be readable, understandable and easy to use for the final operator.&lt;/p&gt;

&lt;p&gt;On one hand, creating comprehensive dashboards is a long and complex task. On the other hand, every Apache Cassandra cluster can be monitored roughly the same way.
Most production issues can be detected and analyzed using a common set of charts, organized the same way, for all the Apache Cassandra clusters. Each cluster may require additional operator specific dashboards or charts depending on workload and merging of metrics outside of Cassandra, but those would supplement the standard dashboards, not replace them.
There are some differences depending on the Apache Cassandra versions in use, but they are relatively minor and not subject to rapid change.&lt;/p&gt;

&lt;p&gt;In my &lt;a href=&quot;https://www.youtube.com/watch?v=Q9AAR4UQzMk&quot;&gt;monitoring presentation&lt;/a&gt; at the 2016 Cassandra Summit I announced that we were working on this project.&lt;/p&gt;

&lt;p&gt;In December 2017 it was release for Datadog users. If you want to get started with these dashboards and you are using Datadog, see how to do this documentation on &lt;a href=&quot;https://docs.datadoghq.com/integrations/cassandra/&quot;&gt;Datadog integration&lt;/a&gt; for Cassandra.&lt;/p&gt;

&lt;h1 id=&quot;dashboard-design&quot;&gt;Dashboard Design&lt;/h1&gt;

&lt;h2 id=&quot;our-approach-to-monitoring&quot;&gt;Our Approach to Monitoring&lt;/h2&gt;

&lt;p&gt;The dashboards have been designed to allow the operator to do the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Easily detect any anomaly (Overview Dashboard)&lt;/li&gt;
  &lt;li&gt;Be able to efficiently troubleshoot and fix the anomaly (Themed Dashboards)&lt;/li&gt;
  &lt;li&gt;Find the bottlenecks and optimize the overall performance (Themed Dashboards)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 2 later points above can be seen as the same kind of operations which can be supported by the same set of dashboards.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Empowering the operator&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We strongly believe that showing the metrics to the operator can be a nice entry point for learning about Cassandra.
Each of the themed dashboards monitor a distinct internal processes of Cassandra. Most of the metrics related to this internal process are then grouped up within a Dashboard. We think it makes it easier for the operator to understand Cassandra’s internal processes.&lt;/p&gt;

&lt;p&gt;To make it clearer, let’s consider the example of someone completely new to Cassandra. On first repair, the operator starts an incremental repair without knowing anything about it and latencies increase substantially after a short while. Classic.&lt;/p&gt;

&lt;p&gt;The operator would notice a read latency in the ‘Overview Dashboard’, then aim at the ‘Read Path Dashboard’. There the operator would be able to notice that the number of SSTables went from 50 to 800 on each node, or for a table. If the chart is there out of the box, even if not knowing what an SSTable is the operator can understand something changed there and that it relates to the outage somehow. The operator would then search in the right direction, probably solving the issue quickly, and possibly learning in the process.&lt;/p&gt;

&lt;h2 id=&quot;what-to-monitor-dashboards-and-charts-detail&quot;&gt;What to Monitor: Dashboards and Charts Detail&lt;/h2&gt;

&lt;p&gt;Here we will be really focusing on charts details and indications on how to use each chart efficiently.  While this post is a discussion of dashboards available for DataDog, the metrics can be visualized using any tool, and we believe this would be a good starting point when setting up monitoring for Cassandra.&lt;/p&gt;

&lt;p&gt;In the graphs, the values and percentiles chosen are sometime quite arbitrary and often depend on the use case or Cassandra setup. The point is to give a reference, a starting point on what could be ‘normal’ or ‘wrong’ values. The &lt;a href=&quot;https://cassandra.apache.org/doc/latest/operating/metrics.html&quot;&gt;Apache Cassandra monitoring documentation&lt;/a&gt;, the mailing list archive, or #cassandra on #freenode (IRC) are good ways to answer questions that might pop while using dashboards.&lt;/p&gt;

&lt;p&gt;Some dashboards are voluntary duplicated across dashboards or within a dashboard, but with distinct visualisation or aggregation.&lt;/p&gt;

&lt;h2 id=&quot;detect-anomalies-overview-dashboard&quot;&gt;Detect anomalies: Overview Dashboard&lt;/h2&gt;

&lt;p&gt;We don’t try to troubleshoot at this stage. We want to detect outages that might impact the service or check that the Cassandra cluster is globally healthy. To accomplish this, this Overview Dashboard aims at both being complete and minimalist.&lt;/p&gt;

&lt;p&gt;Complete as we want to be warned anytime “something is happening“ in the Cassandra cluster.
Minimalist because we don’t want to miss an important information here because of the flood of non-critical or too low level informations. These charts aim answer the question: “Is Cassandra healthy?”.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;TLP Dashboards - Overview&quot; src=&quot;http://feeds.feedburner.com/files/tlp-dashboards/overview.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;troubleshoot-issues-and-optimize-apache-cassandra-themed-dashboards&quot;&gt;Troubleshoot issues and optimize Apache Cassandra: Themed dashboards&lt;/h2&gt;

&lt;p&gt;The goal here is to divide the information into smaller, more meaningful chunks. When having an issue, it will often only affect one of the subsystems of Cassandra, so the operator can have all the needed information in one place when working on a specific issue, without having irrelevant informations (for this specific issue) hiding more important information.&lt;/p&gt;

&lt;p&gt;For this reason these dashboards must maximize the information on a specific theme or internal process of Cassandra and show all the low level information (per table, per host). We are often repeating charts from other dashboards, so we always find the information we need as Cassandra users. This is the contrary to the overview dashboard needs mentioned above that just shows “high level” information.&lt;/p&gt;

&lt;h3 id=&quot;read-path-dashboard&quot;&gt;Read Path Dashboard&lt;/h3&gt;

&lt;p&gt;In this dashboard we are concerned about any element that could impact a high level client read. In fact, we want to know about everything that could affect the read path in Cassandra by just looking at this dashboard.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;TLP Dashboards - Read Path Dashboard&quot; src=&quot;http://feeds.feedburner.com/files/tlp-dashboards/read_path.png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;write-path-dashboard&quot;&gt;Write Path Dashboard&lt;/h3&gt;

&lt;p&gt;This dashboard focuses on a comprehensive view of the various metrics which affect write latency and throughput. Long garbage collection pause times will always result in dips in throughput and spikes in latency, so it is featured prominently on this dashboard.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;TLP Dashboards - Write Path Dashboard&quot; src=&quot;http://feeds.feedburner.com/files/tlp-dashboards/write_path.png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;sstable-management-dashboard&quot;&gt;SSTable management Dashboard&lt;/h3&gt;

&lt;p&gt;This dashboard is about getting a comprehensive view of the various metrics which impact the asynchronous steps the data goes through after a write, from the flush to the data deletion with all the compaction processes in between. Here we will be willing to be aware of disk space evolution and make sure asynchronous management of SSTables is happening efficiently or as expected.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;TLP Dashboards - SSTable Management Dashboard&quot; src=&quot;http://feeds.feedburner.com/files/tlp-dashboards/sstable_management.png&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;alerting-automated-anomaly-detection&quot;&gt;Alerting, Automated Anomaly Detection.&lt;/h1&gt;

&lt;p&gt;To conclude, when happy with monitoring dashboards, it is a good idea to add some alerting rules.&lt;/p&gt;

&lt;p&gt;It is important to detect all the anomalies as quickly as possible. To bring monitoring to the next level of efficiency, it is good to be warned automatically when something goes wrong.&lt;/p&gt;

&lt;p&gt;We believe adding alerts on each of the “Overview Dashboard” metrics will be sufficient to detect most issues and any major outage, or at least be a good starting point. For each metric, the alerting threshold should be high enough not to trigger false alerts to ensure a mitigating action can be taken. Some alerts should use absolute value (Disk space available, CPU, etc), while others will require relative values. Manually tuning some alerts will be required based on configuration and workload, such as alerting on the latencies.&lt;/p&gt;

&lt;p&gt;The biggest risk on alerting is probably to be flooded by false alerts as the natural inclination to start ignoring them, which leads to missing valid ones. As a global guideline, any alert should trigger an action, if it does not, this alert is relatively useless and adds noise.&lt;/p&gt;</description>
	<pubDate>Tue, 05 Dec 2017 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Jim Jagielski: The Path to Apache OpenOffice 4.2.0</title>
	<guid isPermaLink="true">http://jimjag.com/imo/index.php?/archives/272-The-Path-to-Apache-OpenOffice-4.2.0.html</guid>
	<link>http://jimjag.com/imo/index.php?/archives/272-The-Path-to-Apache-OpenOffice-4.2.0.html</link>
	<description>&lt;p&gt;It is no secret that, for awhile at least, Apache OpenOffice had lost its groove.&lt;/p&gt;

&lt;p&gt;Partly it was due to external issues. Mostly that the project and the committers were spending a &lt;em&gt;&lt;strong&gt;lot&lt;/strong&gt;&lt;/em&gt; of their time and energies battling and correcting the FUD associated around the project. Nary a week would go by without the common refrain &quot;&lt;em&gt;OpenOffice is Dead. Kill it already!&lt;/em&gt;&quot; and constant (clueless) rehashes of the history between OpenOffice and LibreOffice. With all that, it is easy and understandable to see why morale within the AOO community would have been low. Which would then reflect and affect development on the project itself.&lt;/p&gt;

&lt;p&gt;So more so than anything, what the project needed was a good ol' shot of adrenaline in the arm and some encouragement to keep the flame alive. Over the last few months this has succeeded beyond our dreams. After an admittedly way-too-long period, we finally &lt;a href=&quot;http://jimjag.com/imo/exit.php?url_id=720&amp;amp;entry_id=272&quot; title=&quot;https://blogs.apache.org/OOo/entry/announcing-apache-openoffice-4-1&quot;&gt;released AOO 4.1.4&lt;/a&gt;. And we are actively working on not only a 4.1.5 release but also preparing plans for our 4.2.0 release.&lt;/p&gt;

&lt;p&gt;And it's there that you can help.&lt;/p&gt;

&lt;p&gt;Part of what AOO really wants to be is a simple, easy-to-user, streamlined office suite for the largest population of people possible. This includes supporting old and long deprecated OSs. For example, our goal is to continue to support Apple OSX 10.7 (&lt;em&gt;Lion&lt;/em&gt;) with our 4.2.0 release. However, there is one platform which we are simply unsure about what to do, and how to handle it. And what makes it even more interesting is that it's our reference build system for AOO 4.1.x: CentOS5&lt;/p&gt;

&lt;p&gt;Starting with AOO 4.2.0, we are defaulting to GIO instead of Gnome VFS. The problem is that CentOS5 doesn't support GIO, which means that if we continue with CentOS5 as our reference build platform &lt;em&gt;&lt;strong&gt;for our community builds&lt;/strong&gt;&lt;/em&gt;, then all Linux users who use and depend on those community builds will be &quot;stuck&quot; with Gnome VFS instead of GIO. If instead we start using CentOS6 as our community build server. we leave CentOS5 users in a lurch (NOTE: CentOS5 users would still be able to &lt;strong&gt;build&lt;/strong&gt; AOO 4.2.0 on their own, it's just that the binaries that the AOO project supplies won't work). So we are looking at 3 options:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;We stick w/ CentOS5 as our ref build system for 4.2.0 but force Gnome VFS.&lt;/li&gt;
	&lt;li&gt;We move to CentOS6, accept the default of GIO but understand that this moves CentOS5 as a non-supported OS &lt;em&gt;&lt;strong&gt;for our community builds&lt;/strong&gt;&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;Just as we offer Linux 32 and 64bit builds, starting w/ 4.2.0 we offer CentOS5 community builds (w/ Gnome VFS) &lt;em&gt;&lt;strong&gt;IN ADDITION TO&lt;/strong&gt;&lt;/em&gt; CentOS6 builds (w/ GIO). (i.e.: 32bit-Gnome VFS, 64bit-Gnome VFS, 32bit-GIO, 64bit-GIO).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which one makes the most sense? Join the conversation and the discussion on the &lt;a href=&quot;http://jimjag.com/imo/exit.php?url_id=721&amp;amp;entry_id=272&quot; title=&quot;https://lists.apache.org/list.html?dev@openoffice.apache.org&quot;&gt;AOO dev mailing list&lt;/a&gt;!&lt;/p&gt;</description>
	<pubDate>Mon, 04 Dec 2017 12:57:45 +0000</pubDate>
</item>
<item>
	<title>Edward J. Yoon: AWS re:Invent 2017 참관기</title>
	<guid isPermaLink="true">http://feedproxy.google.com/~r/EdwardJYoonsBlog/~3/xxsJocTdNZ4/r-aws-2017.html</guid>
	<link>http://feedproxy.google.com/~r/EdwardJYoonsBlog/~3/xxsJocTdNZ4/r-aws-2017.html</link>
	<description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-lUbolFxeMFU/WiT6gNXAbUI/AAAAAAAAOMg/zVwH4mKJawcWuxQ0hxpxcuO0YhZTBGJPQCEwYBhgL/s1600/20171127_102548.jpg&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://3.bp.blogspot.com/-lUbolFxeMFU/WiT6gNXAbUI/AAAAAAAAOMg/zVwH4mKJawcWuxQ0hxpxcuO0YhZTBGJPQCEwYBhgL/s320/20171127_102548.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;바로 지난 주, 나와 클라우드플랫폼팀장 제임스 동행으로 여기어때 R&amp;amp;D센터에서 AWS 2017 행사를 참관했다. 덴버/샌프란시스코와는 전혀 다른 라스베가스 스트립의 좌우로 초대형 호텔과 카지노가 즐비한 풍경에 한번 놀랬고, Registration Booth 부터 그 큰 규모에서 두번 놀랬다. 참고로 라스베가스는 이렇게 사람이 많이 모일수 있는 환경을 가지고 있어 대형 세미나가 지속적으로 열린다고 한다 (CES도 동시에 개최된 걸로 안다). 4만 명이 넘는 참가자가 라스베가스 전역에 있는 호텔 행사장에 모였고, 우버 드라이버들은 AWS 컨퍼런스 왔냐고 자연스레 안부 인사를 묻더라. 뭐 이미 잘 알려져 있듯이 한국에 많은 기업이 AWS를 사용하고 있다. 나는 참고로 re:Play 행사에서 오다가다 과거 네이버 동료도 거의 10년만에 만나기도 하였다. :-)&lt;br /&gt;&lt;br /&gt;기술 세션들에 대한 리뷰는 모두 참석하지 못했기 때문에 내 눈이 정확하다 말할 순 없지만, 두 가지로 요약된다. Serverless 그리고 AI 다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Serverless는 프로그래밍 패러다임을 송두리째 바꾸고 있으며, 더 이상 풀스택 엔지니어, 그들의 인프라 노하우와 경험적 스킬은 (희박한 오픈소스 해커 수준 아니고서야) 대우받기 힘든 세상이 되었다.&lt;br /&gt;&lt;br /&gt;AI 분야도 마찬가지인데, 이미 학습능력이 클라우드 안으로 들어가기 시작했다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;넷플릭스의 데이터 엔지니어로 유명한 배재현님의 글도 읽어볼 필요가 있음  https://www.facebook.com/jaehb/posts/10214839335118339?pnref=story &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-cfU21jyyaqc/WiT6jG3ajJI/AAAAAAAAOMg/3d4InnozLT8ZBj8NAcpnI5RTa5JCQb9MACEwYBhgL/s1600/20171130_133220.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://2.bp.blogspot.com/-cfU21jyyaqc/WiT6jG3ajJI/AAAAAAAAOMg/3d4InnozLT8ZBj8NAcpnI5RTa5JCQb9MACEwYBhgL/s400/20171130_133220.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 내 눈에 들어온 슬라이드 한장 … 내가 가장 열성적으로 들었던 딥 러닝 서밋은 장장 4시간 연짱 세션이었고, 그중에 눈에 너무 꽃힌 장표 한장이 있으니 … 주로 내가 많이 얘기하던 내용과 비슷한 면이 있어 그럴수도 있는데, 사용자 경험은 OS에서 웹으로, 웹에서 모바일, 그리고 이제 AI로 넘어가는 과정이라고 볼 수 있다. 우리 IT 기술은 현재 어디에 머물고 있는가? :-)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-8nZgeHvs3Vk/WiT6lJE8GYI/AAAAAAAAOMo/3cNpqM59B5AXidNURyx74Hhn6-ZsIShygCEwYBhgL/s1600/20171201_102233.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://2.bp.blogspot.com/-8nZgeHvs3Vk/WiT6lJE8GYI/AAAAAAAAOMo/3cNpqM59B5AXidNURyx74Hhn6-ZsIShygCEwYBhgL/s320/20171201_102233.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 여러가지 생각들을 뒤로하고 귀국 바로 전 그랜드 캐년에 들러 광활한 세상을 느끼고 그렇게 한국에 돌아왔다 …&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/EdwardJYoonsBlog/~4/xxsJocTdNZ4&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 04 Dec 2017 08:03:08 +0000</pubDate>
</item>
<item>
	<title>Olivier Lamy: Relocating (again :-) )</title>
	<guid isPermaLink="true">http://feedproxy.google.com/~r/OlamyAtApacheDotOrg/~3/ym6jhjwq3IQ/relocating-again.html</guid>
	<link>http://feedproxy.google.com/~r/OlamyAtApacheDotOrg/~3/ym6jhjwq3IQ/relocating-again.html</link>
	<description>Long time I didn't post anything here... :-) &lt;br /&gt;So after 4.5yo with a very happy life @ Melbourne, we have decided to move further north.. &lt;br /&gt;Mid January we will start new adventures in Brisbane. Very exciting time for us (well kids a bit sad to leave friends but happy to try something different). &lt;br /&gt;Some have asking us why if you're happy here :-) &lt;br /&gt;Well a bit difficult to answer.... &lt;br /&gt;Maybe tired of the so famous Melbourne weather.... &lt;br /&gt;Yes the Brisbane weather looks so great: short pans and thongs all the year :-) &lt;br /&gt;Housing is ridiculous expensive @ Melbourne so time to stop paying the someone else mortgage &lt;br /&gt;After long time, it's maybe a good idea to leave the comfort zone and try something different.  &lt;br /&gt;&lt;br /&gt;Cya soon up north :-)   &lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/OlamyAtApacheDotOrg/~4/ym6jhjwq3IQ&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 01 Dec 2017 23:51:57 +0000</pubDate>
</item>
<item>
	<title>Ortwin Glück: [Code] pulseaudio: xmalloc.c: Assertion 'size &amp;lt; (1024*1024*96)' failed</title>
	<guid isPermaLink="true">http://www.odi.ch/weblog/posting.php?posting=721</guid>
	<link>http://www.odi.ch/weblog/posting.php?posting=721</link>
	<description>I noticed that Firefox was not playing any sound any more. Apparently pulseaudio stopped working. Manually running pa showed the following error:&lt;br /&gt;
&lt;br /&gt;
xmalloc.c: Assertion 'size &amp;lt; (1024*1024*96)' failed at /var/tmp/portage/media-sound/pulseaudio-10.0/work/pulseaudio-10.0/src/pulse/xmalloc.c:72, function pa_xmalloc0(). Aborting.&lt;br /&gt;
&lt;br /&gt;
This means it is trying to allocate a ridiculous amount of memory.&lt;br /&gt;
&lt;br /&gt;
Looking at the backtrace in gdb reveals:&lt;br /&gt;
&lt;pre&gt;(gdb) bt
#0  0x00007ffff6a5ef50 in raise () from /lib64/libc.so.6
#1  0x00007ffff6a60bfa in abort () from /lib64/libc.so.6
#2  0x00007ffff7914b32 in pa_xmalloc0 () from /usr/lib64/libpulse.so.0
#3  0x00007ffff7ba1db1 in pa_database_open () from /usr/lib64/pulseaudio/libpulsecore-10.0.so
#4  0x00007fffeed60468 in module_card_restore_LTX_pa__init () from /usr/lib64/pulse-10.0/modules/module-card-restore.so
#5  0x00007ffff7b5ac98 in pa_module_load () from /usr/lib64/pulseaudio/libpulsecore-10.0.so
#6  0x00007ffff7b49751 in ?? () from /usr/lib64/pulseaudio/libpulsecore-10.0.so
#7  0x00007ffff7b4fd2c in pa_cli_command_execute_line_stateful () from /usr/lib64/pulseaudio/libpulsecore-10.0.so
#8  0x00007ffff7b50551 in pa_cli_command_execute_file_stream () from /usr/lib64/pulseaudio/libpulsecore-10.0.so
#9  0x0000000000406e55 in main ()&lt;/pre&gt;
So it is trying to read some database. What database?&lt;br /&gt;
&lt;br /&gt;
strace tells us quickly:
&lt;pre&gt;open(&quot;/home/xoxo/.pulse/91b2f1e2678a89a9c38b83075061a39a-card-database.x86_64-pc-linux-gnu.simple&quot;, O_RDONLY|O_CLOEXEC) = 9&lt;/pre&gt;
So likely this thingy is corrupt. Solved this with:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;rm -rf .pulse&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br type=&quot;_moz&quot; /&gt;</description>
	<pubDate>Fri, 01 Dec 2017 14:05:45 +0000</pubDate>
</item>
<item>
	<title>Matt Raible: A Stressful, but Rewarding, Trip to Devoxx Belgium and Morocco</title>
	<guid isPermaLink="true">http://raibledesigns.com/rd/entry/a_stressful_but_rewarding_trip</guid>
	<link>http://raibledesigns.com/rd/entry/a_stressful_but_rewarding_trip</link>
	<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've ever seen. Secondly, its organizers are super awesome and challenge you to give great talks. Third, it was the &lt;a href=&quot;http://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;http://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'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 alt=&quot;;)&quot; class=&quot;smiley&quot; src=&quot;http://raibledesigns.com/images/smileys/wink.gif&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’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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Cloud Native PWAs with Josh Long at Devoxx Belgium&quot;&gt;&lt;img alt=&quot;Cloud Native PWAs with Josh Long at Devoxx Belgium&quot; class=&quot;picture&quot; src=&quot;https://farm5.staticflickr.com/4532/37700216965_c12dbbb856_q.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;
    We did our usual talk and I used Okta'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’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;margin: 0 auto;&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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;/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’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’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’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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Angular vs React Smackdown with Deepu&quot;&gt;&lt;img alt=&quot;Angular vs React Smackdown with Deepu&quot; src=&quot;https://farm5.staticflickr.com/4543/26811844159_1b82a326bf.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&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;margin: 0 auto;&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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’t super technical, and it was published to YouTube.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto;&quot;&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;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’s Choice Award trophy since he
    started the project.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto;&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p dir=&quot;ltr&quot; lang=&quot;en&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;— 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'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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Duke at the JHipster BOF&quot;&gt;&lt;img alt=&quot;Duke at the JHipster BOF&quot; src=&quot;https://farm5.staticflickr.com/4572/37700211975_2be2fc9bf4.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I thought our ratings (~4.2) for the two sessions were “good enough” 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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;The Devoxx Belgium Team&quot;&gt;&lt;img alt=&quot;The Devoxx Belgium Team&quot; src=&quot;https://farm5.staticflickr.com/4536/37700221155_9aa2e516d9.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Brugge&quot;&gt;&lt;img alt=&quot;Brugge&quot; src=&quot;https://farm5.staticflickr.com/4524/37700211025_17406959ff_q.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4524/24716006538_7acb95faa4_c.jpg&quot; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Brugge&quot;&gt;&lt;img alt=&quot;Brugge&quot; src=&quot;https://farm5.staticflickr.com/4524/24716006538_7acb95faa4_q.jpg&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4551/37700207885_d3b0c87135_c.jpg&quot; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Kwak in Brugge&quot;&gt;&lt;img alt=&quot;Kwak in Brugge&quot; src=&quot;https://farm5.staticflickr.com/4551/37700207885_d3b0c87135_q.jpg&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot; width=&quot;150&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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Brugge by night&quot;&gt;&lt;img alt=&quot;Brugge by night&quot; src=&quot;https://farm5.staticflickr.com/4521/24716004808_d9c6eb8986_m.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4580/37700206205_fab269d774_c.jpg&quot; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;The streets of Brugge&quot;&gt;&lt;img alt=&quot;The streets of Brugge&quot; src=&quot;https://farm5.staticflickr.com/4580/37700206205_fab269d774_m.jpg&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot; width=&quot;240&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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Life is good in Bruges, and it just got a little bit better.&quot;&gt;&lt;img alt=&quot;Life is good in Bruges, and it just got a little bit better.&quot; src=&quot;https://farm5.staticflickr.com/4568/24716003048_8af41b6f48_z.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;480&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’s where the (self-inflicted) drama began. Here’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’t figure out why what worked last week didn’t work this week.&lt;/li&gt;
    &lt;li&gt;Discovered Ionic “super” 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’t work, because JHipster implementation uses cookies, and Cordova’s web view won’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’t get it to work in iOS emulator because CORS.&lt;/li&gt;
    &lt;li&gt;Found bugs about CORS doesn’t work over http. Spent hours trying to make it work over https. Couldn’t get a local certificate to be trusted, couldn’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’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;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;margin: 0 auto;&quot;&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 “I should come” 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’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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Devoxx Morocco Keynote&quot;&gt;&lt;img alt=&quot;Devoxx Morocco Keynote&quot; src=&quot;https://farm5.staticflickr.com/4537/26811841789_85bc9ea4a8_m.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;
    &lt;a href=&quot;https://farm5.staticflickr.com/4545/37700212615_a544f02282_c.jpg&quot; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Devoxx Morocco Keynote&quot;&gt;&lt;img alt=&quot;Devoxx Morocco Keynote&quot; src=&quot;https://farm5.staticflickr.com/4545/37700212615_a544f02282_m.jpg&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot; width=&quot;240&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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Devoxx Champion!&quot;&gt;&lt;img alt=&quot;Devoxx Champion!&quot; src=&quot;https://farm5.staticflickr.com/4562/37700212995_9b7bf52f74.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&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; rel=&quot;lightbox[devoxx2017]&quot; title=&quot;Devoxx Champions!&quot;&gt;&lt;img alt=&quot;Devoxx Champions!&quot; src=&quot;https://farm5.staticflickr.com/4528/26811841249_2cf6c7ab1b.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&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’ll require some polishing before they’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't over! I'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'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>
	<pubDate>Mon, 27 Nov 2017 19:23:21 +0000</pubDate>
</item>
<item>
	<title>Stefan Bodewig: Slides of My Talk at FOSS Backstage Micro-Summit</title>
	<guid isPermaLink="true">https://stefan.samaflost.de/blog/en/Apache/Ant/slides_foss_backstage_talk.html</guid>
	<link>https://stefan.samaflost.de/blog/en/Apache/Ant/slides_foss_backstage_talk.html</link>
	<description>&lt;p&gt;Last Monday I atended the &lt;a href=&quot;http://fossbackstage.de&quot;&gt;FOSS
Backstage Micro-Summit&lt;/a&gt; and enjoyed it at a lot. I haven't been to
ApacheCons for quite some time and it was good to see familiar faces
and get to know so many new folks.&lt;/p&gt;

&lt;p&gt;The slides of my talk are on &lt;a href=&quot;https://speakerdeck.com/stefanbodewig/apache-ant-comunity-learnings&quot;&gt;Speaker
Deck&lt;/a&gt; but I'm afraid they aren't that useful without the things I
actually said.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update 2017-12-01:&lt;/b&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=YI9K8mkb8Ik&quot;&gt;video&lt;/a&gt; of the
talk without the Q&amp;amp;A session that followed it.&lt;/p&gt;</description>
	<pubDate>Fri, 24 Nov 2017 16:05:07 +0000</pubDate>
</item>
<item>
	<title>Danny Angus: Note to Self: How to open the react-native debug menu without the rage-shake</title>
	<guid isPermaLink="true">http://feedproxy.google.com/~r/killerbees/planetapache/~3/zCUFgpCKnww/note-to-self-how-to-open-react-native.html</guid>
	<link>http://feedproxy.google.com/~r/killerbees/planetapache/~3/zCUFgpCKnww/note-to-self-how-to-open-react-native.html</link>
	<description>I've been playing around with &lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;react-native&lt;/a&gt; for a week or so, and I'm liking it.&lt;br /&gt;If you don't know what it is, its basically a toolkit for building mobile apps with, one that makes it easy to achieve good looking apps that integrate with your phone without you having to learn low-level details about how phones work (yay for that!).&lt;br /&gt;One of the great things is that, with Android at least, you can use your own favourite editing tools and the Android SDK and react-native will build your app, install it on your phone, start it running, and attach a debugger to the app and the developer tools in your web browser.&lt;br /&gt;All from one simple command:&lt;br /&gt;&lt;div style=&quot;background: #202020; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;react-native run-android&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;It even has a hot-patch and automatic re-load ability so that the running app updates as you edit your source files.&lt;br /&gt;But one thing has been bugging me like mad, though, there is a &quot;secret&quot; menu of developer options installed in the app, including an option to force a reload, but it requires a &quot;rage-shake&quot; to wake it on the phone.&lt;br /&gt;&lt;i&gt;Or should I say it did.. &lt;/i&gt;because if you have your phone tethered with a USB to the Android Debug Bridge (adb) you can issue a keypress signal over adb and bind that to a menu or a keyboard shortcut in your computer. Yes, indeed, open a menu on the phone screen with a press of a key in your editor! All you have to do is to bind this command to a shortcut or key binding, and &lt;a href=&quot;https://www.youtube.com/watch?v=RkhDSOq1ZwQ&quot;&gt;Bob's your uncle.&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background: #202020; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adb shell input keyevent 82 &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/killerbees/planetapache/~4/zCUFgpCKnww&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 23 Nov 2017 13:40:41 +0000</pubDate>
</item>
<item>
	<title>Bertrand Delacretaz: Status meetings are a waste of time and money</title>
	<guid isPermaLink="true">https://grep.codeconsult.ch/2017/11/23/status-meetings-are-a-waste-of-time-and-money/</guid>
	<link>https://grep.codeconsult.ch/2017/11/23/status-meetings-are-a-waste-of-time-and-money/</link>
	<description>&lt;p&gt;Last Monday I presented on &lt;a href=&quot;https://www.slideshare.net/bdelacretaz/asynchronous-decision-making-foss-backstage-2017&quot;&gt;Asynchronous Decision Making&lt;/a&gt; at the (excellent) &lt;a href=&quot;https://foss-backstage.de/&quot;&gt;FOSS Backstage&lt;/a&gt; Micro Summit in Berlin and there were some questions about me saying that status meetings are a waste of time.&lt;/p&gt;
&lt;p&gt;My opinion on status meetings hasn’t changed in a long time and I’m very happy to see Jason Fried loudly confirm it in his &lt;em&gt;&lt;a href=&quot;https://m.signalvnoise.com/status-meetings-are-the-scourge-39f49267ca90&quot;&gt;status meetings are the scourge&lt;/a&gt;&lt;/em&gt; post. &lt;/p&gt;
&lt;p&gt;Quoting him:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;How would you feel if you had to regularly expense $1200 so you could “tell a few teammates something”. Think that would go over well?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If your team shape allows you to run status meetings, you should first reflect on their actual cost. And if you still want to run them after that I suggest:&lt;/p&gt;
&lt;p&gt;a) Requiring people to briefly report their status in writing before the meeting, asynchronously&lt;/p&gt;
&lt;p&gt;b) Requiring people to read other people’s status before the meeting, asynchronously&lt;/p&gt;
&lt;p&gt;c) Choosing a maximum of 3 items to discuss in your meeting,&lt;br /&gt;
based on those reports, and timebox those topics during the meeting&lt;/p&gt;
&lt;p&gt;d) If you don’t get enough items to deserve interrupting your whole team &lt;em&gt;right now&lt;/em&gt;: cancel that meeting! Or maybe limit it to managers to avoid &lt;a href=&quot;http://www.paulgraham.com/makersschedule.html&quot;&gt;interrupting the Makers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That’s just the essentials, Jason Fried has more detailed suggestions in a similar spirit, make sure to read his post!&lt;/p&gt;
&lt;p&gt;I like the 3P format for brief written status reports: &lt;/p&gt;
&lt;p&gt;– Progress: what concrete, measurable progress has been made since last report&lt;/p&gt;
&lt;p&gt;– Problems: what’s blocking you from progressing&lt;/p&gt;
&lt;p&gt;– Perspectives: what are your plans for the next period&lt;/p&gt;
&lt;p&gt;If this post (and Jason’s) help you save tons of money by eliminating useless meetings, feel free to make a donation to a good cause ;-)&lt;/p&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1643/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1643/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://pixel.wp.com/b.gif?host=grep.codeconsult.ch&amp;amp;blog=2844102&amp;amp;post=1643&amp;amp;subd=bdelacretaz&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 23 Nov 2017 12:54:04 +0000</pubDate>
</item>
<item>
	<title>Steve Loughran: How to play with the new S3A committers</title>
	<guid isPermaLink="true">http://steveloughran.blogspot.com/2017/11/how-to-play-with-new-s3a-committers.html</guid>
	<link>http://steveloughran.blogspot.com/2017/11/how-to-play-with-new-s3a-committers.html</link>
	<description>&lt;a href=&quot;https://www.flickr.com/photos/steve_l/10490359744/in/album-72157636963150965/&quot; title=&quot;Untitled&quot;&gt;&lt;img alt=&quot;Untitled&quot; height=&quot;333&quot; src=&quot;https://farm6.staticflickr.com/5516/10490359744_2110f51b66.jpg&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Following up from yesterday's &lt;a href=&quot;http://steveloughran.blogspot.co.uk/2017/11/subatomic.html&quot;&gt;post on the S3A committers&lt;/a&gt;, here's what you need for picking up the committers.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/apache/hadoop&quot;&gt;Apache Hadoop trunk&lt;/a&gt;; builds to 3.1.0-SNAPSHOT:  &lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/committers.md&quot;&gt;documentation on use&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;An AWS keypair, try not to commit them to git. Tip for the Uber team: &lt;a href=&quot;https://github.com/awslabs/git-secrets&quot;&gt;git-secrets &lt;/a&gt;is something you can add as a checkin hook. Do as I do: &lt;a href=&quot;http://steveloughran.blogspot.co.uk/2016/04/testing-against-s3-and-object-stores.html&quot;&gt;keep them elsewhere&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;If you want to use the magic committer; &lt;a href=&quot;https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3guard.md&quot;&gt;turn S3Guard on&lt;/a&gt;. Initially I'd use the staging committer, specificially the &quot;directory&quot; on. &lt;/li&gt;&lt;li&gt;switch s3a:// to use that committer: fs.s3a.committer.name =  partitioned&lt;/li&gt;&lt;li&gt;Run your MR queries&lt;/li&gt;&lt;li&gt;look in _SUCCESS for committer info. 0-bytes long: classic FileOutputCommitter. Bit of JSON naming committer, files committed and some metrics (&lt;a href=&quot;https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/files/SuccessData.java&quot;&gt;SuccessData&lt;/a&gt;) and you are using an S3 committer.&lt;/li&gt;&lt;/ol&gt;If you do that: I'd like to see the numbers comparing FileOutputCommitter (which must have S3Guard) and the new committers. For benchmark consistency, leave S3Guard on.&lt;br /&gt;&lt;br /&gt;If you can't get things to work because the docs are wrong: file a JIRA with a patch. If the code is wrong: submit a patch with the fix &amp;amp; tests. &lt;br /&gt;&lt;br /&gt;Spark?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/apache/spark&quot;&gt;Spark Master&lt;/a&gt; has a couple of patches to deal with integration issues (&lt;a href=&quot;https://issues.apache.org/jira/browse/SPARK-21762&quot;&gt;FNFE on magic output paths&lt;/a&gt;, Parquet being &lt;a href=&quot;https://issues.apache.org/jira/browse/SPARK-22217&quot;&gt;over-fussy about committers&lt;/a&gt;, I think the committer binding has enough workarounds for these to work with Spark 2.2 though.&lt;/li&gt;&lt;li&gt;Checkout my &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/&quot;&gt;cloud-integration for Apache Spark&lt;/a&gt; repo, and its production-time redistributable, &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/tree/master/spark-cloud-integration&quot;&gt;spark-cloud-integration&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Read &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/blob/master/spark-cloud-integration/src/main/site/markdown/index.md&quot;&gt;its docs&lt;/a&gt; and use&lt;/li&gt;&lt;li&gt;If you want to use Parquet over other formats, &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/blob/master/spark-cloud-integration/src/main/scala/com/hortonworks/spark/cloud/commit/BindingParquetOutputCommitter.scala&quot;&gt;use this committer&lt;/a&gt;.  &lt;/li&gt;&lt;li&gt;Again,. check _SUCCESS to see what's going on. &lt;/li&gt;&lt;li&gt;There's &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/tree/master/cloud-examples&quot;&gt;a test module&lt;/a&gt; with various (scaleable) tests as well as a copy and paste of some of the Spark SQL test.&lt;/li&gt;&lt;li&gt;Spark can work with the Partitioned committer. This is a staging committer which only worries about file conflicts in the final partitions. This lets you do in-situ updates of existing datasets, adding new partitions or overwriting existing ones, while leaving the rest alone. Hence: no need to move the output of a job into the reference datasets. &lt;/li&gt;&lt;li&gt;Problems. &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/issues&quot;&gt;File an issue&lt;/a&gt;. I've just seen Ewan has a couple of PRs I'd better look at, actually.&lt;/li&gt;&lt;/ol&gt;Committer-wise, that spark-cloud-integration module is ultimately transient. I think we can identify those remaining issues with committer setup in spark core, after which a hadoop 3.0+ specific module should be able to work out the box with the new committers.&lt;br /&gt;&lt;br /&gt;There's still other things there, like&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cloud store optimised &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/blob/master/spark-cloud-integration/src/main/scala/org/apache/spark/streaming/hortonworks/CloudInputDStream.scala&quot;&gt;file input stream source&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/blob/master/spark-cloud-integration/src/main/scala/org/apache/spark/hortonworks/ParallelizedWithLocalityRDD.scala&quot;&gt;ParallizedWithLocalityRDD&lt;/a&gt;: and RDD which lets you provide custom functions to declare locality on a row-by-row basis. Used in my demo of implementing &lt;a href=&quot;https://github.com/hortonworks-spark/cloud-integration/blob/master/spark-cloud-integration/src/main/scala/com/hortonworks/spark/cloud/applications/CloudCp.scala&quot;&gt;DistCp in Spar&lt;/a&gt;k. Every row is a filename, which gets pushed out to a worker close to the data, it does the upload. This is very much a subset of distCP, but it shows this: you can have with with RDDs and cloud storage. &lt;/li&gt;&lt;li&gt;+ all the tests &lt;/li&gt;&lt;/ul&gt;I think maybe Apache Bahir would be the ultimate home for this. For now, a bit too unstable.&lt;br /&gt;&lt;br /&gt;(photo: spices on sale in a Mombasa market)</description>
	<pubDate>Thu, 23 Nov 2017 11:18:08 +0000</pubDate>
</item>
<item>
	<title>Claus Ibsen: Camel in Action 2nd edition - First layout done for print book chapters</title>
	<guid isPermaLink="true">http://feedproxy.google.com/~r/ApacheCamel/~3/J06WvM3vP-A/camel-in-action-2nd-edition-first.html</guid>
	<link>http://feedproxy.google.com/~r/ApacheCamel/~3/J06WvM3vP-A/camel-in-action-2nd-edition-first.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;I just wanted to capture a blog with the news that the &lt;a href=&quot;https://www.manning.com/books/camel-in-action-second-edition&quot; target=&quot;_blank&quot;&gt;Camel in Action 2nd edition&lt;/a&gt; book, first 19 chapters and 2 appendixes (the content for the print book) now has passed the 1st layout phase.&lt;br /&gt;&lt;br /&gt;I took a screendump of the last page of chapter 19, which has the page count of 822. That means you get 822 pages of extensive details about Apache Camel in a single book.&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-E3yBnNxbmaU/WhaSAbIbwuI/AAAAAAAABfc/85cEHSk2eFkc4OybzdUB3-nISRWZZukVQCLcBGAs/s1600/822.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://4.bp.blogspot.com/-E3yBnNxbmaU/WhaSAbIbwuI/AAAAAAAABfc/85cEHSk2eFkc4OybzdUB3-nISRWZZukVQCLcBGAs/s400/822.png&quot; width=&quot;317&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Last page of chapter 19 with page count 822&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;At this moment Jonathan and myself are doing our author reviews on every single page of the those 822 pages to ensure code formatting, figures, technical errors, adding minor TIPs about upcoming/very latest Camel change, updating to Camel 2.20.1 release, updating screenshots in high-res resolution etc. All together to make sure you get the latest information in your hands, and that we have done our best all the way. I currently need to review chapter 18, 19 and 1 which is the outstanding, then I have read every single chapter from cover-to-cover for the N'th million time.&lt;br /&gt;&lt;br /&gt;There is more content as we have 2 bonus chapters that will follow layout phase as well and made freely available on the &lt;a href=&quot;https://www.manning.com/books/camel-in-action-second-edition&quot; target=&quot;_blank&quot;&gt;book's website&lt;/a&gt; when the book is finished.&lt;br /&gt;&lt;br /&gt;So we are on track to finish the book before x-mas, just in time for you to ask your significant other to buy you the best present ever to put under the tree ;)&lt;br /&gt;&lt;br /&gt;Also we appreciate if you consider following the advice that we put at the end of the last page (see screenshot) on chapter 19.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=J06WvM3vP-A:4YNBmcsJbVc:yIl2AUoC8zA&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?d=yIl2AUoC8zA&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=J06WvM3vP-A:4YNBmcsJbVc:4cEx4HpKnUU&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?i=J06WvM3vP-A:4YNBmcsJbVc:4cEx4HpKnUU&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=J06WvM3vP-A:4YNBmcsJbVc:F7zBnMyn0Lo&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?i=J06WvM3vP-A:4YNBmcsJbVc:F7zBnMyn0Lo&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?a=J06WvM3vP-A:4YNBmcsJbVc:V_sGLiPBpWU&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://feeds.feedburner.com/~ff/ApacheCamel?i=J06WvM3vP-A:4YNBmcsJbVc:V_sGLiPBpWU&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/ApacheCamel/~4/J06WvM3vP-A&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 23 Nov 2017 09:23:48 +0000</pubDate>
</item>
<item>
	<title>Matt Raible: Goodbye, Sir Jake</title>
	<guid isPermaLink="true">http://raibledesigns.com/rd/entry/goodbye_sir_jake</guid>
	<link>http://raibledesigns.com/rd/entry/goodbye_sir_jake</link>
	<description>&lt;p&gt;Jake was a border collie that came into my life when I met Trish. In fact, I met him on our first date. After dinner, Trish and I wandered back to her place and took her dogs for a walk in Wash Park. She had two: Sagan (the crazy one) and Jake (stoner dog). Jake wasn't a purebred border collie, but he was one of those perfect dogs. He slept a lot, liked to lay in the sunshine, and was always happy to harass Sagan and giggle while doing it when we went on walks.
&lt;/p&gt;
&lt;p&gt;A few years ago, when I was only working 20 hours per week, I grew to appreciate our dogs more than ever. I'd take them on walks, hikes, and runs almost every afternoon. I learned that living my life like my dogs wanted me to live it was a great thing. Long walks, relaxing in the sun, smiling from ear to ear when a family member comes home.
&lt;/p&gt;
&lt;p&gt;A few weeks ago, I took both our dogs on a run and Jake was not feeling well. He certainly didn't want to run, and he could barely keep up even when we walked. Trish took him in for some tests, and we discovered his blood cells were under attack. Trish rushed him to &lt;a href=&quot;http://csu-cvmbs.colostate.edu/Pages/default.aspx&quot;&gt;CSU's Veterinary Hospital&lt;/a&gt; for a blood transfusion. That helped, but we discovered a few days later that his bones were no longer producing red blood cells. Another blood transfusion, a bunch of prescription drugs, and he was back in action. He seemed to be doing great. We drove to Montana last week to visit my parents and brought him with us.
&lt;/p&gt;
&lt;p&gt;Last Friday, Jake could only walk on three legs. Yesterday, he was down to two. Trish took him in, and his doctor said his liver was failing. Since he was an older dog and lived a great life, we chose not continue keeping him alive. He was put to sleep yesterday afternoon at Aurora Animal Hospital. They allowed him to lay in the grass, in the sunshine, while they carried out the procedure.
&lt;/p&gt;
&lt;p&gt;I'm happy to have known you, Jake. You were a great dog, and I learned a lot from you. Sleep well, buddy. &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;https://farm5.staticflickr.com/4557/38144584016_de6c8c5b76_b.jpg&quot; rel=&quot;lightbox[goodbyejake]&quot; title=&quot;Jake and Jack&quot;&gt;&lt;img alt=&quot;Jake and Jack&quot; src=&quot;https://farm5.staticflickr.com/4557/38144584016_de6c8c5b76.jpg&quot; style=&quot;border: 1px solid black;&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</description>
	<pubDate>Tue, 21 Nov 2017 12:55:25 +0000</pubDate>
</item>
<item>
	<title>Nick Kew: Monteverdi Vespers</title>
	<guid isPermaLink="true">https://bahumbug.wordpress.com/2017/11/20/monteverdi-vespers/</guid>
	<link>https://bahumbug.wordpress.com/2017/11/20/monteverdi-vespers/</link>
	<description>&lt;p&gt;Our next concert is the Monteverdi Vespers, on Nov. 26th at the Guildhall, Plymouth.  This work, untypical of its own time as well as our own, makes an interesting change from our usual repertoire.  Simple individual lines and harmonies rooted firmly in renaissance polyphony, yet with complex (and sometimes fiendish to hold) interweaving textures, and a level of both vocal and orchestral flourishes and ornamentation that makes it arguably the first major work of the Baroque era.&lt;/p&gt;
&lt;p&gt;I’m glad to be singing it, and I think it’ll be a good evening out for those in or near Plymouth.  Hope to see some of my readers there!&lt;/p&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bahumbug.wordpress.com/4897/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bahumbug.wordpress.com/4897/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://pixel.wp.com/b.gif?host=bahumbug.wordpress.com&amp;amp;blog=471959&amp;amp;post=4897&amp;amp;subd=bahumbug&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 20 Nov 2017 22:25:12 +0000</pubDate>
</item>

</channel>
</rss>
