AdoptOS

Assistance with Open Source adoption

Open Source News
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.
  • warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/mykidsin/public_adoptos_html/includes/unicode.inc on line 349.

Liferay ThemeDisplay in Angular apps

Liferay - Wed, 01/16/2019 - 15:48

For a recent project, we developed an Angular application that uses Liferay DXP as the back end. In this Angular application we regularly make requests into the Portal back end for User information, Journal Articles, ... Mostly this works great as we have defined several custom REST end points in DXP from which we can make use of the Liferay services and other nifty Liferay stuff.

However at one point we encountered an issue where one of our end points did not return the expected Journal Articles. In fact it even threw an exception underneath.

After some short investigation we determined that the Audience Targeting rules were not being applied properly to the Journal Articles. The actual cause is that several Audience Targeting rules make use of the Liferay ThemeDisplay object. You probably know that this is one of the standard Liferay objects available in each portlet request as an attribute under the logical name themeDisplay. And that it can be retrieved by using following code:

request.getAttribute(WebKeys.THEME_DISPLAY); What seems to be the officer, problem?

As I have mentioned we make use of  REST end points and thus not of portlet requests. These REST requests are made from our Angular front end to custom end points in a Liferay environment, so called Controllers. Below is an example to retrieve some news articles. The first block of code is taken from our Angular service that makes the request. The second block of code is from the Java Controller which will respond to the request and returns news articles.

public findNewsArticles(limit?: number): Observable<Response<Array<NewsArticle>>> { const params = this.createHttpParams(limit); const url = this.articlesUrl(); return this.http.get<Response<Array<NewsArticle>>>(url, {params: params}); } @GET @Path("/group/{groupId}/articles") @Produces(MediaType.APPLICATION_JSON) public Response getNewsArticles(final @Context HttpServletRequest request, final @Context HttpServletResponse response, @PathParam("groupId") final long groupId, @QueryParam("limit") final long limit) throws Exception { long aLimit = limit == 0 ? Long.MAX_VALUE : limit; User user = portal.getUser(request); List<UserSegment> userSegments = userSegmentService.getUserSegments(groupId, request, response); return newsService.findByUser(user, groupId, aLimit, userSegments) .map(this::successResponse) .orElseGet(this::notFoundResponse); }

The problem which we encountered is that these REST requests don't carry a ThemeDisplay object. Because of this the list of userSegments in above example is not correctly constructed as the rules can't properly determine whether or not a user belongs to a certain segment.

So some way or another we needed to be able to pass the ThemeDisplay object from the front end to the back end through the custom REST requests. We contacted Liferay support using a LESA ticket to get this straightened out. With their help it became clear we needed to add the ThemeDisplay object manually to the REST request. Following the standard Liferay JSON WS documentation, it should be possible as follows:

Liferay.Service( '/api/jsonws/journal.journalarticle/get-article-content', { groupId: 20126, articleId: '40809', languageId: 'en_US', themeDisplay: { locale: "en_US" } }, function(obj) { console.log(obj); } ); In code we trust

As is mostly the case when in doubt with how to achieve something in Liferay: turn yourself towards the source code!
In the default Liferay JSON WS the ThemeDisplay object is actually passed as a form parameter from the front end to the back end. This also requisites that the request is actually a POST request. In the back end there are subsequent servlet filters that operate on these requests. One of these filters transforms the themeDisplay JSON string into a Java object and adds it as a request attribute.

So it became clear to us that we also needed to make adjustment in both ends.

Front end

Of course there are several ways to pass the ThemeDisplay object from the front end. To prevent much changes to our existing code base and because it is a fast & easy manner, we chose to pass the ThemeDisplay object as a header in the REST requests. This is very convenient because we can now add a plain JavaScript object, just as in the Liferay JSON WS examples. So we only need to construct a JSON string with all the necessary fields and their values.

Here be dragons
You can make use of the Liferay.ThemeDisplay object which Liferay provides, if you are still in a Liferay environment. However you cannot use this object itself als the value. It consists of functions and if those are parsed to a string, they just become null. But you can make use of the Liferay.ThemeDisplay object to populate your own object. You will see this in the following examples.

To limit to duplication of code we also made use of an Interceptor. This is an Angular component that will inspect every HTTP request and potentially transform it. As the ThemeDisplay object isn't required for each and every request but solely to those where it's actually necessary for our implementation, we added a small url validation. So in our Angular app we added below themedisplay.interceptor.ts component: @Injectable() export class ThemeDisplayInterceptor implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { if (this.matchingUrl(req)) { const modified = req.clone({setHeaders: { 'themeDisplay': `{"languageId": "` + Liferay.ThemeDisplay.getLanguageId() + `"}` } }); return next.handle(modified); } return next.handle(req); } private matchingUrl(req: HttpRequest<any>) { return req.method == 'GET' && req.url.match('\/o\/acanews' + '|\/o\/acatasks' + '|\/o\/acafaqs' + '|\/o\/acabanners' ); } } Back end When the ThemeDisplay is passed as a string as in above example, it enters the back end as a header on the HttpServletRequest. So here are two issues to solve:

  1. the ThemeDisplay object is not yet in the Liferay essential location
  2. the object is of type String
