SlideShare uma empresa Scribd logo
1 de 74
Baixar para ler offline
Sinatra
Past, Present and Future
      Konstantin Haase
Hi!

I'm Konstantin.

 I write code.
Back in the internet, I'm aka'ed as

@konstantinhaase on Titter

         rkh on GitHub

         khaase on IRC

        rkh.im on DNS
"The big lesson in life, baby, is never
 be scared of anyone or anything."

             Frank Sinatra
"Outlines are great, quotes are
           terrible."

Ben Orenstein (Speaking For Hackers)
Outline
  The Past

 The Present

 The Future
Let's pretend you don't
     know a thing...
        ... about Sinatra

         ... about Rails

         ... about Rack
The Past
Or: "How We Do HTTP"
1993

CGI
#!/usr/bin/env perl
print "Content-type: text/htmln";
if ($ENV{"REQUEST_METHOD"} != "HEAD") {
  print "n<h1>Hello Perl!</h1>n"
}
No structure (Hello, inline SQL!)

Enormous performance overhead

No asynchronous/streaming API

         Perl? Seriously?
December 21, 1995

Ruby 0.95
#!/usr/bin/env ruby
puts "Content-Type: text/html"

if ENV["REQUEST_METHOD"] != "HEAD"
  puts "", "<h1>Hello Ruby!</h1>"
end
Servlets
require 'webrick'

class Simple < WEBrick::HTTPServlet
  def do_GET(req, res)
    res.status = 200
    res['Content-Type'] = "text/html"
    res.body = "<h1>Hello Ruby!</h1>"
  end
end
Not web server independent

No asynchronous/streaming API

     Limited eco system
July 2004

Ruby On Rails
Oh

My

God!
Convention Over Configuration

   Do Not Repeat Yourself

  Model - View - Controler

           Testing

   The eco system, oh my!
Did not play well with others

   Framework, not a library

No asynchronous/streaming API
Summer 2005

I discover Ruby!
    Woohoo!
December 13, 2005

 Rails 1.0
March 2007

Rack 0.1
proc do |env|
  [200, {"Content-Type" => "text/html"},
    ["<h1>Hello Ruby!</h1>"]]
end
The simplest thing possible

    Zero dependency applications

Great middleware/router infrastrucutre

   Server independent applications

             Easy testing
Near unusable directly

      Rails didn't use it

No asynchronous/streaming API
September 9, 2007

Sinatra 0.0.1
get('/') { body "Hello World!" }
post('/') { erb :posted }
Simple and clean DSL for writing Rack
             application.

       Library, not framework

    Plays well with anything Rack

          No hidden magic
Pollutes Object

 Uses instance_eval (slow)

No asynchronous/streaming API

 One application per process
October 7, 2007

Sinatra 0.1.0
October 8, 2007

Sinatra 0.1.5
before { puts "starting" }
get('/') { "Hello World!" }
delete('/') { haml :deleted }

after { puts "done" }
November 21, 2007

rm -Rf sinatra
April 12, 2008

Sinatra 0.2.0
 (Complete Rewrite)
before { halt 404 if path !~ /css/ }
error(404) { "page not found" }

get '/:name.css', :agent => /Firefox/ do
  sass :firefox
end
April 14, 2008

rm -Rf sinatra
September 8, 2008

Sinatra 0.3.0
use Rack::Lint
configure { enable :lock }
get('/*.css') { sass :style }

__END__

@@ style
body
  color: red
# config.ru
use SomeMiddleware
map('/a') { run Sinatra::Application }
map('/b') { run Merb::Application }
December 13, 2008

rm -Rf sinatra
January 18, 2009

Sinatra 0.9.0
class MyApp < Sinatra::Base
  get /js(on)?/, :provides => "json" do
    pass unless params[:pwd] == "foo"
    "Hello World".to_json
  end
  get "*" do
    "wrong password, probably"
  end
end
No more instance_eval for routes

More than one application per process
March 23, 2010

   Sinatra 1.0
Major Refactorings since 0.9.0
Tilt has been extracted

A ton of new helper methods

    Semantic Versioning
April - September 2010

Maintainance crisis
October 24, 2010

   1.1.0
before agent: /Firefox/ do
  headers['X-Is-Firefox'] = "yes"
end
get('/') { markdown "# Hello World!" }
March 3, 2011

   1.2.0
Major Refactoring
Live release at Ruby Use Group Berlin

        Better extension API

           Better security

         Long term support
September 30, 2011

    1.3.0
Live release at RubyConf in New Orleans

       Better HTTP compatibility

    Better security (rack-protection)

   Stream/asynchronous API, finally!
