SlideShare ist ein Scribd-Unternehmen logo
1 von 105
PyWPS a tutorial for beginners and developers Jorge de Jesus (Plymouth Marine Laboratory) Luca Casagrande (Università degli Studi di Perugia)  Jachym Čepicky (Help Service – Remote Sensing Company)
Before starting Please put your OSGEO livecd or usb-stick inside your laptop and start your machine.
Program Introduction part WPS Standard and PyWPS Newbie part Installation, setup and first process Developers part PyWPS in detail, mod_python,jython, GRASS Gallery Examples of applications using PyWPS
Introduction Section
Install the tutorial Open Firefox and download the script from the pyWPS main page: http://pywps.wald.intevation.org/ Make it executable  (password is user) : sudo chmod +x install_pywps_svn.sh Start the script: sudo ./install_pywps_svn.sh You can edit files using nano, but remember to always use sudo  (password is user) .
Definitions Web Processing Service (WPS)  is  an OGC standard  protocol to make GIS calculation available to the internet Open Geospatial Consortium (OGC) is a non-profit, international, voluntary consensus standards organization that is leading  the development of standard for geospatial  and location based service.
WPS standard ... provides rules for  standardizing how inputs and outputs (requests and responses)   for geospatial processing services , such as polygon overlay. The standard also defines how a client can request the execution of a process, and how the output from the process is handled..
Invoking WPS server ,[object Object]
HTTP POST method, using XML format of the request
SOAP For this tutorial we will use just the HTTP GET method
Key Value Pairs request http://localhost/cgi-bin/wps.py?service=WPS&request=GetCapabilities http://localhost/cgi-bin/wps.py  Is the  server address The ? sign indicates, that the  request parameters will start service=WPS&request=GetCapabilities The KVP-encoded request.   We send two request parameters to the server: service - which we set to WPS request - which is set to GetCapabilities
XML Request In this case, the request is encoded in XML form and send to the server directly via HTTP POST (the WPS server will read the file from standard input directly). <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <ows:GetCapabilities xmlns:ows=&quot;http://www.opengis.net/ows/1.1&quot; > <ows:AcceptVersions> <ows:Version>1.0.0</ows:Version> </ows:AcceptVersions> </ows:GetCapabilities>
WPS operations ,[object Object]
DescribeProcess:  returns a description a process including its inputs and outputs
Execute:  returns the output(s) of a process
Despite the specification that requests should be case insensitive,  it is recommended to use the upper camel case standard in all sorts of WPS operation requests
GetCapabilities Mandatory parameters: service,request The server returns basic Capabilities document. Among others it contains: ,[object Object]
Service provider (Name, Organization, Address, ...)
ProcessOfferings - List of available processes http://apps.esdi-humboldt.cz/pywps/?service=WPS&request=GetCapabilities
DescribeProcess Mandatory parameters: version, name of the process or “all” keyword The ProcessDescriptions document contains detailed description of selected processes. Each process is identified by: ,[object Object]
Identifier
DataInputs
DataOutputs http://apps.esdi-humboldt.cz/pywps/?service=WPS&version=1.0.0& request=DescribeProcess& identifier=all
Execute Mandatory parameters: No mandatory parameters http://apps.esdi-humboldt.cz/pywps/?service=WPS&version=1.0.0& request=Execute& identifier=literalprocess& datainputs=[int=1;float=3.2;zeroset=0;string=spam]
KVP inputs encoding ,[object Object]
An equal sign (=) shall be used to separate an input name from its value and attributes, and an attribute name from its value
An at symbol (@) shall be used to separate an input value from its attributes and one attribute from another.
All field values and attribute values shall be encoded using the standard Internet practice for encoding URLs
PyWPS also supports the use of [ ] to group the datainputs as follows: datainputs=[int=1;float=3.2]
Description of Data Inputs and Outputs Three types of inputs and outputs are defined in the OGC standard.  LiteralData, ComplexData and BoundingBox  data.
LiteralData LiteralData can be any character string, float,date, etc normally described as Primitive datatype in the W3C XML WPS standard also allows the use of UOM (Unit of Measures), default values and AllowedValues.
ComplexData Complex Data data type is used for pasting complex - Vector- Raster- or other data to the server or obtain it as result of the process.  There are two ways, how this complex data are handled: ,[object Object]
Or you send or obtain just  reference to the data  – URL to the file or service, where the data can be downloaded.
Bounding Box Data It is used to describe some sort of bounding box area .  The input description must state:  ,[object Object]
other CRS supported  &bboxInput=71.63,41.75,-70.78,42.90,urn:ogc:def:crs:EPSG:6.6:4326,2
PyWPS pyWPS is: ,[object Object]
Totally written in python 2.6
Organized into packages and classes for easy maintenance
Open to new developments and functionalities that can be integrated in WPS 1.0.0
Is run from bash or as a cgi process
pyWPS is not: ,[object Object]
Is not a XML parser or generator. It does not validate the GMLs against given schemas (yet), it does not build GML from Python objects
Can't be used to build general web applications like CherryPy framework PyWPS
PyWPS history 2006 ,[object Object]
First presentation held at FOSS4G 2006 Lausanne: &quot;GRASS goes web: pyWPS&quot; 2007 ,[object Object]
PyWPS history 2008 pyWPS 3.0.0 gets release: ,[object Object]
New simple configuration files
Support for multiple WPS servers with one pyWPS Installation
Support for internationalization
Simple code structure
New examples of processes
PyWPS history 2009 pyWPS 3.1.0 gets released with new features ,[object Object]
New generic WPS JavaScript library
Multiple fixes in both, source code and templates
New style In- and Outputs Complex object
Tons of bugs fixed
PyWPS history 2010 pyWPS is  recomended as THE WPS tool  in  GIGAS project  ( GEOSS, INSPIRE and GMES an Action in Support). As explained in the &quot;GIGAS Technology Watch Report WPS&quot; &quot;PyWPS Web Processing Service: is a Python program which implements the OGC WPS 1.0.0 standard (with a few omissions). PyWPS was chosen as it is up to date with the WPS standard and has a low footprint, making it easy to install on most Linux systems.”
Newbies Section
Installation Configuration file PyWPS instance / Wrapper Script First process
Installation Requirements: python – currently 2.5, 2.6 python – xml package htmltmpl engine older versions
For cool stuff  you may need: GRASS-GIS
Install files can be found in: SVN access to the latest code: Latest package: http://pywps.wald.intevation.org/download/ svn checkout https://svn.wald.intevation.org/svn/pywps/trunk http://wald.intevation.org/frs/download.php/589/pywps-3.1.0.tar.gz
Clean install: There's DEB and RPM packages. Badly maintain :( > tar -xvzf /tmp/pywps-VERSION.tar.gz > cd pywsp-VERSION > python setup.py install
<Installation from script, FOSS4G>
Testing the script by running the wps.py (/usr/bin) script If everything is ok.... > /usr/bin/wps.py PyWPS NoApplicableCode: Locator: None; Value: No query string found. Content-type: text/xml <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <ExceptionReport version=&quot;1.0.0&quot; xmlns=&quot;http://www.opengis.net/ows&quot;... > <Exception exceptionCode=&quot;NoApplicableCode&quot;> <ExceptionText> No query string found. </ExceptionText> </Exception> </ExceptionReport>
Configuration file for PyWPS can be located on several places. There are global and local PyWPS configuration files. Local files overwrite the global one Global : Local: /etc/pywps.cfg /usr/local/pywps-VERSION/etc/pywps.cfg Any path defined in the PYWPS_CFG environment variable
pywps.cfg is a Key = Value text file 4 sections are present in the file: Remember: The file is  case-sensitive [wps] [provide] [server] [grass]
Baisic meta information necessary to populate the WPS doc. Other variables aren't shown in this example [wps] title version abstract fees keywords lang
Server configuration options, path locations and URL translation and service limits Other variables aren't shown in this example Most important:  outputURL, outputPath, processPath [server] maxoperations maxinputparamlength maxfilesize outputUrl outputPath processesPath
outputURL: URL that will be used to point to the WPS outputs outputPath: Folder where PyWPS will drop the outputs (server accessible) http://localhost/wpsoutput http://rsg.pml.ac.uk/wps/wpsoutput /var/www/html/wpsoutput /usr/local/apache/htdocs/wps/wpsoutput /var/www/html/wpsoutput /var/www/html/wpsoutput
processPath: Folder path with stored processes It's important that these 3 parameters are properly configured /usr/local/pywps/processes /usr/local/pywps/processes /usr/local/pywps/processes /usr/local/pywps/processes /usr/local/pywps/processes /home/user/processes
PyWPS can be installed once in a server,  but  it may be configured to run several WPS services (instances). WPS instance Process folder pywps.cfg file
1) Setup a process folder 2) copy configuration file-template and edit it to desired configuration 3)  We need to populate the process directory  > mkdir -p /usr/local/wps/processes > cp pywps-VERSION/pywps/default.cfg /usr/local/wps/pywps.cfg > nano /usr/local/wps/pywps.cfg > cp pywps-VERSION/examples/ultimatequestionprocess.py /usr/local/wps/processes/
4) Every process in the process folder needs to be “registered in a file called __init__.py We've done 50% of an instance :) > cd /usr/local/wps/processes/ > echo &quot;__all__=['ultimatequestionprocess']&quot; > __init__.py __all__ it's a python array will the processe list
A WPS instance is just a script that alters some parameters before calling wps.py #!/bin/sh # Author: Jachym Cepicky # Purpose: CGI script for wrapping PyWPS script # Licence: GNU/GPL # Usage: Put this script to your web server cgi-bin directory, e.g. # /usr/lib/cgi-bin/ and make it executable (chmod 755 pywps.cgi) # NOTE: tested on linux/apache export PYWPS_CFG=/usr/local/wps/pywps.cfg export PYWPS_PROCESSES=/usr/local/wps/processes/ /usr/local/pywps-VERSION/wps.py $1 wps.cgi file
We need to configure  PYWPS_CFG  and  PYWPS_CFG   to specify the instance We can copy the wrapper script to Apache's cgi-bin folder Assuming that Apache is configure to support script execution... > cp wps.cgi  /usr/lib/cgi-bin http://localhost/cgi-bin/pywps.cgi?request=DescribeProcess & service=WPS&version=1.0.0& process=ultimatequestionprocess
<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <wps:ProcessDescriptions xmlns:wps=.... service=&quot;WPS&quot; version=&quot;1.0.0&quot; xml:lang=&quot;eng&quot;> <ProcessDescription wps:processVersion=&quot;2.0&quot; storeSupported=&quot;true&quot; statusSupported=&quot;true&quot;> <ows:Identifier>ultimatequestionprocess</ows:Identifier> <ows:Title>Answer to Life, the Universe and Everything</ows:Title> <ows:Abstract>....</ows:Abstract> <ProcessOutputs> <Output> <ows:Identifier>answer</ows:Identifier> <ows:Title>T he numerical answer to Life, Universe and Everything </ows:Title> <LiteralOutput> <ows:DataType >integer</ows:DataType> </LiteralOutput> </Output> </ProcessOutputs> </ProcessDescription> </wps:ProcessDescriptions>
PyWPS's assemble factory approach User's process POST GET SOAP GetCapabilities DescribeProcess Execute 1 2 1 Load  Process Check Properties WPS  output 2 Load  Process getInput run setOuput WPS  output
Process as an extended class of WPSProcess with  method run()  that will  execute the code WPSProcess class Process1 Process2 ProcessN
All processes have the following skeleton: WPSProcess class provides extra functionalities like: - Command line util: self.cmd() - Status setting: self.status.set(message,percentage) from pywps.Process.Process import WPSProcess  class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, < Process's information like: identifier, title, status >) < Inclusion of inputs and outputs to process class > def execute(self): < code >
Process's attributes: The only mandatory attribute is:  identifier class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, identifier=”firstprocess”, #same file name  title=”foo”,  abstract=”bacon and eggs”, version = &quot;0.1&quot;, storeSupported = &quot;true&quot;, statusSupported = &quot;true&quot;, <more WPS attributes if necessary>  )
3 types of Input/Output defined in WPS: Each Input/Output is a method of WPSProcess class Each Input/Output is created when class in initiated  LiteralData ComplexData BBOX
LiteralData ComplexData BBOX self.addLiteralInput(...) self.addLiteralOutput(...) self.addComplexInput(...) self.addComplexOutput(...) self.addBBoxInput(...) self.addBBoxOutput(...)
Each self.add*() defines/creates an input. The class constructor accepts the WPS parameters: Only  identifier and title  are mandatory self.Input1 = self.addLiteralInput( identifier = &quot;input1&quot;, title = &quot;Input1 number&quot;, abstract=”foo”, minOccurs=1,  type=types.IntType  default=&quot;100&quot;)
A more “Complex” example Only  identifier and title  are mandatory self.dataIn = self.addComplexInput( identifier=&quot;data&quot;, title=&quot;Input vector data&quot;, abstract=”foo” formats = [{'mimeType':'text/xml'}])
What about outputs  Identical syntax and procedure :) self.dataOut = self.addComplexOutput( identifier=&quot;output&quot;, title=&quot;Output vector data&quot;, formats =  [{'mimeType':'text/xml'}]) self.Output1 = self.addLiteralOutput( identifier=&quot;output1&quot;, title=&quot;foo&quot;)
The add*Input and add*Output are set in the  beginning of the class (__init__ method): from pywps.Process.Process import WPSProcess  class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, < Process's information like: identifier, title, status >) self.Input1=self.addLiteralInput(identifier=”input1”) self.dataOut =self.addComplexInput(identifier=”outputs”) <more inputs/outputs as needed>  def execute(self): < code >
OK we have WPS inputs and output, how can I get them ?!?!?! Using the JAVA get and set “philosophy” :) Each Input has a getValue() method  Each Output has a setValue() method  This is done inside the execute method()
Please check wiki  !!!! from pywps.Process.Process import WPSProcess  class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, < Process's information like: identifier, title, status >) self.Input1=self.addLiteralInput(identifier=”input1”) self.dataOut =self.addComplexInput(identifier=”outputs”) <more inputs/outputs as needed>  def execute(self): input1=self.Input1.getValue() XMLdata=”<xml>foo</xml>” self.dataOut.setValue(XMLData)  #input or file object
Fist Process, a returner process Process class initiation, identifier, WPS status and storeExecuteResponse definition  from pywps.Process import WPSProcess  class Process(WPSProcess): def __init__(self): ## # Process initialization WPSProcess.__init__(self, identifier = &quot;returner&quot;, title=&quot;Return process&quot;, abstract=&quot;&quot;&quot;This is demonstration process of PyWPS, returns the same file, it gets on input, as the output.&quot;&quot;&quot;, version = &quot;1.0&quot;, storeSupported = &quot;true&quot;, statusSupported = &quot;true&quot;)
Attention to indent !!! It's python !!!! ## # Adding process inputs self.dataIn = self.addComplexInput(identifier=&quot;data&quot;, title=&quot;Input vector data&quot;, formats = [{'mimeType':'text/xml'}]) self.textIn = self.addLiteralInput(identifier=&quot;text&quot;, title = &quot;Some width&quot;) ## # Adding process outputs self.dataOut = self.addComplexOutput(identifier=&quot;output&quot;, title=&quot;Output vector data&quot;, formats =  [{'mimeType':'text/xml'}]) self.textOut = self.addLiteralOutput(identifier = &quot;text&quot;, title=&quot;Output literal data&quot;) ## # Adding process inputs self.dataIn = self.addComplexInput(identifier=&quot;data&quot;, title=&quot;Input vector data&quot;, formats = [{'mimeType':'text/xml'}]) self.textIn = self.addLiteralInput(identifier=&quot;text&quot;, title = &quot;Some width&quot;)
Hopefully this will work: def execute(self): # just copy the input values to output values self.dataOut.setValue( self.dataIn.getValue() ) self.textOut.setValue( self.textIn.getValue() ) return http://localhost/python/wps.py?request=Execute& service=WPS& identifier=returner& Version=1.0.0& datainputs=[text=abc;data=<xml>foo</xml>]
Developers Section
Hacking ( wps.py code for dummies) Logging (and wood) GRASS (after the wood) Mod_Python (Pythons and Horses) Tomcat server (Pythons and Cats) Mapserver support (More OGC stuff) OpenLayers (Let there be layers.....)  SOAP/WSDL (Beatiful soap... so they say...)  PyCallGraph (The all enchilada!!!)
PyWPS's wps.py  has the following pseudo-code structure: Start wps.py: 1. Determine request_method (GET or POST) 2. if no input: raise Exception and exit 3. try: initiate PyWPS class according to request_method parse Request do Request get Response and make proper reply 4. exception: reply Error response
Some “Hacking” experiments: Exit if request is POST (around line 95): Encript a WPS response:
In PyWPS you can use the logging module anywhere in the code.  pywps.cfg file contains the path to the log file Then the file log will contain a line, like this:
Eclipse IDE is the default debugging platform using PyDEV tools Code to be debugged should contain a path to the PyDEV tools: After this path append, it is possible to import pydev module Now the code with pydevd is enabled for debbuging
Next step is to activate the debug server that will listen to the script. Now everytime that the python interperter finds: It will stop and send the variable to debug server  From eclipse it will be possible to continue or stop the script
 