Thankfully this can be resolved without much effort. Get the String header from the request, convert it to a ThemeDisplay object and add it back to the request under the correct attribute. The conversion seems to be the most complex issue. But thankfully Liferay as a lot of useful utilities and in this case it would be the JSONFactoryUtil. Using this utility you can easily transform a JSON String to a certain typed object. Below method executes all these actions at once: private void convertThemeDisplay(HttpServletRequest request) { String themeDisplay = request.getHeader(THEME_DISPLAY_PARAM_NAME); if (!isEmpty(themeDisplay)) { ThemeDisplay td = JSONFactoryUtil.looseDeserialize(themeDisplay, ThemeDisplay.class); request.setAttribute(WebKeys.THEME_DISPLAY, td); } } The isEmpty check in above code is necessary to prevent any NullPointerExceptions in case there wouldn't be a themeDisplay header present. So we used this method in a custom ServletFilter so it can be executed on all requests without changing any of the existing controllers. By providing url-patterns in the @Component definition, it is also possible to just change those requests deemed necessary: @Component( immediate = true, property = { "servlet-context-name=", "servlet-filter-name=ThemeDisplay Filter", "url-pattern=/o/acanews/*", "url-pattern=/o/acatasks/*", "url-pattern=/o/acafaqs/*", "url-pattern=/o/acabanners/*" }, service = Filter.class ) public class ThemeDisplayFilter extends BaseFilter { private static final Log LOGGER = LogFactoryUtil.getLog(ThemeDisplayFilter.class); private static final String THEME_DISPLAY_PARAM_NAME = "themeDisplay"; @Override protected void processFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws Exception { convertThemeDisplay(request); super.processFilter(request, response, filterChain); } private void convertThemeDisplay(HttpServletRequest request) { String themeDisplay = request.getHeader(THEME_DISPLAY_PARAM_NAME); if (!isEmpty(themeDisplay)) { ThemeDisplay td = JSONFactoryUtil.looseDeserialize(themeDisplay, ThemeDisplay.class); request.setAttribute(WebKeys.THEME_DISPLAY, td); } } @Override protected Log getLog() { return LOGGER; } } Well... There it is By performing the necessary front and back end changes, we can now make proper use of Audience Targeting rules in the Controllers for our Angular application. In the front end we intercept the desired REST requests and add a header with the ThemeDisplay (JSON) String. It is sufficient to only add to this object the necessary fields for the Audience Targeting rules. In the back end we retrieve this String from the headers, deserialize it to an actual ThemeDisplay object and add it to the request attributes under the WebKeys.THEME_DISPLAY name. All this occurs in a ServletFilter that will only respond to the desired url patterns. At the moment it is not possible to just pass the entire Liferay.ThemeDisplay object that Liferay provides OOTB. This object does not contain any field with values but is constructed out of functions. So we need to construct the ThemeDisplay object ourselves. By using an Angular Interceptor and a Liferay Servlet Filter, any request can be updated transparently without touching too much code.   Koen Olaerts 2019-01-16T20:48:00Z
Categories: CMS, ECM

New on Liferay University

Liferay - Tue, 01/15/2019 - 18:15

It's time for a new announcement for new content on Liferay University. A new year brings new content. Happy new year!

Liferay Devops

Do you know how to set up a cluster? How to backup (or even better: restore) your installation? In Liferay Devops we cover this and more. Based on Docker, this course guides you through the exploration of a lot of the day-to-day operations of a successful installation and maintenance.

You'll find this course on Liferay University, and of if you're a passport customer, your investment just got more valuable: Of course it's added to your curriculum on Passport. Topics in this course include:

  • All infrastructure managed in Docker
  • Installation on Tomcat and Wildfly
  • Options for Configuration of Liferay
  • Configuring Remote Staging
  • Clustering for Load and Fault Tolerance
  • Liferay in the Cloud
  • Continuous Integration / Delivery / Deployment
  • Interfacing with LDAP
  • Monitoring, Hardening and Securing
  • Installation of Fixpacks
  • Backing up Liferay
  • Aspects for Upgrades
  • and many more
The instructor on this course is yours truly, and I'm looking forward to seeing you sign up for the course. Get your Docker running, then give it something to do. Manage Liferay in the Cloud with DXP Cloud You may have heard about Liferay's new offer: A managed platform for your DXP installations. And if you've wondered how to best use it, you now can tap into the DXP cloud's team knowledge, using the new free lesson on Liferay University. Of course, this is also included in your Liferay University Passport. Head over to University or Passport and start the lesson. 42 minutes of video are waiting for you, covering these topics:
  • Introducing Liferay DXP Cloud
  • Deploying for the first time
  • Collaborating with Team Members
  • Debugging Problems and Monitoring
  • Connecting with Internal Systems
  • Backing up and Restoring Data
  • Receiving Alerts and Auto Scaling
Your instructor is Zeno Rocha, the Chief Product Officer for DXP Cloud - you can't learn the insides from a better source. Learn as much as you can The offer that you can't refuse: Liferay University Passport, our flat rate for each and every course on Liferay University, was available for an introductory price at almost 30% discount that should have been over by now. It includes personal access to all material on university for a full year - learn as much as you can. The offer was scheduled to expire at the end of the year - but while I'm writing this, it's still available - so sign up quickly, or regret. Prefer a live trainer in the room? Of course, if you prefer to have a live trainer in the room: The regular trainings are still available, and are updated to  contain all of the courses that you find on Liferay University and Passport. And, this way (with a trainer, on- or offline) you can book courses for all of the previous versions of Liferay as well. And, of course, the fine documentation is always available and continuously updated. (Photo: CC by 2.0 Hamza Butt) Olaf Kock 2019-01-15T23:15:00Z
Categories: CMS, ECM

How Uniper is providing sustainable energy for everyone with a modern digital platform

Talend - Tue, 01/15/2019 - 17:53

The energy industry supplies electrical power to consumers from a variety of sources, including gas-based and hydroelectric plants, as well as nuclear and coal-based power plants. As temperature, economic and political events occur along with changes in demography, preferences and technology, shifting demand and supply interact to form prices in competitive energy markets. 

Supply and demand need to be managed on a daily second-by-second basis, otherwise blackouts may occur. In this complex world of ever-changing technologies and markets, Uniper, who ranks among large energy generation and trading companies in Europe, didn’t have data readily available to make decisions. Once the idea of an organization-wide data strategy emerged, Uniper decided to go with a public cloud solution for reasons of scalability and cost. Uniper concluded that Talend would be the best cloud integration platform for their cloud architecture. Providing self-service data and analytics in real time To create the Uniper Data Analytics Platform, Uniper selected Talend to integrate more than 120 internal and external data sources into a Snowflake central data lake in the Microsoft Azure Cloud. Data governance, provided by Talend Data Catalog, was also essential to the success of the data lake that contains data from very disparate sources. By enabling integration, centralization, and standardization of Uniper’s most valuable data, Talend gives Uniper a single point of truth for decision support. Employees in selected departments now have access to data in self-service mode enabling faster to make the right decisions while ensuring high data quality and governance. Integration costs have been reduced by more than 80% and the data lake project was profitable within 6 months.   Trading successfully and managing risk Uniper’s team is a mix of business and IT staff who collaborate to address specific business use cases and solve real pain points for the company. Now that the relevant information is aggregated in the data lake, questions from traders that previously required months of research can now be answered by market analysis teams right away. Speed is critical because the earlier trading teams can react, the earlier they can take a position and that can make a difference of millions of euros. Once traders have taken a position, Uniper gets real-time information from sensors in the plants, which monitors their status and receives early warnings if components need to be replaced, and ramps up or ramps down production depending on demand. Post trade, the Uniper data lake and Talend have also greatly reduced operational risk and helped easily meet regulatory challenges.   The post How Uniper is providing sustainable energy for everyone with a modern digital platform appeared first on Talend Real-Time Open Source Data Integration Software.

Categories: ETL

SnapLogic in 2018: A month-by-month review

SnapLogic - Tue, 01/15/2019 - 17:42