get '/' do
  stream do |out|
    out << "It's gonna be legen -n"
    sleep 0.5
   out << " (wait for it) n"
   sleep 1

    out << "- dary!n"
  end
end
connections = []

get '/' do
  stream(:keep_open) do |out|
    connections << out
  end
end
post '/' do
  connections.each do |out|
    out << params[:message]
  end

  "message sent"
end
The Present
Who's using it?
        Travis CI, Integrity, CI Joe

          Picky, Resque, Gollum

      Heroku, Github, Engine Yard

Songbird, University of Lausanne, Stanford

Apple, LinkedIn, British Government, BBC

                     ...
It inspired a lot of other
         projects!
Ruby: Almost Sinatra, Astaire, Cuba, Padrino (based on Sinatra), Pakyow,
     Renee PHP: Fat-Free, Fitzgerald, Glue, klein, Laravel, Limonade,
 MiMViC, Silex, Slim JavaScript: Express, Picard, Roundabout, Sammy
CoffeeScript: Zappa Python: Bottle, Denied, Flask, itty, Juno Erlang:
   Fresh, Spooky Groovy: Graffiti, Ratpack Scala: Scalatra, BlueEyes
  .NET: Martin, Nancy, Nina Perl: Dancer, Mojolicious Java: Spark,
 Napalm, Htmleasy Haskell: Bird, Loli Fancy: Sinatra.fy Bash: Astley,
  sh.inatra C: Bogart F#: Frank Lua: Mercury, Orbit Mirah: Shatner
     Objective-C: RCRouter Vala: Valatra Smalltalk: RatPack

           That's 52 projects in 20 languages.
The Future
2012

Sinatra 1.4.0
No longer pollute Object
# Sinatra since 0.9.0
include Sinatra::Delegator

10.send(:get, '/') do
  "this works, but it shouldn't"
end
def foo
  42
end

foo # => 42
"hi there".foo # => 42
self # => main

def self.foo
  42
end

foo # => 42
"hi there".foo # NoMethodError
class << self
  include Sinatra::Delegator
end
10.send(:get, '/') do
  "Now this raises a NoMethodError"
end
extend Sinatra::Delegator

10.send(:get, '/') do
  "Now this raises a NoMethodError"
end
some day

Sinatra 2.0
Use successor of Rack (code name Ponies)

           rm -Rf sinatra?
Thanks!
github.com / rkh / presentations

Mais conteúdo relacionado

Mais procurados

nginxをソースからインストールしてみたよ
nginxをソースからインストールしてみたよnginxをソースからインストールしてみたよ
nginxをソースからインストールしてみたよ
mamoru tateoka
 
Ruby projects of interest for DevOps
Ruby projects of interest for DevOpsRuby projects of interest for DevOps
Ruby projects of interest for DevOps
Ricardo Sanchez
 
Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18
Pierre Joye
 
How to start using Scala
How to start using ScalaHow to start using Scala
How to start using Scala
Ngoc Dao
 

Mais procurados (20)

Async await...oh wait!
Async await...oh wait!Async await...oh wait!
Async await...oh wait!
 
Blending django, Sockjs, Twisted, Celery, FTP and some magic sauce into a bla...
Blending django, Sockjs, Twisted, Celery, FTP and some magic sauce into a bla...Blending django, Sockjs, Twisted, Celery, FTP and some magic sauce into a bla...
Blending django, Sockjs, Twisted, Celery, FTP and some magic sauce into a bla...
 
Building MapAttack
Building MapAttackBuilding MapAttack
Building MapAttack
 
Automating Your Daily Tasks with Scripting - RubyConf 2015 Taiwan
Automating Your Daily Tasks with Scripting - RubyConf 2015 TaiwanAutomating Your Daily Tasks with Scripting - RubyConf 2015 Taiwan
Automating Your Daily Tasks with Scripting - RubyConf 2015 Taiwan
 
JDO 2019: Serverless Hype Driven Development - Grzegorz Piotrowski
JDO 2019: Serverless Hype Driven Development - Grzegorz Piotrowski JDO 2019: Serverless Hype Driven Development - Grzegorz Piotrowski
JDO 2019: Serverless Hype Driven Development - Grzegorz Piotrowski
 
Fluentd v1 and Roadmap
Fluentd v1 and RoadmapFluentd v1 and Roadmap
Fluentd v1 and Roadmap
 
How *NOT* to firmware
How *NOT* to firmwareHow *NOT* to firmware
How *NOT* to firmware
 
nginxをソースからインストールしてみたよ
nginxをソースからインストールしてみたよnginxをソースからインストールしてみたよ
nginxをソースからインストールしてみたよ
 
