SlideShare a Scribd company logo
1 of 30
Download to read offline
AtoM Feature DevelopmentAtoM Feature Development
An intro on how to create and contribute
Steve Breker, May 2017
AtoM Camp SJC
Feature Development
Process
Feature Development
Process
Feature development process overview
1. Feature idea
2. Technical classification
3. Development preparation
4. Creating a feature
5. Contributing a feature
1. Feature idea
● New archival standard?
● New theme?
● New way to bring data in or out?
● ???
2. Technical classification
● Plugins
● CLI tasks
● Background jobs
● Core features
2. Technical classification
● Plugins <- probably the most common
● CLI tasks
● Background jobs
● Core features
3. Preparation: design
● Think of broad use-cases
● Follow known open standards whenever relevant
● Implement as simply as possible
● Change as little as possible to get the functionality you
want
● Avoid breaking backwards compatibility
● Run your ideas by the community
3. Preparation: technical
● Read up on Symfony 1.4
● Explore AtoM’s codebase
● Ask questions in the AtoM user forum
4. Developing your feature
● Fork AtoM on GitHub to have your own repository to work
with
● Follow AtoM coding standards:
https://wiki.accesstomemory.org/Development/Coding_standard
● Review our wiki page on contributing code:
https://wiki.accesstomemory.org/Development/Contribute_code
● Make sure any third-party code libraries you add are AGPL
v3 compatible
5. Contributing your feature
1. Submit a pull request on GitHub with your work
2. Respond to feedback in the pull request until the pull
request’s approved:
https://wiki.accesstomemory.org/Development/Code_review
3. Fill in a Contributor’s agreement:
https://wiki.accesstomemory.org/Development/Contribute_code
1010101111010110101010110110110110100101010101010101010101011011010010110101010101010
1010011011011011011011010100101011101101010101010100101101010101010101010101101101100
0101101101001010101010101101101010101010101001010110110101101000010110101010101010101
0100011011011000110111010101010010101101010010010100011110110110110110011011011011000
1100001101101100110101010111010010100011011010101011110101101010101101101101101001010
1010101010101010101101101001011010101010101010100110110110110110110101001010111011010
1010101010010110101010101010101010110110110001011011010010101010101011011010101010101
0100101011011010110100001011010101010101010101000110110110001101110101010100101011010
1001001010001111011011011011001101101101100011000011011011001101010101110100101000110
1101010101111010110101010110110110110100101010101010101010101011011010010110101010101
0101010011011011011011011010100101011101101010101010100101101010101010101010101101101
1000101101101001010101010101101101010101010101001010110110101101000010110101010101010
1010100011011011000110111010101010010101101010010010100011110110110110110011011011011
0001100001101101100110101010111010010100011011010101011110101101010101101101101101001
0101010101010101010101101101001011010101010101010100110110110110110110101001010111011
0101010101010010110101010101010101010110110110001011011010010101010101011011010101010
1010100101011011010110100001011010101010101010101000110110110001101110101010100101011
0101001001010001111011011011011001101101101100011000011011011001101010101110100101000
1101101010101111010110101010110110110110100101010101010101010101011011010010110101010
1010101010011011011011011011010100101011101101010101010100101101010101010101010101101
1011000101101101001010101010101101101010101010101001010110110101101000010110101010101
0101010100011011011000110111010101010010101101010010010100011110110110110110011011011
0110001100001101101100110101010111010010100011011010101011110101101010101101101101101
0010101010101010101010101101101001011010101010101010100110110110110110110101001010111
0110101010101010010110101010101010101010110110111010101001101101101101101101010010101
Symfony 1.4Symfony 1.4
Symfony 1.4 overview
● Symfony 1.4 is the web application framework AtoM is built
with
● Symfony follows the MVC (model/view/controller) pattern
● Models represent types of data
● Views represent how data is rendered
● Controllers represent logic that determines what data ends
up being rendered by the view
Symfony models
● AtoM’s Symfony is using an ORM called Propel
● To define models, data schemas are defined using YAML files
● A CLI tool is run that uses these YAML files as a guideline to generate
PHP code to that defines model classes
● These classes are referred to as “base” models and aren’t supposed to
be manually altered
● Model characteristics can be added or overriden by creating child
classes that extend the base models
● Migrations handle changes between schema versions
Symfony controllers
● There are two main types of controllers: actions and components
● Actions define the behaviour of pages
● Components define logic shared between actions
● Both types of controllers are represented by classes
● Actions extend sfAction (or a child class)
● Components extend sfComponent (or a child class)
● If actions or components are part of a plugin they are given a class name that
includes the plugin name
● Example: sfRadPluginEditAction
Symfony views
● There are two main types of views: page templates and partials
● Page templates define how an action’s data is rendered
● Partials have multiple uses:
○ They can be used to define how a component’s data is rendered
○ They can be used by page templates to render repeating data
○ They can be used by page templates to encapsulate a complex part of a page
● The use_helper function can be used in page templates to include functions
intended to be used within templates (for rendering dates and URLs, etc.)
Symfony routing
● AtoM’s routing is largely defined in apps/qubit/config/routing.yml
● Plugins can dynamically add routes as well
● Example: the arRestApiPlugin’s configuration class adds routes
Symfony debugging/development tools
● The clear cache CLI task is useful during development:
php symfony cc
● Also useful is the CLI task to purge all user-created data:
php symfony tools:purge
● See Steve Breker’s presentation, slide 4, for how to enable debug mode
Developing PluginsDeveloping Plugins
Plugin Development Overview
● Plugins can be used to implement optional features as mentioned earlier
(support for individual archival standards, new themes, etc.)
● Plugins are also used in AtoM to escapsulate functionality (the
arElasticSearchPlugin plugin for example)
● Plugins can also be used to add new classes that other plugins can share
Plugin directory structure
● Plugins have four optional subdirectories: config, lib, modules, and web
● config is where plugin-related configuration files can be put
● lib is where plugin code libraries, such as plugin-related classes, can be put
● modules is where module-related code can be put
● web is where plugin-related web assets are put
Plugin configuration files
● Plugin configuration files are named using the convention:
<plugin name>Configuration.class.php
● An example: sfRadPluginConfiguration.class.php
● These files define a class named <plugin name>Configuration that
inherits from Symfony's sfPluginConfiguration class
● These files specify the plugin's name, version, etc.
● These files also can contain plugin initialization logic, etc.
Plugin library files
● Plugin library files are named with the plugin name included in the filename
● An example:
plugins/arOaiPlugin/lib/arOaiPluginComponent.class.php
● This is merely a convention, however
● Any class that is put in the plugin's lib directory will be auto-loaded by AtoM
once the cache is cleared
● The sfHistoryPlugin plugin is an example of a plugin whose sole
functionality is encapsulated in a class in the plugin’s lib directory
Plugin modules
● Modules are an organizational unit used in Symfony to encapsulate a bunch of
files related to a group of application web pages
sfFacebookPlugin
modules
photos
actions
indexAction.class.php
editAction.class.php
templates
indexSuccess.php
editSuccess.php
Enabling/disabling Plugins
● Plugins that consist entirely of plugin code library, put in lib, don't need to be
explicitly enabled
● Plugins must contain a configuration file in their config subdirectory in order
to be enabled by an admin
● Enable or disable plugins using the sfPluginAdminPlugin/plugins page
Developing TasksDeveloping Tasks
Task Development Overview
● Tasks are primarily used by advanced users and system administrators
● Tasks add command-line accessible features
● Task examples: cache clearing, bulk import/export, adding administrators, etc.
● Task code can be found in lib/tasks
Developing Background
Jobs
Developing Background
Jobs
Background Job Development Overview
● Jobs are used to perform "heavy lifting" in the background of an AtoM instance
● For example, if a user requests a CSV export of all descriptions the user will be
informed that the export has started, but won't have to wait for the export to
complete to get a web page response
● Users can visit a webpage to see the status of their jobs, whether in-progress,
completed, or failed
● A job is analogous to a pizza delivery order: the doorbell will ring when the pizza
arrives and when in doubt you can call the pizzaria to enquire about whether
the pizza's done or not
1010101111010110101010110110110110100101010101010101010101011011010010110101010101010
1010011011011011011011010100101011101101010101010100101101010101010101010101101101100
0101101101001010101010101101101010101010101001010110110101101000010110101010101010101
0100011011011000110111010101010010101101010010010100011110110110110110011011011011000
1100001101101100110101010111010010100011011010101011110101101010101101101101101001010
1010101010101010101101101001011010101010101010100110110110110110110101001010111011010
1010101010010110101010101010101010110110110001011011010010101010101011011010101010101
0100101011011010110100001011010101010101010101000110110110001101110101010100101011010
1001001010001111011011011011001101101101100011000011011011001101010101110100101000110
1101010101111010110101010110110110110100101010101010101010101011011010010110101010101
0101010011011011011011011010100101011101101010101010100101101010101010101010101101101
1000101101101001010101010101101101010101010101001010110110101101000010110101010101010
1010100011011011000110111010101010010101101010010010100011110110110110110011011011011
0001100001101101100110101010111010010100011011010101011110101101010101101101101101001
0101010101010101010101101101001011010101010101010100110110110110110110101001010111011
0101010101010010110101010101010101010110110110001011011010010101010101011011010101010
1010100101011011010110100001011010101010101010101000110110110001101110101010100101011
0101001001010001111011011011011001101101101100011000011011011001101010101110100101000
1101101010101111010110101010110110110110100101010101010101010101011011010010110101010
1010101010011011011011011011010100101011101101010101010100101101010101010101010101101
1011000101101101001010101010101101101010101010101001010110110101101000010110101010101
0101010100011011011000110111010101010010101101010010010100011110110110110110011011011
0110001100001101101100110101010111010010100011011010101011110101101010101101101101101
0010101010101010101010101101101001011010101010101010100110110110110110110101001010111
0110101010101010010110101010101010101010110110111010101001101101101101101101010010101
Questions?Questions?
info@artefactual.cominfo@artefactual.com