The new year has already started with a bang for SnapLogic and the integration platform as a service (iPaaS) industry. The iPaaS industry, the darling of the middleware market, is seeing unprecedented growth and is outpacing all other integration technologies. While its too early to assess how fast it grew in 2018, if history is[...] Read the full article here. The post SnapLogic in 2018: A month-by-month review appeared first on SnapLogic.

Categories: ETL

2019 OSI Board Elections

Open Source Initiative - Tue, 01/15/2019 - 12:16

The Open Source Initiative (OSI) is managed by a member-elected Board of Directors that is the ultimate authority responsible for the organization. The Board's responsibilities include oversight of the organization, including its operations, staff and budget; setting strategic direction and defining goals in line with the mission, and; serving the community through committees and working groups. The eleven person Board is composed of Directors elected by OSI Individual Members (5) and Affiliate Members (5). The General Manager of the OSI also serves on the Board as a Director (ex officio). The results of elections for both Individual and Affiliate Member Board seats are advisory with the OSI Board making the formal appointments to open seats based on the community's votes.

As a true corporate board, Board members must agree to, and comply with, the OSI Conflict of Interest Policy, and all Directors are expected to participate regularly in monthly Board meetings, any special meetings that may arise and the ongoing discussions related to the OSI specifically and open source generally. Open Seats

(More information below, see "Nominations") Upcoming 2019 Election Schedule
  • January 14, 2019: Announcement of election.
  • February 3, 2019 (12:00 a.m. PST): Nominations open
  • March 1, 2019 (11:59 p.m. PST): Nominations close
  • March 4, 2019 (12:00 a.m. PST): Elections open
  • March 15, 2019 (11:59 p.m. PST): Elections close
  • March 18, 2019 (12:00 a.m. PST): : Run-off elections open (if needed)
  • March 18, 2019 (11:59 p.m. PST): Run-off elections close
  • April 1, 2019: New Board Directors seated
  • May 6 & 7, 2019 : First in-person Board meeting (New York, NY)
Terms of Offices No Board Director who has served for six consecutive years is eligible for re-election until a year has elapsed. As an example, someone elected to an Individual Member seat three consecutive times, and thus serving 6 consecutive years, or someone elected to an Affiliate Member Seat twice consecutively, and thus serving 6 consecutive years, will be term-limited and unable to be elected for a further consecutive term for either an Individual or Affiliate seat until a year has passed. The representation of the board is as follows:
  • Five Directors of the Board are appointed based on Individual Members' votes (2 year term, maximum 3 consecutive terms)
  • Five Directors of the Board are appointed based on Affiliate Members' votes (3 year term, maximum 2 consecutive terms)
  • One Director of the Board will be dedicated to the General Manager, ex officio (term to last length of employment)