Ruby projects of interest for DevOps
Ruby projects of interest for DevOpsRuby projects of interest for DevOps
Ruby projects of interest for DevOps
 
Asynchronous Python A Gentle Introduction
Asynchronous Python A Gentle IntroductionAsynchronous Python A Gentle Introduction
Asynchronous Python A Gentle Introduction
 
Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18
 
Why async matters
Why async mattersWhy async matters
Why async matters
 
Async programming and python
Async programming and pythonAsync programming and python
Async programming and python
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby underground
 
My Top 5 Favorite Gems
My Top 5 Favorite GemsMy Top 5 Favorite Gems
My Top 5 Favorite Gems
 
rioinfo2012
rioinfo2012rioinfo2012
rioinfo2012
 
Porting your favourite cmdline tool to Android
Porting your favourite cmdline tool to AndroidPorting your favourite cmdline tool to Android
Porting your favourite cmdline tool to Android
 
Perl6 web-app
Perl6 web-appPerl6 web-app
Perl6 web-app
 
Python, do you even async?
Python, do you even async?Python, do you even async?
Python, do you even async?
 
How to start using Scala
How to start using ScalaHow to start using Scala
How to start using Scala
 

Destaque (8)

The Blackberry Opportunity (RIM) 160612
The Blackberry Opportunity (RIM) 160612The Blackberry Opportunity (RIM) 160612
The Blackberry Opportunity (RIM) 160612
 
Laurent hasson blackberry
Laurent hasson blackberryLaurent hasson blackberry
Laurent hasson blackberry
 
JP Rangaswami SALESFORCE
JP Rangaswami SALESFORCEJP Rangaswami SALESFORCE
JP Rangaswami SALESFORCE
 
Native look and feel bbui & alicejs
Native look and feel bbui & alicejsNative look and feel bbui & alicejs
Native look and feel bbui & alicejs
 
Oren Michels MASHERY
Oren Michels MASHERYOren Michels MASHERY
Oren Michels MASHERY
 
Практики применения JRuby
Практики применения JRubyПрактики применения JRuby
Практики применения JRuby
 
Zvuk analiz sliv
Zvuk analiz slivZvuk analiz sliv
Zvuk analiz sliv
 
Develop with love bb10
Develop with love bb10Develop with love bb10
Develop with love bb10
 

Semelhante a Sinatra: прошлое, будущее и настоящее

Node.js for Rubists
Node.js for RubistsNode.js for Rubists
Node.js for Rubists
Sagiv Ofek
 
Jordan Hubbard Talk @ LISA
Jordan Hubbard Talk @ LISAJordan Hubbard Talk @ LISA
Jordan Hubbard Talk @ LISA
guest4c923d
 

Semelhante a Sinatra: прошлое, будущее и настоящее (20)

Ruby for Java Developers
Ruby for Java DevelopersRuby for Java Developers
Ruby for Java Developers
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
DiUS Computing Lca Rails Final
DiUS  Computing Lca Rails FinalDiUS  Computing Lca Rails Final
DiUS Computing Lca Rails Final
 
Node.js - The New, New Hotness
Node.js - The New, New HotnessNode.js - The New, New Hotness
Node.js - The New, New Hotness
 
Introduction to NodeJS with LOLCats
Introduction to NodeJS with LOLCatsIntroduction to NodeJS with LOLCats
Introduction to NodeJS with LOLCats
 
Rack
RackRack
Rack
 
Original slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talkOriginal slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talk
 
About Clack
About ClackAbout Clack
About Clack
 
Node.js for Rubists
Node.js for RubistsNode.js for Rubists
Node.js for Rubists
 
Nodejs a-practical-introduction-oredev
Nodejs a-practical-introduction-oredevNodejs a-practical-introduction-oredev
Nodejs a-practical-introduction-oredev
 
Jordan Hubbard Talk @ LISA
Jordan Hubbard Talk @ LISAJordan Hubbard Talk @ LISA
Jordan Hubbard Talk @ LISA
 
Node.js: CAMTA Presentation
Node.js: CAMTA PresentationNode.js: CAMTA Presentation
Node.js: CAMTA Presentation
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Rusted Ruby
Rusted RubyRusted Ruby
Rusted Ruby
 
Not only SQL
Not only SQL Not only SQL
Not only SQL
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
Functional Programming with Streams in node.js
Functional Programming with Streams in node.jsFunctional Programming with Streams in node.js
Functional Programming with Streams in node.js
 
Intro to introducing rust to ruby
Intro to introducing rust to rubyIntro to introducing rust to ruby
Intro to introducing rust to ruby
 