PyWPS doesn't come with out-of-the-box tools PyPWS is Python, so connect, connect, connect !!!!!  To GRASS GIS You may work with a predefined grassLocation or a temporary one WPSProcess.__init__(self, identifier = &quot;foo&quot;, ... grassLocation = True ) Temporary grassLocation XY coordinate system
gisdbase  base path specified in configuration file (pywps.cfg) Absolute path in grassLocation OR
Commands passed as an array with command + arguments:
A total Pythonic way to connect to GRASS!!!!!!
&quot; Mod_python is an Apache module that embeds the Python interpreter within the server ”. In: http://www.modpython.org/ version 3.2 provides a wps.py script designed to be integrated into mod_python So what is the advantage ?! SPEED !!!!! 50x faster on request processing Integration with Apache's API Ability to handle request phases, filters and connections

Weitere ähnliche Inhalte

Was ist angesagt?

Java-Jersey 到 Python-Flask 服務不中斷重構之旅
Java-Jersey 到 Python-Flask 服務不中斷重構之旅Java-Jersey 到 Python-Flask 服務不中斷重構之旅
Java-Jersey 到 Python-Flask 服務不中斷重構之旅Max Lai
 
Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...
Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...
Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...Chris Fregly
 
HA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedHA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedGanapathi Kandaswamy
 