Election Process Nominations Only current OSI Individual Members may run for an Individual Member seat on the Board (learn more about joining the OSI as an Individual Member), however those running for an Affiliate seat on the Board need not be an Individual Member. Those interested in running for an Individual Member seat do not need to be nominated and may run by simply completing the candidate information. Those interested in running for an Affiliate Member Board seat must be nominated by a current OSI Affiliate organization. Standing for election is extremely easy. Current Individual Members who would like to run for an Individual Member seat can simply send a contact request, with the category “Candidate Nomination” via the OSI contact form (http//opensource.org/contact). Current Affiliate Members may send their nominations for Affiliate Member seats to the OSI via the OSI contact form (http://opensource.org/contact). Please select the “Candidate Nomination” category on the form. Once we receive your request, we will promptly send you back information to create your election profile. Current election eligibility policy can be found here in the OSI Bylaws, Article V, Sections 3 - 5. Voting Voting in OSI elections is open to all Individual Members and the OSI Representatives of each Affiliate Member. Only Individual Members may vote in the election of Individual Member seats. Only Affiliate Member Representatives may vote in the election of Affiliate Member seats. Only one vote per Affiliate Member, as submitted by the Affiliate Representative will be counted in the election of an Affiliate seat. Elections for OSI Directors are held according to Bloc voting, or plurality-at-large, where each eligible voter votes for as many candidates as they feel are qualified to hold a Board seat. The candidates supported by the greatest number of voters will be elected to the open seats. Should a tie occur, a run off will be held between the tied candidates.* Voting for all elections is done online using Helios Voting. When elections are held, OSI current and lifelong Individual Members and the Affiliate Members' Representatives receive email notifications with instructions on how to access the online voting systems, instructions on how to complete their vote, and a list of the candidates with further information about them and their interests/qualifications. Becoming a member If you are not an Individual Member and would like to vote in the election for an Individual Member seat, and/or run, for an OSI Individual Member Board Director seat, please consider registering for Individual Membership. Your participation is fundamental to make the OSI more community oriented and to better represent your interests. You can vote in the next election becoming a member now through the end of the election calendar. You may stand for election as long as you join, before nominations close. OSI Election FAQ Can I run for an Individual or Affiliate Member seat? Yes, you can run for either seat, but not both during the same election. In addition, to run for an Individual Member seat, you must be a current OSI Individual Member . However, you do not need to be an Individual Member to run for an Affiliate seat on the Board. Also, as the Affiliate Member seats are nominated by OSI Affiliate Member Representatives, each Affiliate may have their own requirements to earn their nomination (e.g. membership in their organization). What do I need to do to be a candidate for an Individual Member, or Affiliate Board of Director seat? To be a candidate for an Individual Member seat, you must be a current OSI Individual Member . To be a candidate for an Affiliate seat on the Board you must be nominated by an OSI Affiliate Member Representative. Each Affiliate Member may have their own requirements to earn their nomination (e.g. membership in their organization). What if I'm not an OSI Member and want to run? Individual Membership is easy, and you can become a member right now, and still run for election. You may also contact an OSI Affiliate to ask about a nomination from them. Can I nominate someone else for an Individual Member Board seat? No. The OSI Board needs to have the commitment of the candidate that they are really willing to serve on the Board. But, you can contact your desired candidate and suggest that they self-nominate. All that is required is that they send an email!
  • Won't that leave out important candidates from this election? If candidates don't have time or are not interested in completing a simple form to self-nominate themselves, they probably don't have time, nor interest, to serve on the OSI Board, so they would not really be qualified candidates anyway.
Can I nominate someone else for an Affiliate Member Board seat? No. Only OSI Affiliate Member organizations may nominate candidates for Affiliate Board seats. Can I run for both an Individual Member Board seat and an Affiliate Member Board seat? No. Candidates may only stand for one seat during each election. As an Individual Member, can I vote for Individual and Affiliate Member candidates? No, as an Individual Member you may vote only for candidates running for Individual Member seats on the Board. Affiliate Member representatives vote for candidates running for Affiliate seats on the Board. If you are both an Individual Member and an Affiliate Member representative you may vote for both Individual and Affiliate Member seats.
Categories: Open Source

The E-commerce Calendar: a free tool to help make 2019 a success!

PrestaShop - Tue, 01/15/2019 - 10:01
You were all eagerly awaiting it and now it’s available...
Categories: E-commerce

Joomla 3.9.2 Release

Joomla! - Tue, 01/15/2019 - 09:45

Joomla 3.9.2 is now available. This is a security release for the 3.x series of Joomla which addresses 4 security vulnerabilities and contains over 50 bug fixes and improvements.

Categories: CMS

January CiviCRM online training promotion - Register Now!

CiviCRM - Sat, 01/12/2019 - 11:56

Get in shape with CiviCRM in the New Year!  Cividesk is offering an unique opportunity for new CiviCRM users with a one-week online training package of our Fundamentals of CiviCRM courses for a discounted rate. This offer is so popular, classes sold out for the week of January 14th . . . but we have extended the promotion and added another session the week of January 28th.

Categories: CRM

How can I share session data across portlets in Liferay?

Liferay - Thu, 01/10/2019 - 20:00

Before I answer this question, consider:

What are you actually trying to accomplish? Are you sure that you need share session data to fulfill your goal? Can you use another (better) method to share data between several portlets across several requests?

David Nebinger, Liferay expert and prolific community member, has said that "Session Storage is Evil." Perhaps you could dismiss his statement as hyperbole, but considering all his supporting evidence (and other experts who have echoed his concerns), 1 I think that would be a mistake. Storing (and sharing) data in the session has many drawbacks. For example, sessions must be replicated in a cluster or risk data loss and a disruptive user experience, data in the session must be accessed/modified in a thread-safe way, and any session data increases your application’s memory footprint and reduces scalability. More importantly, the HttpSession (which the PortletSession is based on) is not designed for sharing data between applications (see Servlet Spec 3.1 Section 7.3: Session Scope). Finally, sharing data via the session creates tight, opaque coupling between applications. So before you store and share any data via the PortletSession, consider the following alternatives: 1. Use Public Render Parameters to share string values between portlets. Ultimately, Public Render Parameters (PRPs) are stored in the session (in Liferay’s implementation at least), so they still have some similar drawbacks to session storage. However, PRPs are limited to strings, so their impact on memory is less extreme than other objects that might be stored in the session. Also PRPs are more clearly defined and allow more loose coupling between portlets than shared session data. They also provide bookmarkability with idempotent URLs. Use PRPs to share data such as database keys and similar strings that allow other portlets to determine what or how certain data should be displayed. PRPs should not be used to mutate model data in other portlets, unlike Portlet Events. 2. Use Portlet Events to publish events which can mutate model data that is shared by multiple portlets. Events don’t use session storage, so they will usually have less of an effect on your application’s memory footprint than session data. Although events might require more complex code than PortletSession.get/setAttribute(), events (like PRPs) enable clearly-defined, loose coupling between portlets via the publish/subscribe design pattern. Use Portlet Events when an action in one portlet may be interesting and even provoke changes in data in another portlet. 3. Use Service Builder to cache data and persist data to the database. Persisting data to the database with Service Builder is an extreme option with potential drawbacks for scalability and increased complexity. Creating a new Service with Service Builder, potentially adds two new JARs to your project. However, it will ensure that the data is available to all portlets via the service APIs. You can also enable caches to improve scalability. Perhaps the data you are sharing in session storage is not really temporary or it should be preserved even if a server goes down. In that case, you should use Service Builder. How to Share Session Data Between Portlets: Hopefully 99.9% of people have decided to use PRPs, Events, or Service Builder to share data between portlets and have stopped reading at this point. But for the sake of the 0.1% who legitimately need to use session sharing, I’ve provided a list of ways that you can do that. However, I must again urge caution when relying session sharing and using session storage in general. Please make sure that you are following best practices so that the “easy-to-use” session doesn’t become a source of impossible-to-debug problems. To that end, I encourage you to use the earlier entries in this list and limit the state that is shared between the portlets as much as possible.2

  1. Use PortletSession.APPLICATION_SCOPE to share one or more session attributes between portlets in the same application/WAR. For example: // Portlet A portletRequest.getPortletSession(true) .setAttribute(CONSTANTS.ATTR_NAME, "value", PortletSession.APPLICATION_SCOPE); // Portlet B (in the same WAR) String attrValue = portletRequest.getPortletSession(true) .getAttribute(CONSTANTS.ATTR_NAME, PortletSession.APPLICATION_SCOPE); Pros:
    • Portlet standard method of accessing/sharing session scoped data between portlets.
    • Only exposes the necessary attribute(s) to other portlets (instead of exposing the entire session).
    • Only exposes the data to portlets in the same application/WAR.
    Cons:
    • Cannot share data between portlets in different WARs.
  2. Use Liferay session.shared.attributes prefixes (such as LIFERAY_SHARED_) to share one or more session attributes between portlets in different applications/WARs. Liferay exposes certain session attributes to all portlets based on certain prefix values. Although these prefixes are configurable via portal-ext.properties, I recommend using one of the default prefixes: LIFERAY_SHARED_. For example: // Portlet A portletRequest.getPortletSession(true) .setAttribute("LIFERAY_SHARED_" + CONSTANTS.ATTR_NAME, "value", PortletSession.APPLICATION_SCOPE); // Portlet B (in a different WAR) String attrValue = portletRequest.getPortletSession(true) .getAttribute("LIFERAY_SHARED_" + CONSTANTS.ATTR_NAME, PortletSession.APPLICATION_SCOPE); Pros:
    • Only exposes the necessary attribute(s) to other portlets (instead of exposing the entire session).
    Cons:
    • Exposes session attribute(s) to all portlets.
    • Tight coupling without indicating which other portlets might be utilizing this data.
    • Non-standard method of sharing session data.
  3. Use <private-session-attributes>false</private-session-attributes> (in your liferay-portlet.xml ) to share all session data between portlets in different applications/WARs. For example: Portlet A: liferay-portlet.xml: <liferay-portlet-app> <portlet> <portlet-name>portlet.a</portlet-name> <!-- your config here --> <private-session-attributes>false</private-session-attributes> <!-- ... --> portletRequest.getPortletSession(true) .setAttribute(CONSTANTS.ATTR_NAME, "value", PortletSession.APPLICATION_SCOPE); Portlet B: liferay-portlet.xml: <liferay-portlet-app> <portlet> <portlet-name>portlet.b</portlet-name> <!-- your config here --> <private-session-attributes>false</private-session-attributes> <!-- ... --> // Portlet B (in a different WAR) String attrValue = portletRequest.getPortletSession(true) .getAttribute(CONSTANTS.ATTR_NAME, PortletSession.APPLICATION_SCOPE); Pros:
    • Exposes all PortletSession.APPLICATION_SCOPE attributes without the need for special prefixes.
    Cons:
    • Exposes all PortletSession.APPLICATION_SCOPE attributes to all portlets with <private-session-attributes>false</private-session-attributes>.
    • Tight coupling without indicating which other portlets might be utilizing this data.
    • Non-standard method of sharing session data.
    • May cause memory leaks or other failures in standard frameworks, such as the JSF Portlet Bridge.
  4. Access the HttpSession by unwrapping the HttpServletRequest from the PortletRequest. Don’t do this. It’s not guaranteed to work in Liferay 7.0+ since you may not be able to access the app server’s HttpServletRequest and you can accomplish essentially the same goal with #3.
  1. For more details see this forum post by Olaf Kock (top Liferay answerer on StackOverflow) and Mark Needham’s Rules of Thumb: Don’t Use the Session blog.
  2. The more data is shared between portlets, the more it starts to look like (evil) global state to me.
Kyle Joseph Stiemann 2019-01-11T01:00:00Z
Categories: CMS, ECM

Amid tech industry backlash, both sides need to give a little

SnapLogic - Wed, 01/09/2019 - 17:11

Previously published on The Hill.  As the tech industry faces continued backlash over the impact of what it puts out in the world, we need a better way to balance innovation with civic responsibility. In this negotiation, both the industry and policymakers need to give a little ground. I won’t recount the litany of concerns[...] Read the full article here. The post Amid tech industry backlash, both sides need to give a little appeared first on SnapLogic.

Categories: ETL

60% of HR teams think retention is a big problem. AI can be a solution

SnapLogic - Tue, 01/08/2019 - 17:23

Originally publish on hrpraktijk.nl. In the current digital age, successful organizations are organizations that use data to improve processes, serve customers better, exploit new opportunities in the market, and gain a competitive advantage. Not all departments within an organization are equipped to utilize data to its fullest potential. One of the departments getting left behind is[...] Read the full article here. The post 60% of HR teams think retention is a big problem. AI can be a solution appeared first on SnapLogic.

Categories: ETL

December 2018 License-Discuss List Summary

Open Source Initiative - Mon, 01/07/2019 - 10:51

I've been asked to provide monthly summaries of the license-review and license-discuss mailing lists. The summaries will also be posted on their respective lists, though this blog version includes detailed links into the list archives. Any feedback is welcome, though replies on the content should of course be made to the original threads.

This month's topics:

  • International Licenses Redux
  • Proposed license decision process
  • "Consideration" in open source licenses
  • Open source license with obligation to display an attribution?
  • SSPL loose ends

License-Review summary: https://opensource.org/LicenseReview122018 International Licenses Redux Richard Fontana suggests that the “International” license category should be expanded from non-English language licenses (LiLiQ) to cover licenses "targeting specific languages and jurisdictions", regardless of their language (EUPL, CeCILL). Language and jurisdiction are intertwined, as Mike Milinkovich explains: “By convention, OSS expects English as the language of the license, but there are places in the world where that is legally impossible [due to statutory language requirements].” Proposed license decision process Richard Fontana posts a draft for a clarified license decision process as discussed by the OSI Board. The proposal adds a clear Decision Date 60 days after initial license submission after which the OSI will defer the decision if discussion is ongoing, approve or reject the license if the discussion is conclusive, or withhold approval if the license can be reworked. Bruce Perens appreciates that “software freedom” is an explicit goal of the proposed decision process, but notes that the term can be unclear. Lawrence Rosen argues that open source should be based on a more pragmatic definition. Luis Villa asks about a specific test for software freedom, and whether license review would be coordinated with the FSF. Richard Fontana replies that he considers the OSD to be an attempt of a definition of software freedom, but that the OSD is limited and should not be viewed as as checklist or interpreted too literally. Focusing on software freedom as the actual goal would help avoid this. While Fontana would like to see greater harmonization between OSI and FSF wrt decisions on edge-case FOSS licenses, he doesn’t think their very different review processes should be closely coordinated. What about harmful licenses that have been accepted by the OSI in the past? Perens specifically considers the SIL Open Font License. Rick Moen thinks that these licenses are a lingering though minor problem since there's a community expectation to use one of the major licenses. Luis Villa thinks a cleanup of old licenses might be a good idea and could also provide “case law” for the new license review process. Nicholas Weinstock would prefer existing licenses to be grandfathered. “Consideration” in open source licenses As a more pragmatic basis for the license review process than "software freedom", Lawrence Rosen proposes: “Open source software” means software actually distributed under terms that grant a copyright and patent license from all contributors to the software for every licensee to access and use the complete source code, make copies of the software or derivative works thereof and, without payment of royalties or other consideration, to distribute the unmodified or modified software. A discussion starts on the “without consideration” point. Florian Weimer notes that this term is difficult to understand outside of common law. For example, Kevin P. Fleming and Nicholas Weinstock note that the copyleft requirement to distribute source code might be interpreted as a consideration. Bruce Perens responds that the Jacobsen v. Katzer case shows that open source licenses do indeed have non-monetary considerations. Lawrence Rosen insists that “considerations” should not be confused with “conditions”. Rosen claims that no open source licenses require considerations but that the OSI accepts some license conditions (e.g. copyleft conditions). Rosen thinks that creating open source software or receiving attribution is its own reward. (Note: Rosen’s distinction between considerations and conditions seems to prove Weimer’s point, and the claim about considerations directly contradicts Perens.) A number of OSI-approved licenses explicitly mention considerations and conditions, as noted by Nicholas Weinstock. Perhaps the concepts can be distinguished by whether rights are surrendered or gained? Rosen agrees that these terms can have “subtle legal meanings, including in other countries” but explains that a consideration can be anything valued by the licensor, including "Peppercorns". Nigel Tzeng notes that it is exactly the acceptable level of considerations that is at question for an open source license: “Some forms of consideration is okay, even good. Others become overreach.” Rosen acknowledges that and explains that he is primarily concerned about considerations by downstream users. (Note: it seems Rosen’s gripe with considerations is not so much the consideration itself, but that there might not be a clear recipient of the consideration.) Regarding the “actually distributed” part, Nicholas Weinstock notes that the BSD license might fail that criterion since it has no express patent grant. Lawrence Rosen agrees and would object to new licenses without an explicit patent grant. In fact, licenses that expressly exclude patent grants have been rejected. However, Rosen acknowledges that especially academic licensors might only be able to provide limited grants. Rosen also points to possible issues around open standards. Open source license with obligation to display an attribution? Simon Cox asks [1,2,3] whether any open source license requires public attribution as a gesture of acknowledgement, e.g. as a logo on a website. Such attributions would make it easier to demonstrate the impact of open source projects, especially in the public sector/GOSS as emphasized by Stephen Michael Kellat. Such attributions can be tricky. Danese Cooper recalls the tension between the OSI-approved Attribution Assurance License AAL and SugarCRM’s previous requirement to display their logo in the middle of each page (cf ZDNet) which was considered counter to the OSD. David Woolley mentions the difficulty around the advertising clause in the 4-clause BSD license. Antoine Thomas notes [1,2] that attribution is usually not a problem since all attributions in a software are typically gathered on a separate page. Thorsten Glaser responds that this is only possible if the license is technology-neutral and doesn’t prescribe a specific attribution style. Glaser also raises the issue that a requirement for public attribution could fail the “Dissident” or “Desert Island” test (see DFSG). Bruce Perens mentions two issues with “badgeware”: It would trigger requirements on mere use, and would make compliance infeasible for large projects such as Debian. Lawrence Rosen points out that OSD #10 “License Must Be Technology Neutral” prevents some badgeware licenses. Bruce Perens notes that attribution requests rather than requirements are unproblematic. Lawrence Rosen thinks that mild requirements are perfectly reasonable, e.g.: “Licensee must display the name and source of the embedded software in as prominent a manner and place as the licensee displays its own trademarks.” Rosen also voices an interesting view on the license review process: “Our job is to approve licenses that experiment successfully (?) with new license models, not to keep rejecting ways to obtain profit and recognition from software. Let us leave it up to the marketplace to determine acceptability of the license, as long as it is ‘open source software.’” Chris Lamb suggests [1,2] adding a rider with an attribution request to any well-known license, e.g. the GPLv3. (Note: this could be a GPLv3 Additional Term.) Lawrence Rosen claims that the GPLv3 “doesn't protect attribution in derivative works.” Regarding the Government Open Source Software (GOSS) attribution aspect, Nigel Tzeng expresses considerable frustration with respect to available open source licenses and the open source community. Visible attribution is often needed by public projects to ensure future funding. Jim Jagielski and Lawrence Rosen disagree that GOSS would be fundamentally different from other projects in this respect. However, Rosen agrees that present licenses such as the GPLv3 fail to ensure sufficient attribution. Christopher Sean Morrison lists a few US-specific problems or unresolved legalities that GOSS faces. This limits public sector participation in open source: “Nobody wants to be the guinea pig.” Tzeng points to the NASA and ECL licenses as examples where other public sector needs already made specific licenses necessary. SSPL loose ends The submission of the SSPL sparked lots of discussions about copyleft and review processes in general. A number of loose ends: Kyle Mitchell followed up on two points from November. Responding to the older Freedom or Power? essay, Mitchell notes that there isn’t just the essay's producer–user power imbalance, but also an imbalance between producers. Mitchell argues that non-permissive licenses such as the SSPL are necessary to protect producers from their competitors. There have not been many supporters for the SSPL. Mitchell notes that the number of supporters should not matter, so that the license review process doesn't turn into a popularity contest. Previously, Kyle Mitchell had noted that some OSI-approved licenses trigger requirements on use and not just on copying: the OSL and AGPL. Florian Weimer thinks that the AGPL was originally intended for servers that also serve their source code and not for open-core business models. “People who have tried to use the AGPL in this way have been disappointed about the effects, I believe.” Weimer wonders whether such business models were a consideration for the OSL. Should a license review focus on the license text or its potential use? Florian Weimer prefers a textual review because this avoids having to take a stance on Open Core business models. Brendan Hickey clarifies that a 2010 post on the OSI blog about this is a personal opinion and not official OSI stance.

Categories: Open Source

December 2018 License-Review List Summary

Open Source Initiative - Mon, 01/07/2019 - 10:49

I've been asked to provide monthly summaries of the license-review and license-discuss mailing lists. The summaries will also be posted on their respective lists, though this blog version includes detailed links into the list archives. Any feedback is welcome, though replies on the content should of course be made to the original threads.

This month's topics:

  • License committee report and review status changes
  • Server Side Public License, Version 2 (SSPL v2)
  • Support for SSPL v2
  • (A new license review process is being discussed on the license-discuss list)
License-Discuss summary: https://opensource.org/LicenseDiscuss122018 License committee report and review status changes Report by Richard Fontana libpng license: Cosmin Truta withdraws the license. SSPLv2: discussion will continue on the revised version. YetiForce Public License 3.0: rejected. License Zero Public License (L0-R): no decision because it had been effectively withdrawn. Convertible Free Software License, Version 1.1: approval withheld pending a redrafted version. Elmar Stellnberger (the license submitter) is not certain which points would have to be changed. Carlo Piana emphasizes that giving the original authors special relicensing rights is discriminatory, especially in case of a fork. Server Side Public License, Version 2 (SSPL v2) On Nov 21, the SSPL v2 has been submitted for review. Eric Schultz feels the revision has not been made in good faith and finds no substantial improvements. Schultz is particularly concerned that the “limitations what code is included on Section 13 seem practically limitless because Service is not defined.” Bruce Perens links to Sunil Deshpande’s comments on the SSPL and feels “it manifests a lot of ignorance about Open Source and utter contempt for our community.” Eliot Horowitz (MongoDB) responds that Deshpande is unaffiliated with MongoDB. Instead, Horowitz points to an article on his blog. He also responds to individual issues: Is it a problem that the SSPL extends to other software? Horowitz argues “no”: combining services over a network is the new dynamic linking, so it's OK to extend copyleft. (Note: this fails to consider the bounds of copyright, and that the SSPL would not just affect other services but e.g. deployment tools.) McCoy Smith is also concerned that the SSPL could require the disclosure of software that is similar or reverse engineered, without being a derivative work in the sense of copyright. What constitutes making the Program available as a service? Horowitz claims that the SSPL's definition is easier to understand than the comparable section in the AGPL, and says the license cannot be more specific while remaining technology-agnostic and understandable. Florian Weimer asks whether this would include services like providing pre-built binaries. Horowitz (MongoDB) responds that the terms covering distribution of binaries are identical with the GPL. Horowitz explains that running the software as a service here means running the software on behalf of someone else, and that this meaning is common and well understood. (Note: I previously read the SSPL with service as in service oriented architecture, not as in cleaning service. Apparently, only service as in SaaS/PaaS is meant. Common usage or not, this is quite ambiguous.) Lawrence Rosen takes issue with the SSPL’s “making available” definition: the “value” of a service cannot be calculated, and what a program “accomplishes for users” is subjective and addled by marketing. “You have created, at least in part, an unenforceable FOSS license with a nicer definition than AGPL of "program as a service" that still doesn't help much. :-)” Nevertheless, Rosen thinks the flaws of the SSPL do not prevent it from being an open source license and votes for approval as an experimental license. Support for SSPL v2 Greg Luck (Hazelcast) voices support for the SSPL v2. He argues that there is a need for an OSI-approved license addressing the issues raised by the Commons Clause and SSPL in order to prevent proliferation of open source-ish licenses in this area. Luck considers GPLv3 style copyleft and even the AGPL insufficient at preventing service wrapping by cloud providers. In his understanding, copyleft should prevent selling free software or the original developers should get a fair share of the profits. Rob Landley responds that Stallman was well aware of the “service provider loophole” prior to creating the (A)GPLv3 license family. “If he and Eben Moglen working together for half a decade couldn't manage to address the issue and still call the result "Free Software", what makes you think you're going to?” Landley accuses SSPL supporters of wishful thinking: “that's now how copyright law and open source work”. Carlo Piana sympathizes with Luck’s sentiment but doesn’t think the SSPL should be the license that OSI approves for this purpose. Piana is particularly concerned that the SSPL is so unclear in so many scenarios that most users are effectively forced to obtain a proprietary license. “It's the dual licensing paradigm on steroids”. Nigel T concurs and suggests that it’s not the responsibility of open source to enable a particular business model: “If you don’t want folks to profit from your codebase just make it shared source and move on.” Bruce Perens adds that the “OSI doesn't prevent you from using any license. Just don't call it Open Source.” Perens points out that the OSD/DFSG ban on usage restrictions excludes some special interests, e.g. educational-only software. This is necessary so that an open source system can be used with legal certainty, for any purpose. But where are the communities that promote special non-open source licenses? “IMO the problem for some of the proposed licenses is not a lack of OSI's approval, but a lack of interest.” Nigel T points at CC-NC as a non-open license with a large community. Perens also responds that any confusion due to a proliferation of non-OSS licenses “will not be OSI or Open Source's problem. You create this problem by leaving the tent.” Brendan Hickey points out Luck’s misunderstanding of Free Software: it’s about reciprocity, not about encumbering commercial interests. Furthermore, Hickey argues that cloud providers sell reliability, not software. Therefore, the SSPL will not prevent large cloud providers from profiting from hosting open source software but at most inconvenience users. Martin Verburg (jClarity) [1,2] chimes in with support for a common license that addresses these concerns, but advises caution – acceptance of such a license or even changing the OSD would have far-reaching and long-lasting effects. Instead he suggests a Infrastructure License Consortium in which vendors should develop a common license, independent of possible OSI approval. Regarding the SSPL, Verburg suggests to wait and watch: will other vendors take up this license?
Categories: Open Source

Webform CiviCRM Integration: new features added in 2018 and looking ahead to 2019

CiviCRM - Sun, 01/06/2019 - 15:39

2018 was a big year for Webform CiviCRM module. I wanted to take a moment to highlight some of the new features that were added in 2018 (with some examples/screenshots) and take a look at what's to come in 2019!

Webform CiviCRM Integration - what is this?

Categories: CRM

Where EDI, manufacturing, and the beer game meet modern integration

SnapLogic - Fri, 01/04/2019 - 13:40

I have fond memories of the Operations Management course I took in college. We spent an entire hour playing the “Beer Game,” which had nothing to do with drinking beer. Through this game, we learned how “just-in-time” production works: how to work collaboratively to keep inventory levels low and still meet demand. Little did I[...] Read the full article here. The post Where EDI, manufacturing, and the beer game meet modern integration appeared first on SnapLogic.

Categories: ETL

An Introduction to Apache Airflow and Talend: Orchestrate your Containerized Data Integration and Big Data Jobs

Talend - Fri, 01/04/2019 - 04:09
Introduction

In my last blog I described how to achieve continuous integration, delivery and deployment of Talend Jobs into Docker containers with Maven and Jenkins. This is a good start for reliably building your containerized jobs, but the journey doesn’t end there. The next step to go further with containerized jobs is scheduling, orchestrating and monitoring them. While there are plenty of solutions you can take advantage of, I want to introduce an effective way to address this need for containerized Talend jobs in this blog. What Challenges are we Addressing? When it comes to data integration or even big data processing you need to go beyond simple task scheduling. Indeed, you may want to run several jobs sequentially or in parallel in order to monitor them in an efficient manner. This is what we call workflow management. Even though this is not a new topic in this industry, we now need to consider that we are dealing with containers and their ecosystem. Speaking of the container ecosystem, the rising adoption of Kubernetes shows us that more and more companies are betting on containers (as we do at Talend). As a result, our main challenge is to be able to provide a solution that can adapt to this fast-growing environment but also respond to our existing needs. Why Apache Airflow? According to Apache Airflow website: Apache airflow is a platform for programmatically author schedule and monitor workflows. In short, Apache Airflow is an open-source workflow management system. It allows you to design workflow pipelines as code. It uses Python which is a very popular language for scripting and contains extensive available libraries you can use. The value that Apache Airflow brings is: native management of dependencies, failures and retries management. Everything is easily configurable, and Airflow provides a great graphical interface to monitor your workflows. Like most of its competitors (such as Luigi or Pinball), it offers scalability and resilience over your workflows. To sum up, Apache Airflow meets all the expectations we would have for a workflow management system. However, a key reason to choose Apache Airflow is the community behind it. A number of services integration have been already developed which considerably extends the capabilities of Airflow and its future is promising with a strong roadmap and a great number of contributors. How to Use Apache Airflow with Containerized Talend Jobs Before we begin, please be aware of the following requirements needed to follow our example:

The goal in this article is to be able to orchestrate containerized Talend Jobs with Apache Airflow.
  1. First, we are going to build 3 jobs as Docker container images.
  2. These jobs will run in a Databricks
  3. Then we will create an Apache Airflow workflow to create a Databricks cluster, run our jobs and eventually terminate our cluster.
The workflow is represented in the following schema: 1)    Talend 7.1 and Docker Containers First, let’s drill in the new Talend 7.1 release. You now have two different ways to package your Talend jobs into Docker containers. First, you can use Talend CI/CD capabilities as introduced in Talend 7.0. The 7.1 new release improves and eases the configuration to build your container images. Please read the documentation to see the updates. Talend has introduced a new feature allowing you to build your jobs as Docker images directly from Talend Studio. Let me show you how easy it is: Right-click on any Standard or Big Data job: It will build your job in a Docker image using your Docker daemon either locally or using a remote Docker host. You can also publish it directly to a Docker registry: Whether you are using the CI/CD Builder or the Studio to build Docker images you are now all set up to orchestrate your containerized jobs. 2)    Serverless Big Data with Databricks Talend 7.1.1 new release introduces Databricks support. Basically, Databricks is a managed service for Spark available on AWS or Azure. You can start a Spark cluster in a matter of minutes and your cluster can automatically scale depending on the workload making it easier than ever to set up a Spark cluster. First, let’s orchestrate a workflow around Databricks. From the Databricks website: Databricks unifies data science and engineering across the Machine Learning lifecycle from data preparation, to experimentation and deployment of ML applications. Databricks is targeting different types of users on their platform such as data engineers, machine Learning engineers, data scientist and data analysts. While data engineers deploy their Spark jobs and build ML models, data scientists analyze and interpret, through notebooks, the data made available for them. In this context, it is becoming even more important to develop ETL and Big Data jobs and be able to orchestrate, schedule and monitor them in order to fasten the model creation and data availability iterations. In the light of this, the use of Talend to operationalize and Apache Airflow to orchestrate and schedule becomes an efficient way to address this use case. To illustrate my point, I chose the following workflow example:
  • Create a Databricks Cluster
  • Copy files from AWS S3 to Databricks DBFS
  • Run two Databricks Jobs packaged in containers (train a model and test this model)
  • Stop the Databricks cluster once the jobs are done
