SlideShare a Scribd company logo
The Architecture of
PicCollage Server
http://godfat.org/slide/
2013-01-08-PicCollage.pdf
•PicCollage, Software and Services
Table of Contents
•PicCollage, Software and Services
•Ruby Codes
Table of Contents
•PicCollage, Software and Services
•Ruby Codes
•Miscellaneous Extras
Table of Contents
PicCollage
Software
Services
&
,
•Gemfile
•Procfile
•Rakefile
•rainbows.rb
•concurrency.rb
•config.ru
Ruby Codes
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
•image_util.rb
•run_later.rb
•/search
•/create_and_share
Ruby Codes
(Cont.) (Cont.)
•crazy inspect
•who cares backtrace for 404
•assets pipeline and
database connection
•fiber stack overflow
•fiber database connection pool
•thread-safe kaminari patch
Miscellaneous Extras
PicCollage
Software
Services
&
,
PicCollage
•Make collages of your photos
•Import photos from places
•Touch gestures to rotate, resize, delete
•Double-tap to edit, clip, etc
•Clip photos by outlining the area
•Lots of backgrounds and stickers
PicCollage
Software
Services
&
,
Software
•Ruby 1.8.7 -> 1.9.2 -> 1.9.3
Software
•Ruby 1.8.7 -> 1.9.2 -> 1.9.3
•Rails 3.1.0.rc4 -> 3.1.0.rc5 -> 3.1.0 ->
3.1.3 -> 3.2.1 -> 3.2.2 -> 3.2.3 -> 3.2.5 ->
3.2.6 -> 3.2.7 -> 3.2.8 -> 3.2.9 -> 3.2.10
Software
•Ruby 1.8.7 -> 1.9.2 -> 1.9.3
•Rails 3.1.0.rc4 -> 3.1.0.rc5 -> 3.1.0 ->
3.1.3 -> 3.2.1 -> 3.2.2 -> 3.2.3 -> 3.2.5 ->
3.2.6 -> 3.2.7 -> 3.2.8 -> 3.2.9 -> 3.2.10
•Sinatra -> Jellyfish
Software
•Ruby 1.8.7 -> 1.9.2 -> 1.9.3
•Rails 3.1.0.rc4 -> 3.1.0.rc5 -> 3.1.0 ->
3.1.3 -> 3.2.1 -> 3.2.2 -> 3.2.3 -> 3.2.5 ->
3.2.6 -> 3.2.7 -> 3.2.8 -> 3.2.9 -> 3.2.10
•Sinatra -> Jellyfish
•Thin -> Zbatery
Software
•Ruby 1.8.7 -> 1.9.2 -> 1.9.3
•Rails 3.1.0.rc4 -> 3.1.0.rc5 -> 3.1.0 ->
3.1.3 -> 3.2.1 -> 3.2.2 -> 3.2.3 -> 3.2.5 ->
3.2.6 -> 3.2.7 -> 3.2.8 -> 3.2.9 -> 3.2.10
•Sinatra -> Jellyfish
•Thin -> Zbatery
•Resque -> EM.next_tick or Thread.new ->
Sidekiq (?)
PicCollage
Software
Services
&
,
Services
•Github
Services
•Github
•Heroku Bamboo -> Cedar
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
•MongoHQ -> MongoLab
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
•MongoHQ -> MongoLab
•RedisToGo -> OpenRedis
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
•MongoHQ -> MongoLab
•RedisToGo -> OpenRedis
•Memcache (?) -> Memcachier
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
•MongoHQ -> MongoLab
•RedisToGo -> OpenRedis
•Memcache (?) -> Memcachier
•NewRelic
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
•MongoHQ -> MongoLab
•RedisToGo -> OpenRedis
•Memcache (?) -> Memcachier
•NewRelic
•Exceptional
Services
•Github
•Heroku Bamboo -> Cedar
•Heroku PostgreSQL 9.0 -> 9.2
•MongoHQ -> MongoLab
•RedisToGo -> OpenRedis
•Memcache (?) -> Memcachier
•NewRelic
•Exceptional
•SendGrid -> Mailgun
•Gemfile
•Procfile
•Rakefile
Ruby Codes
•rainbows.rb
•concurrency.rb
•config.ru
Gemfile
ruby '1.9.3'
source 'http://rubygems.org'
gem 'rails', '3.2.9'
gem 'jellyfish'
gem 'pg', :platform => :ruby
gem 'redis-objects'
gem 'dalli'
# service
gem 'newrelic_rpm', :require => false
gem 'exceptional'
gem 'apns', :github => 'jpoz/APNS'
# ^^^^ needs feedback patch
# server
platform :ruby do
gem 'zbatery', :require => false
gem 'em-http-request'
gem 'yajl-ruby'
end
Gemfile (Cont.)
# upload
gem 'paperclip' # needs various patches
gem 'aws-sdk'
# plist
gem 'nokogiri'
# pagination
gem 'kaminari' # needs thread-safe patch
# javascript
gem 'jquery-rails'
Gemfile (Cont.)
# make `rails server` work for zbatery
gem 'rack-handlers'
# respect rack logger
gem 'rack-rails-logger'
# redirect from www to root domain
gem 'rack-rewrite'
# cache for API
gem 'rack-cache'
Gemfile (Cont.)
# api client
gem 'rest-core'
gem 'rest-more'
# bluebase
gem 'bb_more' , :path => 'bluebase'
gem 'bb_locales', :path => 'bluebase'
gem 'bb_auth' , :path => 'bluebase'
gem 'bb_redis' , :path => 'bluebase'
Gemfile (Cont.)
group :assets do
gem 'sass-rails'
gem 'coffee-rails'
gem 'uglifier'
end
group :cedar do
gem 'rib'
gem 'bond'
gem 'readline_buffer',
:platform => :ruby
end
Gemfile (Cont.)
group :test do
gem 'minitest'
gem 'rr'
gem 'webmock'
gem 'kramdown'
end
group :test do
gem 'capybara'
gem 'rspec'
gem 'rspec-rails'
end
Gemfile (Cont.)
•Gemfile
•Procfile
•Rakefile
Ruby Codes
•rainbows.rb
•concurrency.rb
•config.ru
Procfile
web: ruby -r bundler/setup -S zbatery
-c config/rainbows.rb
-p $PORT -E $RACK_ENV
•Gemfile
•Procfile
•Rakefile
Ruby Codes
•rainbows.rb
•concurrency.rb
•config.ru
task 'test:all' => ['test',
'test:bluebase']
task 'env:test' do
Rails.env = 'test'
end
Rakefile
task 'test:bluebase' => ['env:test'] do
# remove bundler shit
gemfile = ENV.delete('BUNDLE_GEMFILE')
sh './bin/bluebase-test'
ENV['BUNDLE_GEMFILE'] = gemfile
end
Rakefile (Cont.)
task :test => ['test:api']
Rakefile (Cont.)
Rakefile
task 'test:api' => ['env:test',
'environment'] do
require './config/environments/test'
# force rails loaded, otherwise it's
# causing too much loading troubles,
# by rails' autoloading mechanism
Dir['./test/api/*.rb'].each do |test|
require test
end
# ...
end
(Cont.)
# this is only available in 1.9.3+
if Test::Unit.const_defined?(:RunCount)
Test::Unit::RunCount.run_once{
status = Test::Unit::Runner.new.run
exit(status) if status != 0
}
end
Rakefile (Cont.)
•Gemfile
•Procfile
•Rakefile
Ruby Codes
•rainbows.rb
•concurrency.rb
•config.ru
worker_processes 2 # assume 2 CPU cores
preload_app true
l = ::Logger.new($stderr)
l.level = case ENV['RACK_ENV']
when 'production'
::Logger::WARN
else
::Logger::DEBUG
end
logger l
rainbows.rb
rainbows.rb
Rainbows! do
use :EventMachine, :em_client_class =>
lambda{
require 'concurrency'
client = Concurrency.
eventmachine_client
l.info("Using #{client}")
client
}
worker_connections 64
end
(Cont.
before_fork do |_, _|
# don't hold connections on master
unless defined?(Zbatery)
l.info("Discon' PSQL and Redis...")
AR::Base.connection.disconnect!
Redis.current.quit
end
end
rainbows.rb (Cont.
after_fork do |_, _|
# hold connections on workers
unless defined?(Zbatery)
l.info("Conn' PSQL and Redis...")
Redis.current.connect
AR::Base.connection.
establish_connection
end
end
rainbows.rb (Cont.
EM.error_handler do |e|
puts "Err: #{e.inspect}" 
" #{e.backtrace.inspect}"
begin
::Exceptional::Catcher.handle(e)
::NewRelic::Agent.instance.
error_collector.notice_error(e)
rescue Exception => e
puts "Err: Exceptional/NewRelic:" 
" #{e.inspect}" 
" #{e.backtrace.inspect}"
end
rainbows.rb (Cont.
Rainbows! EventMachine Thread Client
https://gist.github.com/4451322
https://github.com/godfat/rainbows/pull/2
rainbows.rb (Cont.
class ::RainbowsEMThreadPoolClient <
Rainbows::EventMachine::Client
def app_call input
@deferred = true
EM.defer do
# Call the application here!
end
end
end
rainbows.rb (Cont.
# Call the application here!
begin
@env.merge!(RACK_DEFAULTS)
status, headers, body = APP.call(@env)
@deferred = nil # EM.next_tick?
ev_write_response(status,
headers, body, @hp.next?)
rescue Exception => e
EM.instance_variable_get(
:@error_handler).call(e)
handle_error(e)
end
rainbows.rb (Cont.
•Gemfile
•Procfile
•Rakefile
Ruby Codes
•rainbows.rb
•concurrency.rb
•config.ru
concurrency.rb
module Concurrency
Model = Thread
module_function
def eventmachine_client
if Model == Thread
RainbowsEMThreadPoolClient
elsif Model == Fiber
RainbowsEMFiberSpawnClient
else
Rainbows::EventMachine::Client
end
end
concurrency.rb
module Concurrency
def wrap
if Model == Thread
EM.defer do
# ...
end
elsif Model == Fiber
Fiber.new{ yield }.resume
else
yield
end
end
(Con
concurrency.rb
def wrap
begin
yield
rescue Exception => e
EM.instance_variable_get(
:@error_handler).call(e)
ensure
AR::Base.clear_active_connections!
end
(Con
•Gemfile
•Procfile
•Rakefile
Ruby Codes
•rainbows.rb
•concurrency.rb
•config.ru
config.ru
use Api::HostDispatcher, Api::Server
map '/api' do
run Api::Server
end
map '/' do
run PicCollage::Application
end
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
Api::Server = Rack::Builder.new do
# Embrace Rack is the Jellyfish way
end
server.rb
use Rack::CommonLogger, debug_logger
use Rack::Deflater
use Rack::Static,
:urls => ['/images'], :root =>
"#{File.dirname(__FILE__)}/public"
use AR::ConnectionAdapters::
ConnectionManagement
server.rb (Cont.)
use Api::MiddleError
use Api::MiddleDevice
use Api::MiddleAuth
use Api::MiddleCache
use Rack::Cache, {} # [snipped]
run Api::ServerCore.new
server.rb (Cont.)
class Api::ServerCore
include Jellyfish
handle_exceptions false
def controller; Controller; end
class Controller < Api::Controller
include Api::ServerMethods
include Jellyfish::NewRelic
end
end
server.rb (Cont.)
class Api::ServerCore
post '/collages/create_and_share' do
render_collage create_collage{ |c|
transfer "/collages/#{c.id}/share"
}
end
end
server.rb (Cont.)
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
class Api::MiddleError
include Jellyfish
handle_exceptions true
def controller; Api::Controller; end
handle Api::Error do |error|
render(error_custom(error))
end
end
error.rb
error.rb (Cont.)
class Api::MiddleError
handle Jellyfish::NotFound do
render(error_custom(
Api::NotFound.new(
"Path not found.")))
end
handle Exception do |error|
render(error_500(error))
end
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
module Eagerload
module_function
def eagerload
if ENV['RAILS_GROUPS'] == 'assets'
$stderr.puts "Don't eagerload " 
"for assets precompilation."
return
end
# ...
eagerload.rb
def eagerload
# ...
require 'rest-more'
RC.eagerload
require 'aws-sdk'
RC.eagerload(AWS::Core)
RC.eagerload(AWS::S3)
eagerload.rb (Cont
def eagerload
# ...
%w[app/models/**/*
app/controllers/**/*
app/mailers/**/*].
each{ |pattern|
require_all(Dir[pattern], 2) }
eagerload.rb (Cont
def eagerload
# ...
require 'api/requirements'
require_all(Dir['lib/**/*'], 1)
$stderr.puts "Eagerly loaded."
true
end
eagerload.rb (Cont
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
ActiveSupport.on_load(:active_record) do
require 'newrelic_rpm'
NewRelic::Agent.after_fork(
:force_reconnect => true) if
defined?(Unicorn)
# ...
newrelic.rb
require 'shell'
Shell.module_eval do
include NewRelic::Agent::
MethodTracer
add_method_tracer :system_multi
end
newrelic.rb (Cont.)
Cocaine::CommandLine.module_eval do
include NewRelic::Agent::
MethodTracer
add_method_tracer :run
end
newrelic.rb (Cont.)
Paperclip::Attachment.module_eval do
include NewRelic::Agent::
MethodTracer
add_method_tracer :url
end
newrelic.rb (Cont.)
require 'redis'
Redis::Client.module_eval do
include NewRelic::Agent::
MethodTracer
add_method_tracer :process
end
newrelic.rb (Cont.)
require 'rest-core/engine/future/future'
RC::Future.module_eval do
include NewRelic::Agent::MethodTracer
alias_method :yield_original, :yield
def yield
method = env[RC::REQUEST_METHOD]
path = env[RC::REQUEST_PATH]
# ...
newrelic.rb (Cont.)
(Cont.)newrelic.rb
def yield
# ...
metrics = ["External/#{path}/" 
"#{self.class.name}/#{method}",
"External/#{path}/all",
"External/all",
"External/allWeb"]
self.class.
trace_execution_scoped metrics do
yield_original
end
end
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
shell.rb
require 'waiter'
require 'concurrency'
module Shell
module_function
# this is for cocaine
def call command, env={}
Shell.system(*command)
end
# e.g. Shell.system('identify', 'img')
def system *args
system_multi(args).first
end
shell.rb
# e.g. Shell.system_multi(%w[identify
# image.png], %w[identify me.png])
def system_multi *cmds
if EM.reactor_running?
# ...
else
cmds.map{ |cmd|
system_blocking(cmd) }
end
end
(Cont.)
shell.rb
def system_multi *cmds
# ...
w = Waiter.new
r = {}
cmds.each.with_index do |cmd, idx|
system_async(*cmd) do |output|
r[idx] = output
w.resume(r.sort.map(&:last)) if
r.size == cmds.size
end
end
w.yield
(Cont.)
shell.rb
def system_async *args
tuple = system_spawn(args)
Thread.new do
begin
result = system_wait(*tuple)
rescue Exception => e
EM.instance_variable_get(
:@error_handler).call(e)
ensure
# ...
ennnd
(Cont.)
shell.rb
def system_async *args
# ...
if Concurrency::Model == Fiber
EM.next_tick{ yield(result) }
else
yield(result)
end
(Cont.)
shell.rb
def system_spawn args
err = if %w[test production].
include?(Rails.env)
IO::NULL
else
Rails.logger.debug(
"Shell: #{args.inspect}")
$stderr
end
# ...
(Cont.)
shell.rb
def system_spawn args
# ...
rd, wr = IO.pipe
pid = Process.spawn(*args,
:out => wr, :err => err)
[pid, rd, wr]
end
(Cont.)
shell.rb
def system_wait pid, rd, wr
wr.close
result = rd.read
Process.waitpid(pid)
result
end
(Cont.)
•server.rb
•error.rb
•eagerload.rb
Ruby Codes
(Cont.)
•newrelic.rb
•shell.rb
•waiter.rb
waiter.rb
require 'thread'
require 'fiber'
class Waiter
def self.fiber_around?
RC::RootFiber != Fiber.current &&
Thread.main == Thread.current
end
end
waiter.rb
class Waiter
def initialize
if Waiter.fiber_around?
@fiber = Fiber.current
else
@condv = ConditionVariable.new
@mutex = Mutex.new
end
end
end
(Cont.)
waiter.rb
class Waiter
def resume value
if @fiber
@fiber.resume(value)
else
@value = value
@condv.broadcast
end
end
end
(Cont.)
waiter.rb
class Waiter
def yield
if @fiber
Fiber.yield
else
@mutex.synchronize{
@condv.wait(@mutex) }
@value
end
end
end
(Cont.)
•image_util.rb
•run_later.rb
•/search
•/create_and_share
Ruby Codes
(Cont.) (Cont.)
collage_web.rb
class CollageWeb < Collage
extend ImageUtil
def self.create_from urls_or_url,
fallback_urls=[]
create(:image =>
merge_images(
urls2images(urls_or_url,
fallback_urls)))
end
end
image_util.rb
require 'tempfile'
require 'shell'
module ImageUtil
module_function
def urls2files urls_or_url,
fallback_urls=[]
urls2images(urls_or_url,
fallback_urls).map(&:file)
end
end
image_util.rb
module ImageUtil
module_function
def urls2images urls_or_url,
fallback_urls=[]
urls = [urls_or_url].flatten
w = Waiter.new
results = {}
# ...
w.yield.sort.map(&:last).compact
end
end
(Cont
image_util.rb
def urls2images ...
urls.zip([fallback_urls].flatten).
each.with_index do |(url, fb), idx|
ImageFile.from_url(url, fb) do |img|
results[idx] = img
w.resume(results) if
results.size == urls.size
end
end
w.yield.sort.map(&:last).compact
(Cont
image_util.rb
module ImageUtil
module_function
def merge_images images
# ...
end
ImageStruct =
Struct.new(:width, :height, :file)
class ImageFile < ImageStruct
include ImageUtil
# ...
end
(Cont
image_util.rb
module ImageUtil
module_function
def wget?
@wget ||= !`which wget`.strip.empty?
end
end
(Cont
image_util.rb
module ImageUtil
module_function
def wget_command path, url
if wget?
['wget', '-O', path,
'--no-check-certificate', url]
else
['curl', '-o', path,
'--insecure' , url]
end
end
end
(Cont
image_util.rb
def identify_command path
['identify', '-format', '%wx%h',
path]
end
def identify_result output
if m = output.match(/(d+)x(d+)/)
[m[1], m[2]].map(&:to_i)
else
nil
end
end
(Cont
•image_util.rb
•run_later.rb
•/search
•/create_and_share
Ruby Codes
(Cont.) (Cont.)
run_later.rb
require 'concurrency'
module RunLater
module_function
def with
if EM.reactor_running?
EM.next_tick{
Concurrency.wrap{ yield } }
else
yield
end
end
end
•image_util.rb
•run_later.rb
•/search
•/create_and_share
Ruby Codes
(Cont.) (Cont.)
/search
get '/search' do
params['q'].blank? &&
missing_arguments('q') # this raises
images, total = if limit == 0
[[], 0]
else
# ...
end
# ...
end
/search
case params['engine']
when 'pinterest'; sch_pinterest
when 'pinterest_api'; sch_pinterest_api
when 'bing' ; sch_bing offset, limit
when 'azure' ; sch_azure offset, limit
when 'google'; sch_google offset, limit
when 'flickr'; sch_flickr offset, limit
else ; sch_google offset, limit
# default google
end
(Cont.)
/search
render('search' =>
with_paging('total' => total,
'limit' => limit,
'offset' => offset,
'q' => params[:q],
'engine' => engine,
'data' => images))
(Cont.)
/search
def search_from_google offset, limit
google = RC::GoogleImage.new(
referer: request.url,
userip: request.ip)
search_image_and_flatten(
google, offset, limit) do |q, n, i|
google.search_image(
q, rsz: n, start: i)
end
end
(Cont.)
•image_util.rb
•run_later.rb
•/search
•/create_and_share
Ruby Codes
(Cont.) (Cont.)
/create_and_share
post '/collages' do
render_collage create_collage
end
post '/collages/create_and_share' do
render_collage create_collage{ |c|
transfer "/collages/#{c.id}/share" }
end
/create_and_share
def transfer path
status, headers, body =
jellyfish.call(
env.merge('PATH_INFO' => path))
self.status status
self.headers headers
self.body body
end
(Co
/create_and_share
def create_collage &upload_callback
para = params
image = (para['image']||{})[:tempfile]
plist = case para['plist']
when Hash; para['plist'][:tempfile]
else ; para['plist']
end
# ...
(Co
/create_and_share
if image
# ...
else
missing_arguments('image')
end
(Co
/create_and_share
c_para = params.merge('plist' => plist)
c_para.delete('image')
if rc_tumblr &&
for_auths_and_clients.empty?
# no user for tumblr
else # check user for any other cases
c_para['user'] =
current_user_with_check
end
(Co
/create_and_share
c = Collage.create_with_params(c_para)
# make paperclip happy
image.extend(OriginalFilename)
image.original_filename =
params['image'][:filename]
c.save_image(image, &upload_callback)
(Co
/create_and_share
def save_image img, &block
save_dimension img
process_thumbnails img, &block
self
end
(Co
(Co/create_and_share
def process_thumbnails img, &blk
if blk
RunLater.with do
process_thumbnails_inplace img
if blk.arity == 1; blk.call(self)
else ; blk.call; end
end
else
process_thumbnails_inplace img
end
end
•crazy inspect
Miscellaneous Extras
•crazy inspect
•who cares backtrace for 404
Miscellaneous Extras
•crazy inspect
•who cares backtrace for 404
•assets pipeline and
database connection
Miscellaneous Extras
•crazy inspect
•who cares backtrace for 404
•assets pipeline and
database connection
•fiber stack overflow
Miscellaneous Extras
•crazy inspect
•who cares backtrace for 404
•assets pipeline and
database connection
•fiber stack overflow
•fiber database connection pool
Miscellaneous Extras
•crazy inspect
•who cares backtrace for 404
•assets pipeline and
database connection
•fiber stack overflow
•fiber database connection pool
•thread-safe kaminari patch
Miscellaneous Extras
Q?

More Related Content

What's hot

FOSDEM 2017: GitLab CI
FOSDEM 2017:  GitLab CIFOSDEM 2017:  GitLab CI
FOSDEM 2017: GitLab CI
OlinData
 
Deployment Patterns in the Ruby on Rails World
Deployment Patterns in the Ruby on Rails WorldDeployment Patterns in the Ruby on Rails World
Deployment Patterns in the Ruby on Rails World
Nikhil Mungel
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
Hiroshi SHIBATA
 
CI with Gitlab & Docker
CI with Gitlab & DockerCI with Gitlab & Docker
CI with Gitlab & Docker
Joerg Henning
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
Bo-Yi Wu
 
Git hooks for front end developers
Git hooks for front end developersGit hooks for front end developers
Git hooks for front end developers
Bradley Gore
 
Gitlab ci, cncf.sk
Gitlab ci, cncf.skGitlab ci, cncf.sk
Gitlab ci, cncf.sk
Juraj Hantak
 
Webinar - Unbox GitLab CI/CD
Webinar - Unbox GitLab CI/CD Webinar - Unbox GitLab CI/CD
Webinar - Unbox GitLab CI/CD
Annie Huang
 
Taking containers from development to production
Taking containers from development to productionTaking containers from development to production
Taking containers from development to production
Suraj Deshmukh
 
Jenkins and rails app - Le Dinh Vu
Jenkins and rails app - Le Dinh VuJenkins and rails app - Le Dinh Vu
Jenkins and rails app - Le Dinh VuFramgia Vietnam
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a pro
sparkfabrik
 
Ruby and Rails Packaging to Production
Ruby and Rails Packaging to ProductionRuby and Rails Packaging to Production
Ruby and Rails Packaging to Production
Fabio Kung
 
Tekton showcase - CDF Summit Kubecon Barcelona 2019
Tekton showcase - CDF Summit Kubecon Barcelona 2019Tekton showcase - CDF Summit Kubecon Barcelona 2019
Tekton showcase - CDF Summit Kubecon Barcelona 2019
Christie Wilson
 
Devops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at GitlabDevops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at Gitlab
Filipa Lacerda
 
TDC2018SP | Trilha Containers - CI/CD com Docker e Drone
TDC2018SP | Trilha Containers - CI/CD com Docker e DroneTDC2018SP | Trilha Containers - CI/CD com Docker e Drone
TDC2018SP | Trilha Containers - CI/CD com Docker e Drone
tdc-globalcode
 
Gearman work queue in php
Gearman work queue in phpGearman work queue in php
Gearman work queue in php
Bo-Yi Wu
 
Advanced Node.JS Meetup
Advanced Node.JS MeetupAdvanced Node.JS Meetup
Advanced Node.JS Meetup
LINAGORA
 
The Future of Bundled Bundler
The Future of Bundled BundlerThe Future of Bundled Bundler
The Future of Bundled Bundler
Hiroshi SHIBATA
 

What's hot (20)

FOSDEM 2017: GitLab CI
FOSDEM 2017:  GitLab CIFOSDEM 2017:  GitLab CI
FOSDEM 2017: GitLab CI
 
Deployment Patterns in the Ruby on Rails World
Deployment Patterns in the Ruby on Rails WorldDeployment Patterns in the Ruby on Rails World
Deployment Patterns in the Ruby on Rails World
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
 
CI with Gitlab & Docker
CI with Gitlab & DockerCI with Gitlab & Docker
CI with Gitlab & Docker
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
 
Git hooks
Git hooksGit hooks
Git hooks
 
Git hooks
Git hooksGit hooks
Git hooks
 
Git hooks for front end developers
Git hooks for front end developersGit hooks for front end developers
Git hooks for front end developers
 
Gitlab ci, cncf.sk
Gitlab ci, cncf.skGitlab ci, cncf.sk
Gitlab ci, cncf.sk
 
Webinar - Unbox GitLab CI/CD
Webinar - Unbox GitLab CI/CD Webinar - Unbox GitLab CI/CD
Webinar - Unbox GitLab CI/CD
 
Taking containers from development to production
Taking containers from development to productionTaking containers from development to production
Taking containers from development to production
 
Jenkins and rails app - Le Dinh Vu
Jenkins and rails app - Le Dinh VuJenkins and rails app - Le Dinh Vu
Jenkins and rails app - Le Dinh Vu
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a pro
 
Ruby and Rails Packaging to Production
Ruby and Rails Packaging to ProductionRuby and Rails Packaging to Production
Ruby and Rails Packaging to Production
 
Tekton showcase - CDF Summit Kubecon Barcelona 2019
Tekton showcase - CDF Summit Kubecon Barcelona 2019Tekton showcase - CDF Summit Kubecon Barcelona 2019
Tekton showcase - CDF Summit Kubecon Barcelona 2019
 
Devops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at GitlabDevops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at Gitlab
 
TDC2018SP | Trilha Containers - CI/CD com Docker e Drone
TDC2018SP | Trilha Containers - CI/CD com Docker e DroneTDC2018SP | Trilha Containers - CI/CD com Docker e Drone
TDC2018SP | Trilha Containers - CI/CD com Docker e Drone
 
Gearman work queue in php
Gearman work queue in phpGearman work queue in php
Gearman work queue in php
 
Advanced Node.JS Meetup
Advanced Node.JS MeetupAdvanced Node.JS Meetup
Advanced Node.JS Meetup
 
The Future of Bundled Bundler
The Future of Bundled BundlerThe Future of Bundled Bundler
The Future of Bundled Bundler
 

Viewers also liked

Concurrent Ruby Application Servers
Concurrent Ruby Application ServersConcurrent Ruby Application Servers
Concurrent Ruby Application ServersLin Jen-Shin
 
2012 05-08-lambda-draft
2012 05-08-lambda-draft2012 05-08-lambda-draft
2012 05-08-lambda-draftLin Jen-Shin
 
2007-06-24 The Lost Piece
2007-06-24 The Lost Piece2007-06-24 The Lost Piece
2007-06-24 The Lost PieceLin Jen-Shin
 
2010-04-13 Reactor Pattern & Event Driven Programming 2
2010-04-13 Reactor Pattern & Event Driven Programming 22010-04-13 Reactor Pattern & Event Driven Programming 2
2010-04-13 Reactor Pattern & Event Driven Programming 2Lin Jen-Shin
 
2010 04-24-cerealize
2010 04-24-cerealize2010 04-24-cerealize
2010 04-24-cerealizeLin Jen-Shin
 
2008-01-25 Tangible Value
2008-01-25 Tangible Value2008-01-25 Tangible Value
2008-01-25 Tangible ValueLin Jen-Shin
 
2010-02-09 Reactor Pattern & Event Driven Programming
2010-02-09 Reactor Pattern & Event Driven Programming2010-02-09 Reactor Pattern & Event Driven Programming
2010-02-09 Reactor Pattern & Event Driven ProgrammingLin Jen-Shin
 

Viewers also liked (7)

Concurrent Ruby Application Servers
Concurrent Ruby Application ServersConcurrent Ruby Application Servers
Concurrent Ruby Application Servers
 
2012 05-08-lambda-draft
2012 05-08-lambda-draft2012 05-08-lambda-draft
2012 05-08-lambda-draft
 
2007-06-24 The Lost Piece
2007-06-24 The Lost Piece2007-06-24 The Lost Piece
2007-06-24 The Lost Piece
 
2010-04-13 Reactor Pattern & Event Driven Programming 2
2010-04-13 Reactor Pattern & Event Driven Programming 22010-04-13 Reactor Pattern & Event Driven Programming 2
2010-04-13 Reactor Pattern & Event Driven Programming 2
 
2010 04-24-cerealize
2010 04-24-cerealize2010 04-24-cerealize
2010 04-24-cerealize
 
2008-01-25 Tangible Value
2008-01-25 Tangible Value2008-01-25 Tangible Value
2008-01-25 Tangible Value
 
2010-02-09 Reactor Pattern & Event Driven Programming
2010-02-09 Reactor Pattern & Event Driven Programming2010-02-09 Reactor Pattern & Event Driven Programming
2010-02-09 Reactor Pattern & Event Driven Programming
 

Similar to The Architecture of PicCollage Server

Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...Nilesh Panchal
 
mtl_rubykaigi
mtl_rubykaigimtl_rubykaigi
mtl_rubykaigi
Hirotomo Oi
 
OpenStack Deployments with Chef
OpenStack Deployments with ChefOpenStack Deployments with Chef
OpenStack Deployments with Chef
Matt Ray
 
Practical introduction to dev ops with chef
Practical introduction to dev ops with chefPractical introduction to dev ops with chef
Practical introduction to dev ops with chefLeanDog
 
Chef for OpenStack - OpenStack Fall 2012 Summit
Chef for OpenStack  - OpenStack Fall 2012 SummitChef for OpenStack  - OpenStack Fall 2012 Summit
Chef for OpenStack - OpenStack Fall 2012 Summit
Matt Ray
 
Chef for OpenStack- Fall 2012.pdf
Chef for OpenStack- Fall 2012.pdfChef for OpenStack- Fall 2012.pdf
Chef for OpenStack- Fall 2012.pdf
OpenStack Foundation
 
Kubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd について
Kubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd についてKubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd について
Kubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd について
LINE Corporation
 
Achieving Infrastructure Portability with Chef
Achieving Infrastructure Portability with ChefAchieving Infrastructure Portability with Chef
Achieving Infrastructure Portability with Chef
Matt Ray
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发
shaokun
 
Australian OpenStack User Group August 2012: Chef for OpenStack
Australian OpenStack User Group August 2012: Chef for OpenStackAustralian OpenStack User Group August 2012: Chef for OpenStack
Australian OpenStack User Group August 2012: Chef for OpenStack
Matt Ray
 
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
Michitoshi Yoshida
 
SCALE 10x Build a Cloud Day
SCALE 10x Build a Cloud DaySCALE 10x Build a Cloud Day
SCALE 10x Build a Cloud Day
Chef Software, Inc.
 
Handling Redis failover with ZooKeeper
Handling Redis failover with ZooKeeperHandling Redis failover with ZooKeeper
Handling Redis failover with ZooKeeperryanlecompte
 
The Operator Pattern - Managing Stateful Services in Kubernetes
The Operator Pattern - Managing Stateful Services in KubernetesThe Operator Pattern - Managing Stateful Services in Kubernetes
The Operator Pattern - Managing Stateful Services in Kubernetes
QAware GmbH
 
Capybara + RSpec - ruby dsl-based web ui qa automation
Capybara + RSpec - ruby dsl-based web ui qa automationCapybara + RSpec - ruby dsl-based web ui qa automation
Capybara + RSpec - ruby dsl-based web ui qa automation
COMAQA.BY
 
视觉中国的MongoDB应用实践(QConBeijing2011)
视觉中国的MongoDB应用实践(QConBeijing2011)视觉中国的MongoDB应用实践(QConBeijing2011)
视觉中国的MongoDB应用实践(QConBeijing2011)
Night Sailer
 
Ruby on Rails : 簡介與入門
Ruby on Rails : 簡介與入門Ruby on Rails : 簡介與入門
Ruby on Rails : 簡介與入門Wen-Tien Chang
 
Running Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on HadoopRunning Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on Hadoop
clairvoyantllc
 

Similar to The Architecture of PicCollage Server (20)

Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
 
Rails Performance
Rails PerformanceRails Performance
Rails Performance
 
mtl_rubykaigi
mtl_rubykaigimtl_rubykaigi
mtl_rubykaigi
 
OpenStack Deployments with Chef
OpenStack Deployments with ChefOpenStack Deployments with Chef
OpenStack Deployments with Chef
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Practical introduction to dev ops with chef
Practical introduction to dev ops with chefPractical introduction to dev ops with chef
Practical introduction to dev ops with chef
 
Chef for OpenStack - OpenStack Fall 2012 Summit
Chef for OpenStack  - OpenStack Fall 2012 SummitChef for OpenStack  - OpenStack Fall 2012 Summit
Chef for OpenStack - OpenStack Fall 2012 Summit
 
Chef for OpenStack- Fall 2012.pdf
Chef for OpenStack- Fall 2012.pdfChef for OpenStack- Fall 2012.pdf
Chef for OpenStack- Fall 2012.pdf
 
Kubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd について
Kubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd についてKubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd について
Kubernetes上で動作する機械学習モジュールの配信&管理基盤Rekcurd について
 
Achieving Infrastructure Portability with Chef
Achieving Infrastructure Portability with ChefAchieving Infrastructure Portability with Chef
Achieving Infrastructure Portability with Chef
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发
 
Australian OpenStack User Group August 2012: Chef for OpenStack
Australian OpenStack User Group August 2012: Chef for OpenStackAustralian OpenStack User Group August 2012: Chef for OpenStack
Australian OpenStack User Group August 2012: Chef for OpenStack
 
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
 
SCALE 10x Build a Cloud Day
SCALE 10x Build a Cloud DaySCALE 10x Build a Cloud Day
SCALE 10x Build a Cloud Day
 
Handling Redis failover with ZooKeeper
Handling Redis failover with ZooKeeperHandling Redis failover with ZooKeeper
Handling Redis failover with ZooKeeper
 
The Operator Pattern - Managing Stateful Services in Kubernetes
The Operator Pattern - Managing Stateful Services in KubernetesThe Operator Pattern - Managing Stateful Services in Kubernetes
The Operator Pattern - Managing Stateful Services in Kubernetes
 
Capybara + RSpec - ruby dsl-based web ui qa automation
Capybara + RSpec - ruby dsl-based web ui qa automationCapybara + RSpec - ruby dsl-based web ui qa automation
Capybara + RSpec - ruby dsl-based web ui qa automation
 
视觉中国的MongoDB应用实践(QConBeijing2011)
视觉中国的MongoDB应用实践(QConBeijing2011)视觉中国的MongoDB应用实践(QConBeijing2011)
视觉中国的MongoDB应用实践(QConBeijing2011)
 
Ruby on Rails : 簡介與入門
Ruby on Rails : 簡介與入門Ruby on Rails : 簡介與入門
Ruby on Rails : 簡介與入門
 
Running Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on HadoopRunning Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on Hadoop
 

Recently uploaded

The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 

Recently uploaded (20)

The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 

The Architecture of PicCollage Server