More Related Content

What's hot

Django Framework and Application Structure
Django Framework and Application StructureDjango Framework and Application Structure
Django Framework and Application Structure
SEONGTAEK OH
 
Improving Apache Spark by Taking Advantage of Disaggregated Architecture
Improving Apache Spark by Taking Advantage of Disaggregated ArchitectureImproving Apache Spark by Taking Advantage of Disaggregated Architecture
Improving Apache Spark by Taking Advantage of Disaggregated Architecture
Databricks
 
An Introduction to Maven
An Introduction to MavenAn Introduction to Maven
An Introduction to Maven
Vadym Lotar
 

What's hot (20)

Things I wish I'd known - AtoM tips, tricks, and gotchas
Things I wish I'd known - AtoM tips, tricks, and gotchasThings I wish I'd known - AtoM tips, tricks, and gotchas
Things I wish I'd known - AtoM tips, tricks, and gotchas
 
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js + Expres...
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js +  Expres...Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js +  Expres...
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js + Expres...
 
AtoM, Authenticity, and the Chain of Custody
AtoM, Authenticity, and the Chain of CustodyAtoM, Authenticity, and the Chain of Custody
AtoM, Authenticity, and the Chain of Custody
 
Web Scraping With Python
Web Scraping With PythonWeb Scraping With Python
Web Scraping With Python
 