I have 3 different jobs. The first one is a standard data integration job that copies a file from AWS S3 to Databricks DBFS (Databricks file system): The second one trains a machine learning model using a decision tree. As you can see we have defined three context variables. These variables will be my only setup needed to run a job on a Databricks cluster. In my case: DATABRICKS_ENDPOINT=https://westeurope.azuredatabricks.net/?o=3888544531850695# DATABRICKS_CLUSTER_ID=1114-095830-pop434 DATABRICKS_TOKEN=you can create one under user settings. My last job is the testing of the previously trained model. It returns a confusion matrix based on the testing dataset. Finally, you need to specify these three parameters in your job Spark configuration, and you are all set. I won’t go into the details of the job because the purpose of this article is to show how to orchestrate containers, but they are simple big data processing jobs training a machine learning model on a dataset and then testing this model on a different dataset. If you are interested in this use case, you can find a detailed description here as these jobs are available in our Talend Big Data & Machine Learning Sandbox. As an example, once built either through Continuous Integration/Continuous Delivery (CI/CD) or from the Talend Studio you can then run your job as follow: docker run trainmodelriskassessment:latest \ --context_param DATABRICKS_ENDPOINT="https://westeurope.azuredatabricks.net/?o={INDENTIFIER}#” \ --context_param DATABRICKS_CLUSTER_ID="1114-095830-pop434" \ --context_param DATABRICKS_TOKEN="{TOKEN}"  At this point, we now have three containerized Talend jobs published in a Docker registry allowing us to pull and run them anywhere. 3)    Apache Airflow Let’s get started with Apache Airflow. If you have never tried Apache Airflow I suggest you run this Docker compose file. It will run Apache Airflow alongside with its scheduler and Celery executors. If you want more details on Apache Airflow architecture please read its documentation or this great blog post. Once it is running, you should have access to this: As you can see I have created one DAG (Directed Acyclic Graph) called databricks_workflow. Please read the description of Apache Airflow concepts if needed. In short, this is where you define the tasks, their execution flow and scheduling settings. Please find my Python file here defining my workflow. In the Python file above you can see we have several tasks:
  • create_clustercreate_cluster_notify
  • s3_list_files
  • run_job (for each file listed in previous task) + run_job_notify
  • train_modeltrain_model_notify
  • test_modeltest_model_notify
  • terminate_clusterterminate_cluster_notify
