SlideShare uma empresa Scribd logo
1 de 126
Baixar para ler offline
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?

Mais conteúdo relacionado

Mais procurados

FOSDEM 2017: GitLab CI
FOSDEM 2017:  GitLab CIFOSDEM 2017:  GitLab CI
FOSDEM 2017: GitLab CIOlinData
 
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 WorldNikhil Mungel
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mrubyHiroshi SHIBATA
 
CI with Gitlab & Docker
CI with Gitlab & DockerCI with Gitlab & Docker
CI with Gitlab & DockerJoerg Henning
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and PracticeBo-Yi Wu
 
Git hooks for front end developers
Git hooks for front end developersGit hooks for front end developers
Git hooks for front end developersBradley Gore
 
Gitlab ci, cncf.sk
Gitlab ci, cncf.skGitlab ci, cncf.sk
Gitlab ci, cncf.skJuraj 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 productionSuraj 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 prosparkfabrik
 
Ruby and Rails Packaging to Production
Ruby and Rails Packaging to ProductionRuby and Rails Packaging to Production
Ruby and Rails Packaging to ProductionFabio 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 2019Christie Wilson
 
Devops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at GitlabDevops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at GitlabFilipa 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 Dronetdc-globalcode
 
Gearman work queue in php
Gearman work queue in phpGearman work queue in php
Gearman work queue in phpBo-Yi Wu
 
Advanced Node.JS Meetup
Advanced Node.JS MeetupAdvanced Node.JS Meetup
Advanced Node.JS MeetupLINAGORA
 
The Future of Bundled Bundler
The Future of Bundled BundlerThe Future of Bundled Bundler
The Future of Bundled BundlerHiroshi SHIBATA
 

Mais procurados (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
 

Destaque

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
 

Destaque (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
 

Semelhante a 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
 
OpenStack Deployments with Chef
OpenStack Deployments with ChefOpenStack Deployments with Chef
OpenStack Deployments with ChefMatt 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 SummitMatt Ray
 
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 ChefMatt 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 OpenStackMatt Ray
 
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜
DBA だってもっと効率化したい!〜最近の自動化事情とOracle Database〜Michitoshi Yoshida
 
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 KubernetesQAware 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 automationCOMAQA.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 Hadoopclairvoyantllc
 

Semelhante a 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
 

Último

Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 

Último (20)

Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 

The Architecture of PicCollage Server