Intro to Ratpack (CDJDN 2015-01-22)
Intro to Ratpack (CDJDN 2015-01-22)Intro to Ratpack (CDJDN 2015-01-22)
Intro to Ratpack (CDJDN 2015-01-22)David Carr
 
OPNFV Update: The Danube Release and What Lies Around the Bend
OPNFV Update: The Danube Release and What Lies Around the BendOPNFV Update: The Danube Release and What Lies Around the Bend
OPNFV Update: The Danube Release and What Lies Around the BendJill Jensen Lovato
 
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014Puppet
 
Learn ELK in docker
Learn ELK in dockerLearn ELK in docker
Learn ELK in dockerLarry Cai
 
Maximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINXMaximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINXNGINX, Inc.
 
Blue host openstacksummit_2013
Blue host openstacksummit_2013Blue host openstacksummit_2013
Blue host openstacksummit_2013Jun Park
 
How go makes us faster (May 2015)
How go makes us faster (May 2015)How go makes us faster (May 2015)
How go makes us faster (May 2015)Wilfried Schobeiri
 
Firefox Crash Reporting (@ Open Source Bridge)
Firefox Crash Reporting (@ Open Source Bridge)Firefox Crash Reporting (@ Open Source Bridge)
Firefox Crash Reporting (@ Open Source Bridge)lauraxthomson
 
Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013
Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013
Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013Puppet
 
Queick: A Simple Job Queue System for Python
Queick: A Simple Job Queue System for PythonQueick: A Simple Job Queue System for Python
Queick: A Simple Job Queue System for PythonRyota Suenaga
 
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017Codemotion
 
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Leonid Vasilyev  "Building, deploying and running production code at Dropbox"Leonid Vasilyev  "Building, deploying and running production code at Dropbox"
Leonid Vasilyev "Building, deploying and running production code at Dropbox"IT Event
 
Oslo Vancouver Project Update
Oslo Vancouver Project UpdateOslo Vancouver Project Update
Oslo Vancouver Project UpdateBen Nemec
 
Task queuing with redis and rq
Task queuing with redis and rqTask queuing with redis and rq
Task queuing with redis and rqndeininger
 
Easily create dashboards to manage your databases with OVH
Easily create dashboards to manage your databases with OVH Easily create dashboards to manage your databases with OVH
Easily create dashboards to manage your databases with OVH OVHcloud
 

Was ist angesagt? (20)

Java-Jersey 到 Python-Flask 服務不中斷重構之旅
Java-Jersey 到 Python-Flask 服務不中斷重構之旅Java-Jersey 到 Python-Flask 服務不中斷重構之旅
Java-Jersey 到 Python-Flask 服務不中斷重構之旅
 