Web scraping
Web scrapingWeb scraping
Web scraping
 
AtoM and Vagrant: Installing and Configuring the AtoM Vagrant Box for Local T...
AtoM and Vagrant: Installing and Configuring the AtoM Vagrant Box for Local T...AtoM and Vagrant: Installing and Configuring the AtoM Vagrant Box for Local T...
AtoM and Vagrant: Installing and Configuring the AtoM Vagrant Box for Local T...
 
Web Scraping using Python | Web Screen Scraping
Web Scraping using Python | Web Screen ScrapingWeb Scraping using Python | Web Screen Scraping
Web Scraping using Python | Web Screen Scraping
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
Bash Shell Scripting
Bash Shell ScriptingBash Shell Scripting
Bash Shell Scripting
 
AtoM Data Migrations
AtoM Data MigrationsAtoM Data Migrations
AtoM Data Migrations
 
Getting started with Web Scraping in Python
Getting started with Web Scraping in PythonGetting started with Web Scraping in Python
Getting started with Web Scraping in Python
 
SSRF workshop
SSRF workshop SSRF workshop
SSRF workshop
 
CSV import in AtoM
CSV import in AtoMCSV import in AtoM
CSV import in AtoM
 
Django Framework and Application Structure
Django Framework and Application StructureDjango Framework and Application Structure
Django Framework and Application Structure
 