Each of these tasks requires an operator. We have added a notification along with all the tasks using the Slack Operator that allow us to send Slack messages to follow the workflow advancement. Example of notifications sent by Apache Airflow to Slack We use the Python Operator for create_cluster and terminate_cluster tasks. The Python Operator simply calls a Python function you can see in the file. The train_model and test_model tasks use the ECS Operator that allows us to run a Docker Container in an ECS Cluster easily. In our case, we use the containerized Databricks Jobs we earlier built, and we specify the 3 parameters to target our newly created Databricks cluster. This workflow associated graph is rendered as follows: As you can see we use S3 List Operator to list all the files in a S3 bucket and then we use our containerized job to copy each of these files into Databricks DBFS in parallel. We dynamically pass the parameters with Apache Airflow to the container at runtime. Then we run our other containerized jobs to train and test the machine learning model. In fact, only the training_dataset.csv and testing_dataset.csv files are used but to clearly show you the loop that Apache Airflow achieves, I have added 2 files in the bucket that are not used. Conclusion Thanks to Talend containers capabilities associated with an orchestrator such as Apache Airflow you can easily create complex and efficient workflows. Apache Airflow is still a young open source project but is growing very quickly as more and more DevOps, Data engineers and ETL developers are adopting it. The above example shows you how you can take advantage of Apache Airflow to automate the startup and termination of Spark Databricks clusters and run your Talend containerized jobs on it. It potentially can reduce your cloud processing cost profile and help you monitor your data pipelines more efficiently. Monitoring the success and performance of your workflows is also a core concern for ETL, Data engineering teams. As you have seen you can track all the tasks with email or Slack notifications as well as get logs depending on the services you use. This is very useful to track errors and be more agile with your processes. The post An Introduction to Apache Airflow and Talend: Orchestrate your Containerized Data Integration and Big Data Jobs appeared first on Talend Real-Time Open Source Data Integration Software.
Categories: ETL

Walking in a wi18nter wonderland

CiviCRM - Fri, 01/04/2019 - 02:16
Happy New Year, CiviCRM community! I bring exciting news to all of those,  who have to deal with localisation (l10n) and internationalisation (i18n) - in short:  everyone who is occasionally unhappy with the texts in the user interface or public forms. And yes, that might include English forms as well.  
Categories: CRM

SnapLogic recognized as a leader in new strategic iPaaS and hybrid integration platforms report

SnapLogic - Thu, 01/03/2019 - 11:22

I’m thrilled to share that Forrester Research Inc. has named SnapLogic as a leader in its influential industry report, The Forrester Wave™: Strategic iPaaS And Hybrid Integration Platforms, Q1 2019! For this year’s report, Forrester identified the 15 most significant iPaaS and HIP providers and evaluated them on 25 different criteria. While you can read[...] Read the full article here. The post SnapLogic recognized as a leader in new strategic iPaaS and hybrid integration platforms report appeared first on SnapLogic.

Categories: ETL

CiviMobile Available in One more Language – Italian

CiviCRM - Thu, 01/03/2019 - 09:21

Categories: CRM
Syndicate content