Nginx in production
Nginx in productionNginx in production
Nginx in production
 
Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...
Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...
Advanced Spark and TensorFlow Meetup 08-04-2016 One Click Spark ML Pipeline D...
 
HA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedHA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and Keepalived
 
Intro to Ratpack (CDJDN 2015-01-22)
Intro to Ratpack (CDJDN 2015-01-22)Intro to Ratpack (CDJDN 2015-01-22)
Intro to Ratpack (CDJDN 2015-01-22)
 
OPNFV Update: The Danube Release and What Lies Around the Bend
OPNFV Update: The Danube Release and What Lies Around the BendOPNFV Update: The Danube Release and What Lies Around the Bend
OPNFV Update: The Danube Release and What Lies Around the Bend
 
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
 
Learn ELK in docker
Learn ELK in dockerLearn ELK in docker
Learn ELK in docker
 
Maximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINXMaximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINX
 
Blue host openstacksummit_2013
Blue host openstacksummit_2013Blue host openstacksummit_2013
Blue host openstacksummit_2013
 
How go makes us faster (May 2015)
How go makes us faster (May 2015)How go makes us faster (May 2015)
How go makes us faster (May 2015)
 
Firefox Crash Reporting (@ Open Source Bridge)
Firefox Crash Reporting (@ Open Source Bridge)Firefox Crash Reporting (@ Open Source Bridge)
Firefox Crash Reporting (@ Open Source Bridge)
 
Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013
Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013
Running at Scale: Practical Performance Tuning with Puppet - PuppetConf 2013
 
Queick: A Simple Job Queue System for Python
Queick: A Simple Job Queue System for PythonQueick: A Simple Job Queue System for Python
Queick: A Simple Job Queue System for Python
 
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
HTTP2 in action - Piet Van Dongen - Codemotion Amsterdam 2017
 
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Leonid Vasilyev  "Building, deploying and running production code at Dropbox"Leonid Vasilyev  "Building, deploying and running production code at Dropbox"
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
 
Oslo Vancouver Project Update
Oslo Vancouver Project UpdateOslo Vancouver Project Update
Oslo Vancouver Project Update
 
Task queuing with redis and rq
Task queuing with redis and rqTask queuing with redis and rq
Task queuing with redis and rq
 
Nrpe
NrpeNrpe
Nrpe
 
Easily create dashboards to manage your databases with OVH
Easily create dashboards to manage your databases with OVH Easily create dashboards to manage your databases with OVH
Easily create dashboards to manage your databases with OVH
 

Andere mochten auch

WeldPulse - Welding Software Spark Edition Guide
WeldPulse - Welding Software Spark Edition GuideWeldPulse - Welding Software Spark Edition Guide
WeldPulse - Welding Software Spark Edition GuideWeldPulse
 
The fast path to En 1090 qualification
The fast path to En 1090 qualificationThe fast path to En 1090 qualification
The fast path to En 1090 qualificationJorg Eichhorn
 
WELDER QUALIFICATION TEST CERTIFICATE
WELDER QUALIFICATION TEST CERTIFICATEWELDER QUALIFICATION TEST CERTIFICATE
WELDER QUALIFICATION TEST CERTIFICATEManuel Bartilotti
 
Wps report
Wps reportWps report
Wps reportsohirooy
 
Welder qualification test certificate BS EN 287-1 135 PBW
Welder qualification test certificate BS EN 287-1 135 PBWWelder qualification test certificate BS EN 287-1 135 PBW
Welder qualification test certificate BS EN 287-1 135 PBWDaniel Ferreira
 
Planning for welding operations preparation for smaw welding operation
Planning for welding operations preparation for  smaw welding operationPlanning for welding operations preparation for  smaw welding operation
Planning for welding operations preparation for smaw welding operationAbhishek Meghani
 
Welding table
Welding tableWelding table
Welding tableksrmani99
 
Types of welding
Types of welding Types of welding
Types of welding Sabik T S
 
Welding qualification a
Welding qualification aWelding qualification a
Welding qualification aJithu John
 