Jenkins pipeline -- Gentle Introduction
Jenkins pipeline -- Gentle IntroductionJenkins pipeline -- Gentle Introduction
Jenkins pipeline -- Gentle Introduction
 

Mais de .toster

Михаил Черномордиков
Михаил ЧерномордиковМихаил Черномордиков
Михаил Черномордиков
.toster
 
Андрей Юношев
Андрей Юношев Андрей Юношев
Андрей Юношев
.toster
 
Алексей Тарасенко - Zeptolab
Алексей Тарасенко - ZeptolabАлексей Тарасенко - Zeptolab
Алексей Тарасенко - Zeptolab
.toster
 
Maximiliano Firtman - Разработка приложений с помощью PhoneGap
Maximiliano Firtman - Разработка приложений с помощью PhoneGap Maximiliano Firtman - Разработка приложений с помощью PhoneGap
Maximiliano Firtman - Разработка приложений с помощью PhoneGap
.toster
 
Вадим Башуров
Вадим БашуровВадим Башуров
Вадим Башуров
.toster
 
Вадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимонВадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимон
.toster
 
Вадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимонВадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимон
.toster
 
Pablo Villalba -
Pablo Villalba - Pablo Villalba -
Pablo Villalba -
.toster
 
Jordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-eraJordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-era
.toster
 
Презентация Юрия Ветрова (Mail.ru Group)
Презентация Юрия Ветрова (Mail.ru Group)Презентация Юрия Ветрова (Mail.ru Group)
Презентация Юрия Ветрова (Mail.ru Group)
.toster
 
Внутренняя архитектура и устройства соц. сети "Одноклассники"
Внутренняя архитектура и устройства соц. сети "Одноклассники"Внутренняя архитектура и устройства соц. сети "Одноклассники"
Внутренняя архитектура и устройства соц. сети "Одноклассники"
.toster
 
Reusable Code, for good or for awesome!
Reusable Code, for good or for awesome!Reusable Code, for good or for awesome!
Reusable Code, for good or for awesome!
.toster
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
.toster
 
Wild wild web. html5 era
Wild wild web. html5 eraWild wild web. html5 era
Wild wild web. html5 era
.toster
 
Web matrix
Web matrixWeb matrix
Web matrix
.toster
 

Mais de .toster (19)

Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record
 
Decyphering Rails 3
Decyphering Rails 3Decyphering Rails 3
Decyphering Rails 3
 
Understanding the Rails web model and scalability options
Understanding the Rails web model and scalability optionsUnderstanding the Rails web model and scalability options
Understanding the Rails web model and scalability options
 
Михаил Черномордиков
Михаил ЧерномордиковМихаил Черномордиков
Михаил Черномордиков
 
Андрей Юношев
Андрей Юношев Андрей Юношев
Андрей Юношев
 
Алексей Тарасенко - Zeptolab
Алексей Тарасенко - ZeptolabАлексей Тарасенко - Zeptolab
Алексей Тарасенко - Zeptolab
 
Maximiliano Firtman - Разработка приложений с помощью PhoneGap
Maximiliano Firtman - Разработка приложений с помощью PhoneGap Maximiliano Firtman - Разработка приложений с помощью PhoneGap
Maximiliano Firtman - Разработка приложений с помощью PhoneGap
 
Вадим Башуров
Вадим БашуровВадим Башуров
Вадим Башуров
 
Вадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимонВадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимон
 
Вадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимонВадим Башуров - Как откусить от яблока лимон
Вадим Башуров - Как откусить от яблока лимон
 
Pablo Villalba -
Pablo Villalba - Pablo Villalba -
Pablo Villalba -
 
Jordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-eraJordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-era
 
Презентация Юрия Ветрова (Mail.ru Group)
Презентация Юрия Ветрова (Mail.ru Group)Презентация Юрия Ветрова (Mail.ru Group)
Презентация Юрия Ветрова (Mail.ru Group)
 
Внутренняя архитектура и устройства соц. сети "Одноклассники"
Внутренняя архитектура и устройства соц. сети "Одноклассники"Внутренняя архитектура и устройства соц. сети "Одноклассники"
Внутренняя архитектура и устройства соц. сети "Одноклассники"
 
Reusable Code, for good or for awesome!
Reusable Code, for good or for awesome!Reusable Code, for good or for awesome!
Reusable Code, for good or for awesome!
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
Wild wild web. html5 era
Wild wild web. html5 eraWild wild web. html5 era
Wild wild web. html5 era
 
Web matrix
Web matrixWeb matrix
Web matrix
 
NodeJS
NodeJSNodeJS
NodeJS
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Último (20)

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 

Sinatra: прошлое, будущее и настоящее