How Brave update works
How Brave update worksHow Brave update works
How Brave update works
 
Projects In Laravel : Learn Laravel Building 10 Projects
Projects In Laravel : Learn Laravel Building 10 ProjectsProjects In Laravel : Learn Laravel Building 10 Projects
Projects In Laravel : Learn Laravel Building 10 Projects
 
Frans Rosén Keynote at BSides Ahmedabad
Frans Rosén Keynote at BSides AhmedabadFrans Rosén Keynote at BSides Ahmedabad
Frans Rosén Keynote at BSides Ahmedabad
 
Improving Apache Spark by Taking Advantage of Disaggregated Architecture
Improving Apache Spark by Taking Advantage of Disaggregated ArchitectureImproving Apache Spark by Taking Advantage of Disaggregated Architecture
Improving Apache Spark by Taking Advantage of Disaggregated Architecture
 
An Introduction to Maven
An Introduction to MavenAn Introduction to Maven
An Introduction to Maven
 
Rest api with Python
Rest api with PythonRest api with Python
Rest api with Python
 

Similar to AtoM feature development

symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
tutorialsruby
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
tutorialsruby
 
Using Apache Camel connectors for external connectivity
Using Apache Camel connectors for external connectivityUsing Apache Camel connectors for external connectivity
Using Apache Camel connectors for external connectivity
Claus Ibsen
 
Don't Fear the Autotools
Don't Fear the AutotoolsDon't Fear the Autotools
Don't Fear the Autotools
Scott Garman
 

Similar to AtoM feature development (20)

Moodle Development Best Pracitces
Moodle Development Best PracitcesMoodle Development Best Pracitces
Moodle Development Best Pracitces
 
Boltc CMS - a really quick overview
Boltc CMS - a really quick overviewBoltc CMS - a really quick overview
Boltc CMS - a really quick overview
 
Selenium Training in Chennai
Selenium Training in ChennaiSelenium Training in Chennai
Selenium Training in Chennai
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
 
Routing
RoutingRouting
Routing
 
Bootstrap4 x pages
Bootstrap4 x pagesBootstrap4 x pages
Bootstrap4 x pages
 
Log4j with selenium tutorial: How to Setup log4j logging in selenium automati...
Log4j with selenium tutorial: How to Setup log4j logging in selenium automati...Log4j with selenium tutorial: How to Setup log4j logging in selenium automati...
Log4j with selenium tutorial: How to Setup log4j logging in selenium automati...
 
Using Apache Camel connectors for external connectivity
Using Apache Camel connectors for external connectivityUsing Apache Camel connectors for external connectivity
Using Apache Camel connectors for external connectivity
 
Log4e
Log4eLog4e
Log4e
 
Django interview Questions| Edureka
Django interview  Questions| EdurekaDjango interview  Questions| Edureka
Django interview Questions| Edureka
 
Don't Fear the Autotools
Don't Fear the AutotoolsDon't Fear the Autotools
Don't Fear the Autotools
 
Django
DjangoDjango
Django
 
Joomla - CMS
Joomla - CMSJoomla - CMS
Joomla - CMS
 
Python Tutorial Part 2
Python Tutorial Part 2Python Tutorial Part 2
Python Tutorial Part 2
 
Dev days Szeged 2014: Plugin system in drupal 8
Dev days Szeged 2014: Plugin system in drupal 8Dev days Szeged 2014: Plugin system in drupal 8
Dev days Szeged 2014: Plugin system in drupal 8
 
appengine ja night #25 Google App Engine for PHP (English)
appengine ja night #25 Google App Engine for PHP (English)appengine ja night #25 Google App Engine for PHP (English)
appengine ja night #25 Google App Engine for PHP (English)
 