Guide to understanding welding procedure specification (wps
Guide to understanding welding procedure specification (wpsGuide to understanding welding procedure specification (wps
Guide to understanding welding procedure specification (wpsTonni Bruce
 
Procedure qualification
Procedure qualificationProcedure qualification
Procedure qualificationvaasuBandaru
 
Welding for engineers chapter 1
Welding for engineers   chapter 1Welding for engineers   chapter 1
Welding for engineers chapter 1hakimm
 
WPS-PQR (welding-pengelasan)
WPS-PQR (welding-pengelasan)WPS-PQR (welding-pengelasan)
WPS-PQR (welding-pengelasan)Abrianto Akuan
 
The WPS 2.0 standard (preliminary information)
The WPS 2.0 standard (preliminary information)The WPS 2.0 standard (preliminary information)
The WPS 2.0 standard (preliminary information)Benjamin Proß
 
Aluminium mig welding english presentation
Aluminium mig welding   english presentationAluminium mig welding   english presentation
Aluminium mig welding english presentationAnssi Koponen
 
Basics of Robotics
Basics of RoboticsBasics of Robotics
Basics of RoboticsAmeya Gandhi
 

Andere mochten auch (20)

WeldPulse - Welding Software Spark Edition Guide
WeldPulse - Welding Software Spark Edition GuideWeldPulse - Welding Software Spark Edition Guide
WeldPulse - Welding Software Spark Edition Guide
 
The fast path to En 1090 qualification
The fast path to En 1090 qualificationThe fast path to En 1090 qualification
The fast path to En 1090 qualification
 
WELDER QUALIFICATION TEST CERTIFICATE
WELDER QUALIFICATION TEST CERTIFICATEWELDER QUALIFICATION TEST CERTIFICATE
WELDER QUALIFICATION TEST CERTIFICATE
 
PQR Form welding
PQR Form welding PQR Form welding
PQR Form welding
 
Wps report
Wps reportWps report
Wps report
 
Welder qualification test certificate BS EN 287-1 135 PBW
Welder qualification test certificate BS EN 287-1 135 PBWWelder qualification test certificate BS EN 287-1 135 PBW
Welder qualification test certificate BS EN 287-1 135 PBW
 
Planning for welding operations preparation for smaw welding operation
Planning for welding operations preparation for  smaw welding operationPlanning for welding operations preparation for  smaw welding operation
Planning for welding operations preparation for smaw welding operation
 
Welding table
Welding tableWelding table
Welding table
 
Robotic welding
Robotic weldingRobotic welding
Robotic welding
 
Welding Robots
Welding RobotsWelding Robots
Welding Robots
 
How to Qualify a Welding Procedure
How to Qualify a Welding ProcedureHow to Qualify a Welding Procedure
How to Qualify a Welding Procedure
 
Types of welding
Types of welding Types of welding
Types of welding
 
Welding qualification a
Welding qualification aWelding qualification a
Welding qualification a
 
Guide to understanding welding procedure specification (wps
Guide to understanding welding procedure specification (wpsGuide to understanding welding procedure specification (wps
Guide to understanding welding procedure specification (wps
 
Procedure qualification
Procedure qualificationProcedure qualification
Procedure qualification
 
Welding for engineers chapter 1
Welding for engineers   chapter 1Welding for engineers   chapter 1
Welding for engineers chapter 1
 
WPS-PQR (welding-pengelasan)
WPS-PQR (welding-pengelasan)WPS-PQR (welding-pengelasan)
WPS-PQR (welding-pengelasan)
 
The WPS 2.0 standard (preliminary information)
The WPS 2.0 standard (preliminary information)The WPS 2.0 standard (preliminary information)
The WPS 2.0 standard (preliminary information)
 
Aluminium mig welding english presentation
Aluminium mig welding   english presentationAluminium mig welding   english presentation
Aluminium mig welding english presentation
 
Basics of Robotics
Basics of RoboticsBasics of Robotics
Basics of Robotics
 

Ähnlich wie PyWPS tutorial for beginners and developers

Using the new WordPress REST API
Using the new WordPress REST APIUsing the new WordPress REST API
Using the new WordPress REST APICaldera Labs
 
Improving code quality using CI
Improving code quality using CIImproving code quality using CI
Improving code quality using CIMartin de Keijzer
 
Rapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devicesRapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devicesciklum_ods
 
Uni w pachube 111108
Uni w pachube 111108Uni w pachube 111108
Uni w pachube 111108Paul Tanner
 
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...Puppet
 
OSDC.no 2015 introduction to node.js workshop
OSDC.no 2015 introduction to node.js workshopOSDC.no 2015 introduction to node.js workshop
OSDC.no 2015 introduction to node.js workshopleffen
 
How to? Drupal developer toolkit. Dennis Povshedny.
How to? Drupal developer toolkit. Dennis Povshedny.How to? Drupal developer toolkit. Dennis Povshedny.
How to? Drupal developer toolkit. Dennis Povshedny.DrupalCampDN
 
The future of server side JavaScript
The future of server side JavaScriptThe future of server side JavaScript
The future of server side JavaScriptOleg Podsechin
 
JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5Stephan Schmidt
 
Node js presentation
Node js presentationNode js presentation
Node js presentationmartincabrera
 
Service Oriented Integration With ServiceMix
Service Oriented Integration With ServiceMixService Oriented Integration With ServiceMix
Service Oriented Integration With ServiceMixBruce Snyder
 
Php Asp Net Interoperability Rc Jao
Php Asp Net Interoperability Rc JaoPhp Asp Net Interoperability Rc Jao
Php Asp Net Interoperability Rc Jaojedt
 
2016 05-cloudsoft-amp-and-brooklyn-new
2016 05-cloudsoft-amp-and-brooklyn-new2016 05-cloudsoft-amp-and-brooklyn-new
2016 05-cloudsoft-amp-and-brooklyn-newBradDesAulniers2
 
InterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsInterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsChris Bailey
 
The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's Howmrdon
 
OGCE Project Overview
OGCE Project OverviewOGCE Project Overview
OGCE Project Overviewmarpierc
 

Ähnlich wie PyWPS tutorial for beginners and developers (20)

Pywps
PywpsPywps
Pywps
 
Using the new WordPress REST API
Using the new WordPress REST APIUsing the new WordPress REST API
Using the new WordPress REST API
 
Improving code quality using CI
Improving code quality using CIImproving code quality using CI
Improving code quality using CI
 
Rapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devicesRapid java backend and api development for mobile devices
Rapid java backend and api development for mobile devices
 
Uni w pachube 111108
Uni w pachube 111108Uni w pachube 111108
Uni w pachube 111108
 
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
 
OSDC.no 2015 introduction to node.js workshop
OSDC.no 2015 introduction to node.js workshopOSDC.no 2015 introduction to node.js workshop
OSDC.no 2015 introduction to node.js workshop
 
How to? Drupal developer toolkit. Dennis Povshedny.
How to? Drupal developer toolkit. Dennis Povshedny.How to? Drupal developer toolkit. Dennis Povshedny.
How to? Drupal developer toolkit. Dennis Povshedny.
 
Drupal development
Drupal development Drupal development
Drupal development
 
node.js - Fast event based web application development
node.js - Fast event based web application developmentnode.js - Fast event based web application development
node.js - Fast event based web application development
 
The future of server side JavaScript
The future of server side JavaScriptThe future of server side JavaScript
The future of server side JavaScript
 
JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5
 
Node js presentation
Node js presentationNode js presentation
Node js presentation
 
Service Oriented Integration With ServiceMix
Service Oriented Integration With ServiceMixService Oriented Integration With ServiceMix
Service Oriented Integration With ServiceMix
 
Php Asp Net Interoperability Rc Jao
Php Asp Net Interoperability Rc JaoPhp Asp Net Interoperability Rc Jao
Php Asp Net Interoperability Rc Jao
 
2016 05-cloudsoft-amp-and-brooklyn-new
2016 05-cloudsoft-amp-and-brooklyn-new2016 05-cloudsoft-amp-and-brooklyn-new
2016 05-cloudsoft-amp-and-brooklyn-new
 
Cocoon OSGi CocoonGT2007
Cocoon OSGi CocoonGT2007Cocoon OSGi CocoonGT2007
Cocoon OSGi CocoonGT2007
 
InterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsInterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.js
 
The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's How
 
OGCE Project Overview
OGCE Project OverviewOGCE Project Overview
OGCE Project Overview
 

Kürzlich hochgeladen

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
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
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
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
 
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
 
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
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
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
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
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
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
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
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
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
 

Kürzlich hochgeladen (20)

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
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)
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
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
 
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...
 
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
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
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
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
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
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
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...
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
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
 

PyWPS tutorial for beginners and developers

  • 1. PyWPS a tutorial for beginners and developers Jorge de Jesus (Plymouth Marine Laboratory) Luca Casagrande (Università degli Studi di Perugia) Jachym Čepicky (Help Service – Remote Sensing Company)
  • 2. Before starting Please put your OSGEO livecd or usb-stick inside your laptop and start your machine.
  • 3. Program Introduction part WPS Standard and PyWPS Newbie part Installation, setup and first process Developers part PyWPS in detail, mod_python,jython, GRASS Gallery Examples of applications using PyWPS
  • 5. Install the tutorial Open Firefox and download the script from the pyWPS main page: http://pywps.wald.intevation.org/ Make it executable (password is user) : sudo chmod +x install_pywps_svn.sh Start the script: sudo ./install_pywps_svn.sh You can edit files using nano, but remember to always use sudo (password is user) .
  • 6. Definitions Web Processing Service (WPS) is an OGC standard protocol to make GIS calculation available to the internet Open Geospatial Consortium (OGC) is a non-profit, international, voluntary consensus standards organization that is leading the development of standard for geospatial and location based service.
  • 7. WPS standard ... provides rules for standardizing how inputs and outputs (requests and responses) for geospatial processing services , such as polygon overlay. The standard also defines how a client can request the execution of a process, and how the output from the process is handled..
  • 8.
  • 9. HTTP POST method, using XML format of the request
  • 10. SOAP For this tutorial we will use just the HTTP GET method
  • 11. Key Value Pairs request http://localhost/cgi-bin/wps.py?service=WPS&request=GetCapabilities http://localhost/cgi-bin/wps.py Is the server address The ? sign indicates, that the request parameters will start service=WPS&request=GetCapabilities The KVP-encoded request. We send two request parameters to the server: service - which we set to WPS request - which is set to GetCapabilities
  • 12. XML Request In this case, the request is encoded in XML form and send to the server directly via HTTP POST (the WPS server will read the file from standard input directly). <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <ows:GetCapabilities xmlns:ows=&quot;http://www.opengis.net/ows/1.1&quot; > <ows:AcceptVersions> <ows:Version>1.0.0</ows:Version> </ows:AcceptVersions> </ows:GetCapabilities>
  • 13.
  • 14. DescribeProcess: returns a description a process including its inputs and outputs
  • 15. Execute: returns the output(s) of a process
  • 16. Despite the specification that requests should be case insensitive, it is recommended to use the upper camel case standard in all sorts of WPS operation requests
  • 17.
  • 18. Service provider (Name, Organization, Address, ...)
  • 19. ProcessOfferings - List of available processes http://apps.esdi-humboldt.cz/pywps/?service=WPS&request=GetCapabilities
  • 20.
  • 24. Execute Mandatory parameters: No mandatory parameters http://apps.esdi-humboldt.cz/pywps/?service=WPS&version=1.0.0& request=Execute& identifier=literalprocess& datainputs=[int=1;float=3.2;zeroset=0;string=spam]
  • 25.
  • 26. An equal sign (=) shall be used to separate an input name from its value and attributes, and an attribute name from its value
  • 27. An at symbol (@) shall be used to separate an input value from its attributes and one attribute from another.
  • 28. All field values and attribute values shall be encoded using the standard Internet practice for encoding URLs
  • 29. PyWPS also supports the use of [ ] to group the datainputs as follows: datainputs=[int=1;float=3.2]
  • 30. Description of Data Inputs and Outputs Three types of inputs and outputs are defined in the OGC standard. LiteralData, ComplexData and BoundingBox data.
  • 31. LiteralData LiteralData can be any character string, float,date, etc normally described as Primitive datatype in the W3C XML WPS standard also allows the use of UOM (Unit of Measures), default values and AllowedValues.
  • 32.
  • 33. Or you send or obtain just reference to the data – URL to the file or service, where the data can be downloaded.
  • 34.
  • 35. other CRS supported &bboxInput=71.63,41.75,-70.78,42.90,urn:ogc:def:crs:EPSG:6.6:4326,2
  • 36.
  • 37. Totally written in python 2.6
  • 38. Organized into packages and classes for easy maintenance
  • 39. Open to new developments and functionalities that can be integrated in WPS 1.0.0
  • 40. Is run from bash or as a cgi process
  • 41.
  • 42. Is not a XML parser or generator. It does not validate the GMLs against given schemas (yet), it does not build GML from Python objects
  • 43. Can't be used to build general web applications like CherryPy framework PyWPS
  • 44.
  • 45.
  • 46.
  • 48. Support for multiple WPS servers with one pyWPS Installation
  • 51. New examples of processes
  • 52.
  • 53. New generic WPS JavaScript library
  • 54. Multiple fixes in both, source code and templates
  • 55. New style In- and Outputs Complex object
  • 56. Tons of bugs fixed
  • 57. PyWPS history 2010 pyWPS is recomended as THE WPS tool in GIGAS project ( GEOSS, INSPIRE and GMES an Action in Support). As explained in the &quot;GIGAS Technology Watch Report WPS&quot; &quot;PyWPS Web Processing Service: is a Python program which implements the OGC WPS 1.0.0 standard (with a few omissions). PyWPS was chosen as it is up to date with the WPS standard and has a low footprint, making it easy to install on most Linux systems.”
  • 59. Installation Configuration file PyWPS instance / Wrapper Script First process
  • 60. Installation Requirements: python – currently 2.5, 2.6 python – xml package htmltmpl engine older versions
  • 61. For cool stuff you may need: GRASS-GIS
  • 62. Install files can be found in: SVN access to the latest code: Latest package: http://pywps.wald.intevation.org/download/ svn checkout https://svn.wald.intevation.org/svn/pywps/trunk http://wald.intevation.org/frs/download.php/589/pywps-3.1.0.tar.gz
  • 63. Clean install: There's DEB and RPM packages. Badly maintain :( > tar -xvzf /tmp/pywps-VERSION.tar.gz > cd pywsp-VERSION > python setup.py install
  • 65. Testing the script by running the wps.py (/usr/bin) script If everything is ok.... > /usr/bin/wps.py PyWPS NoApplicableCode: Locator: None; Value: No query string found. Content-type: text/xml <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <ExceptionReport version=&quot;1.0.0&quot; xmlns=&quot;http://www.opengis.net/ows&quot;... > <Exception exceptionCode=&quot;NoApplicableCode&quot;> <ExceptionText> No query string found. </ExceptionText> </Exception> </ExceptionReport>
  • 66. Configuration file for PyWPS can be located on several places. There are global and local PyWPS configuration files. Local files overwrite the global one Global : Local: /etc/pywps.cfg /usr/local/pywps-VERSION/etc/pywps.cfg Any path defined in the PYWPS_CFG environment variable
  • 67. pywps.cfg is a Key = Value text file 4 sections are present in the file: Remember: The file is case-sensitive [wps] [provide] [server] [grass]
  • 68. Baisic meta information necessary to populate the WPS doc. Other variables aren't shown in this example [wps] title version abstract fees keywords lang
  • 69. Server configuration options, path locations and URL translation and service limits Other variables aren't shown in this example Most important: outputURL, outputPath, processPath [server] maxoperations maxinputparamlength maxfilesize outputUrl outputPath processesPath
  • 70. outputURL: URL that will be used to point to the WPS outputs outputPath: Folder where PyWPS will drop the outputs (server accessible) http://localhost/wpsoutput http://rsg.pml.ac.uk/wps/wpsoutput /var/www/html/wpsoutput /usr/local/apache/htdocs/wps/wpsoutput /var/www/html/wpsoutput /var/www/html/wpsoutput
  • 71. processPath: Folder path with stored processes It's important that these 3 parameters are properly configured /usr/local/pywps/processes /usr/local/pywps/processes /usr/local/pywps/processes /usr/local/pywps/processes /usr/local/pywps/processes /home/user/processes
  • 72. PyWPS can be installed once in a server, but it may be configured to run several WPS services (instances). WPS instance Process folder pywps.cfg file
  • 73. 1) Setup a process folder 2) copy configuration file-template and edit it to desired configuration 3) We need to populate the process directory > mkdir -p /usr/local/wps/processes > cp pywps-VERSION/pywps/default.cfg /usr/local/wps/pywps.cfg > nano /usr/local/wps/pywps.cfg > cp pywps-VERSION/examples/ultimatequestionprocess.py /usr/local/wps/processes/
  • 74. 4) Every process in the process folder needs to be “registered in a file called __init__.py We've done 50% of an instance :) > cd /usr/local/wps/processes/ > echo &quot;__all__=['ultimatequestionprocess']&quot; > __init__.py __all__ it's a python array will the processe list
  • 75. A WPS instance is just a script that alters some parameters before calling wps.py #!/bin/sh # Author: Jachym Cepicky # Purpose: CGI script for wrapping PyWPS script # Licence: GNU/GPL # Usage: Put this script to your web server cgi-bin directory, e.g. # /usr/lib/cgi-bin/ and make it executable (chmod 755 pywps.cgi) # NOTE: tested on linux/apache export PYWPS_CFG=/usr/local/wps/pywps.cfg export PYWPS_PROCESSES=/usr/local/wps/processes/ /usr/local/pywps-VERSION/wps.py $1 wps.cgi file
  • 76. We need to configure PYWPS_CFG and PYWPS_CFG to specify the instance We can copy the wrapper script to Apache's cgi-bin folder Assuming that Apache is configure to support script execution... > cp wps.cgi /usr/lib/cgi-bin http://localhost/cgi-bin/pywps.cgi?request=DescribeProcess & service=WPS&version=1.0.0& process=ultimatequestionprocess
  • 77. <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <wps:ProcessDescriptions xmlns:wps=.... service=&quot;WPS&quot; version=&quot;1.0.0&quot; xml:lang=&quot;eng&quot;> <ProcessDescription wps:processVersion=&quot;2.0&quot; storeSupported=&quot;true&quot; statusSupported=&quot;true&quot;> <ows:Identifier>ultimatequestionprocess</ows:Identifier> <ows:Title>Answer to Life, the Universe and Everything</ows:Title> <ows:Abstract>....</ows:Abstract> <ProcessOutputs> <Output> <ows:Identifier>answer</ows:Identifier> <ows:Title>T he numerical answer to Life, Universe and Everything </ows:Title> <LiteralOutput> <ows:DataType >integer</ows:DataType> </LiteralOutput> </Output> </ProcessOutputs> </ProcessDescription> </wps:ProcessDescriptions>
  • 78. PyWPS's assemble factory approach User's process POST GET SOAP GetCapabilities DescribeProcess Execute 1 2 1 Load Process Check Properties WPS output 2 Load Process getInput run setOuput WPS output
  • 79. Process as an extended class of WPSProcess with method run() that will execute the code WPSProcess class Process1 Process2 ProcessN
  • 80. All processes have the following skeleton: WPSProcess class provides extra functionalities like: - Command line util: self.cmd() - Status setting: self.status.set(message,percentage) from pywps.Process.Process import WPSProcess class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, < Process's information like: identifier, title, status >) < Inclusion of inputs and outputs to process class > def execute(self): < code >
  • 81. Process's attributes: The only mandatory attribute is: identifier class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, identifier=”firstprocess”, #same file name title=”foo”, abstract=”bacon and eggs”, version = &quot;0.1&quot;, storeSupported = &quot;true&quot;, statusSupported = &quot;true&quot;, <more WPS attributes if necessary> )
  • 82. 3 types of Input/Output defined in WPS: Each Input/Output is a method of WPSProcess class Each Input/Output is created when class in initiated LiteralData ComplexData BBOX
  • 83. LiteralData ComplexData BBOX self.addLiteralInput(...) self.addLiteralOutput(...) self.addComplexInput(...) self.addComplexOutput(...) self.addBBoxInput(...) self.addBBoxOutput(...)
  • 84. Each self.add*() defines/creates an input. The class constructor accepts the WPS parameters: Only identifier and title are mandatory self.Input1 = self.addLiteralInput( identifier = &quot;input1&quot;, title = &quot;Input1 number&quot;, abstract=”foo”, minOccurs=1, type=types.IntType default=&quot;100&quot;)
  • 85. A more “Complex” example Only identifier and title are mandatory self.dataIn = self.addComplexInput( identifier=&quot;data&quot;, title=&quot;Input vector data&quot;, abstract=”foo” formats = [{'mimeType':'text/xml'}])
  • 86. What about outputs Identical syntax and procedure :) self.dataOut = self.addComplexOutput( identifier=&quot;output&quot;, title=&quot;Output vector data&quot;, formats = [{'mimeType':'text/xml'}]) self.Output1 = self.addLiteralOutput( identifier=&quot;output1&quot;, title=&quot;foo&quot;)
  • 87. The add*Input and add*Output are set in the beginning of the class (__init__ method): from pywps.Process.Process import WPSProcess class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, < Process's information like: identifier, title, status >) self.Input1=self.addLiteralInput(identifier=”input1”) self.dataOut =self.addComplexInput(identifier=”outputs”) <more inputs/outputs as needed> def execute(self): < code >
  • 88. OK we have WPS inputs and output, how can I get them ?!?!?! Using the JAVA get and set “philosophy” :) Each Input has a getValue() method Each Output has a setValue() method This is done inside the execute method()
  • 89. Please check wiki !!!! from pywps.Process.Process import WPSProcess class Process(WPSProcess): def __init__(self): # init process WPSProcess.__init__(self, < Process's information like: identifier, title, status >) self.Input1=self.addLiteralInput(identifier=”input1”) self.dataOut =self.addComplexInput(identifier=”outputs”) <more inputs/outputs as needed> def execute(self): input1=self.Input1.getValue() XMLdata=”<xml>foo</xml>” self.dataOut.setValue(XMLData) #input or file object
  • 90. Fist Process, a returner process Process class initiation, identifier, WPS status and storeExecuteResponse definition from pywps.Process import WPSProcess class Process(WPSProcess): def __init__(self): ## # Process initialization WPSProcess.__init__(self, identifier = &quot;returner&quot;, title=&quot;Return process&quot;, abstract=&quot;&quot;&quot;This is demonstration process of PyWPS, returns the same file, it gets on input, as the output.&quot;&quot;&quot;, version = &quot;1.0&quot;, storeSupported = &quot;true&quot;, statusSupported = &quot;true&quot;)
  • 91. Attention to indent !!! It's python !!!! ## # Adding process inputs self.dataIn = self.addComplexInput(identifier=&quot;data&quot;, title=&quot;Input vector data&quot;, formats = [{'mimeType':'text/xml'}]) self.textIn = self.addLiteralInput(identifier=&quot;text&quot;, title = &quot;Some width&quot;) ## # Adding process outputs self.dataOut = self.addComplexOutput(identifier=&quot;output&quot;, title=&quot;Output vector data&quot;, formats = [{'mimeType':'text/xml'}]) self.textOut = self.addLiteralOutput(identifier = &quot;text&quot;, title=&quot;Output literal data&quot;) ## # Adding process inputs self.dataIn = self.addComplexInput(identifier=&quot;data&quot;, title=&quot;Input vector data&quot;, formats = [{'mimeType':'text/xml'}]) self.textIn = self.addLiteralInput(identifier=&quot;text&quot;, title = &quot;Some width&quot;)
  • 92. Hopefully this will work: def execute(self): # just copy the input values to output values self.dataOut.setValue( self.dataIn.getValue() ) self.textOut.setValue( self.textIn.getValue() ) return http://localhost/python/wps.py?request=Execute& service=WPS& identifier=returner& Version=1.0.0& datainputs=[text=abc;data=<xml>foo</xml>]
  • 94. Hacking ( wps.py code for dummies) Logging (and wood) GRASS (after the wood) Mod_Python (Pythons and Horses) Tomcat server (Pythons and Cats) Mapserver support (More OGC stuff) OpenLayers (Let there be layers.....) SOAP/WSDL (Beatiful soap... so they say...) PyCallGraph (The all enchilada!!!)
  • 95. PyWPS's wps.py has the following pseudo-code structure: Start wps.py: 1. Determine request_method (GET or POST) 2. if no input: raise Exception and exit 3. try: initiate PyWPS class according to request_method parse Request do Request get Response and make proper reply 4. exception: reply Error response
  • 96. Some “Hacking” experiments: Exit if request is POST (around line 95): Encript a WPS response:
  • 97. In PyWPS you can use the logging module anywhere in the code. pywps.cfg file contains the path to the log file Then the file log will contain a line, like this:
  • 98. Eclipse IDE is the default debugging platform using PyDEV tools Code to be debugged should contain a path to the PyDEV tools: After this path append, it is possible to import pydev module Now the code with pydevd is enabled for debbuging
  • 99. Next step is to activate the debug server that will listen to the script. Now everytime that the python interperter finds: It will stop and send the variable to debug server From eclipse it will be possible to continue or stop the script
  • 100.  
  • 101. PyWPS doesn't come with out-of-the-box tools PyPWS is Python, so connect, connect, connect !!!!! To GRASS GIS You may work with a predefined grassLocation or a temporary one WPSProcess.__init__(self, identifier = &quot;foo&quot;, ... grassLocation = True ) Temporary grassLocation XY coordinate system
  • 102. gisdbase base path specified in configuration file (pywps.cfg) Absolute path in grassLocation OR
  • 103. Commands passed as an array with command + arguments:
  • 104. A total Pythonic way to connect to GRASS!!!!!!
  • 105. &quot; Mod_python is an Apache module that embeds the Python interpreter within the server ”. In: http://www.modpython.org/ version 3.2 provides a wps.py script designed to be integrated into mod_python So what is the advantage ?! SPEED !!!!! 50x faster on request processing Integration with Apache's API Ability to handle request phases, filters and connections
  • 106. Default httpd.conf for PyWPS: Inform Apache that wps is the default handler of any request Pass env variables PYWPS_PROCESSES and PYWPS_CFG
  • 107. Mod_python can be used to restrict access to the WPS:
  • 108. mod_python can apply filters on HTTP request/response The filter needs to be register to Apache and mod_python The filter is applied to any WPS output, encrypting the response
  • 109. WPS client/server 'secured' interaction The server provides “getCapabilities” and “describeProcess” to anyone. The “execute” is permitted only to authorized users Note: the base authentication credentials are used to allow the geo web service to receive delegation (downloading a proxy certificate) from another web service . The authentication/authorization of the “execute” is managed through X.509 certificates which are handled through the GridSite module for Apache ( http://www.gridsite.org/ ). Who is using mod_python and PyWPS ?! GENESI-DR, (Ground European Network for Earth Science Interoperations - Digital Repositories), www.genesi-dr.eu & www.genesi-dec.eu INFRA-2007-1.2.1 : Scientific Digital Repositories
  • 110. No Voodoo , Just computer science !!!! Python Code Jython Compiler Java ByteCode TomCat Instance
  • 111. Instead of wps.py we have a new script called PywpsServelet.py
  • 112. - All PyWPS code needs to be copied to the Tomcat folder running the instance: https://svn.wald.intevation.org/svn/pywps/trunk/webservices/tomcat/ WEB-INF PywpsServlet.py Configuration file used by TomCat The twin brother or wps.py
  • 113. Now we just need the Jython Library :) And we have just the last piece of the puzzle missing... What about PYWPS_PROCESSES ?!
  • 114. - After start/stop of tomcat we should be able to make a request:
  • 115.  
  • 116. Still in the SVN tree, highly experimental !!!!! Who's using it ?! ...or will be using..... Its intended to be the default WPS service for Conceptual Schema Transformer
  • 117. Yes, PyWPS even supports Mapserver :) Still experimental in the SVN..... ComplexData reference link outputed as a OGC service
  • 118. According to the data type the link will point to a WMS, WFS or WCS service. So how is it set ?!
  • 119. In the SVN tree we have a WPS client specific for Openlayers Just append the file to the HTML's script tags Now a OpenLayers.WPS class should be available
  • 120. We have 2 major classes, WPS and process WPS API will make all the requests, parse the result and when finish will run a call back function WPS +describeProcess() +getCapabilities() +execute() +onDescrivedProcess: callback +onGotCapabilities: callback +onExecuted: callback
  • 121. A simple example: Please check wiki for an extensive explanation !!!!
  • 122. SOAP == Simple Object Access Protocol WSDL == Web Services Description Language OGC defines that WPS 1.0.0 should support these standards PyWPS has “some” support for SOAP PyWPS generates a simple WSDL file
  • 123. SOAP is a messaging framework, meaning, a structured way to pass, explain and process a message.
  • 124. Example: - Currently PyWPS will accept SOAP XML requests - BUT it will not process any header content or “special Execute tags”
  • 125. - WSDL is a XML document describes a Web service. -Considering a WPS process, then a WSDL would some something like: WSDL Doc == GetCapabilites+ DescribeProcess+ Execute+ OGC WPS standard definition (schema)
  • 126.  
  • 127. WSDL file is served as follows: No specific process WSDL file request or support :(
  • 128. SVN branch pywps-3.2-SOAP for WSDL and SOAP development Next PyWPS release will have better SOAP/WSDL support WPS 2.0.0 to have better SOAP/WSDL support Million dolar question ?! Why do we need SOAP/WSDL
  • 129. - Orchestration and interaction with other web services - Ability to use BPEL (Bussines Procedure Language) to orchestrate services
  • 130. -PyCallGraph is used to generate a graphic representation of code being run - Useful to check bottlenecks and code problems
  • 131. - Major time consumption in initProcess() method. - More processes == Slower output A detailed analysis using pyCallGraphic has shown: NO MAJOR BOTTLE NECKS Execute/DescribeProcess spent most of time in process handling If PyWPS is slow, blame the process code Minimum overhead when calling Update and Exception reports
  • 133.
  • 136. 60 megas 700kb http://rsg.pml.ac.uk/wps/wps.cgi?request=Execute&service=wps&version=1.0.0& identifier=reducer& datainputs=[reductionFactor=0.1;imageInput=http://rsg.pml.ac.uk/wps/srtm.tif]& responsedocument=imageOutput=@asreference=true& status=true&storeExecuteResponse=true
  • 137. Acknowledgments: Simone Gentilini (JRC). GENESI-DR Project funded by FP7 program und e r ( INFRA-2007-1.2.1) Scientific Digital Repositories www.genesi-dr.eu & www.genesi-dec.eu Plymouth Marine Laboratory – Remote Sensing Group www.pml.ac.uk & http://rsg.pml.ac.uk Netmar project. Project partially funded by FP7 program under (ICT-2009.6.4) Information & Communication Technologies. http://netmar.nersc.no/ HS-RS Help Service – Remote Sensing http://www.bnhelp.cz/