Build Python CMS The Plone Way
Build Python CMS The Plone WayBuild Python CMS The Plone Way
Build Python CMS The Plone Way
 
Plugins And Making Your Own
Plugins And Making Your OwnPlugins And Making Your Own
Plugins And Making Your Own
 
Becoming A Drupal Master Builder
Becoming A Drupal Master BuilderBecoming A Drupal Master Builder
Becoming A Drupal Master Builder
 

More from Artefactual Systems - AtoM

More from Artefactual Systems - AtoM (16)

AtoM Community Update: 2019-05
AtoM Community Update: 2019-05AtoM Community Update: 2019-05
AtoM Community Update: 2019-05
 
Creating your own AtoM demo data set for re-use with Vagrant
Creating your own AtoM demo data set for re-use with VagrantCreating your own AtoM demo data set for re-use with Vagrant
Creating your own AtoM demo data set for re-use with Vagrant
 
Looking Ahead: AtoM's governance, development, and future
Looking Ahead: AtoM's governance, development, and futureLooking Ahead: AtoM's governance, development, and future
Looking Ahead: AtoM's governance, development, and future
 
Contributing to the AtoM documentation
Contributing to the AtoM documentationContributing to the AtoM documentation
Contributing to the AtoM documentation
 
Installing AtoM with Ansible
Installing AtoM with AnsibleInstalling AtoM with Ansible
Installing AtoM with Ansible
 
Installing and Upgrading AtoM
Installing and Upgrading AtoMInstalling and Upgrading AtoM
Installing and Upgrading AtoM
 
Command-Line 101
Command-Line 101Command-Line 101
Command-Line 101
 
An Introduction to AtoM, Archivematica, and Artefactual Systems
An Introduction to AtoM, Archivematica, and Artefactual SystemsAn Introduction to AtoM, Archivematica, and Artefactual Systems
An Introduction to AtoM, Archivematica, and Artefactual Systems
 
National Archives of Norway - AtoM and Archivematica intro workshop
National Archives of Norway - AtoM and Archivematica intro workshopNational Archives of Norway - AtoM and Archivematica intro workshop
National Archives of Norway - AtoM and Archivematica intro workshop
 
Artefactual and Open Source Development
Artefactual and Open Source DevelopmentArtefactual and Open Source Development
Artefactual and Open Source Development
 
Technologie Proche: Imagining the Archival Systems of Tomorrow With the Tools...
Technologie Proche: Imagining the Archival Systems of Tomorrow With the Tools...Technologie Proche: Imagining the Archival Systems of Tomorrow With the Tools...
Technologie Proche: Imagining the Archival Systems of Tomorrow With the Tools...
 
AtoM Community Update 2016
AtoM Community Update 2016AtoM Community Update 2016
AtoM Community Update 2016
 
Project Documentation with Sphinx (or, How I Learned to Stop Worrying and Lov...
Project Documentation with Sphinx (or, How I Learned to Stop Worrying and Lov...Project Documentation with Sphinx (or, How I Learned to Stop Worrying and Lov...
Project Documentation with Sphinx (or, How I Learned to Stop Worrying and Lov...
 
Digital Curation using Archivematica and AtoM: DLF Forum 2015
Digital Curation using Archivematica and AtoM: DLF Forum 2015Digital Curation using Archivematica and AtoM: DLF Forum 2015
Digital Curation using Archivematica and AtoM: DLF Forum 2015
 
Introducing Binder: A Web-based, Open Source Digital Preservation Management ...
Introducing Binder: A Web-based, Open Source Digital Preservation Management ...Introducing Binder: A Web-based, Open Source Digital Preservation Management ...
Introducing Binder: A Web-based, Open Source Digital Preservation Management ...
 
Introducing the Digital Repository for Museum Collections (DRMC)
Introducing the Digital Repository for Museum Collections (DRMC)Introducing the Digital Repository for Museum Collections (DRMC)
Introducing the Digital Repository for Museum Collections (DRMC)
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
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...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 

AtoM feature development