Releasing High Quality Packages - Longhorn PHP 2021

Colin O'Dell
Colin O'DellLead Web Developer for Unleashed Technologies at Unleashed Technologies
@colinodell
Releasing High-
Quality Packages
@colinodell
@colinodell
@colinodell
PHP League Leadership Team
Maintainer of popular packages:
league/commonmark
league/html-to-markdown
colinodell/json5
Colin O'Dell
Principal Engineer
at Unleashed Technologies
@colinodell
What Are Packages?
Reusable libraries;
installed via Composer
@colinodell
PEAR / PHPClasses.org
@colinodell
@colinodell
PHP-FIG, PSR-0, & Composer
2009: Framework Interoperability Group adopts PSR-0 autoloading
standard
2011: Composer development begins
2012: Composer released with PSR-0 support
@colinodell
PHP-FIG, PSR-0, & Composer
321,100
Packages on Packagist
3.1 million
Unique Releases
@colinodell
Package Benefits
• Pre-written
• Reusable
• Community-maintained
• Framework-agnostic
• Easily installed
• Robust dependency resolution
@colinodell
Releasing Your Own Packages
@colinodell
Overview
Definition of Quality
Project Structure
Testing
Packaging
Releasing
Ongoing Maintenance
Development Best Practices
@colinodell
@colinodell
Definition of Quality
Semantically
Versioned
Actively
Maintained
User Friendly Composer
Installable
Extensively
Documented
S A U C E
@colinodell
Project Structure
@colinodell
Project
Structure
@colinodell
Project & Vendor Name
There are only two hard things in Computer
Science: cache invalidation and naming things.
-- Phil Karlton
@colinodell
Project & Vendor Name
PHP namespace = VendorNameProjectName
Packagist repo = vendor-name/project-name
•Choosing a name:
• Available
• Unique/memorable
• Easy to search
•Make names consistent
@colinodell
@colinodell
composer.json
@colinodell
composer.json
• Project dependencies
• Include PHP version &
extensions
@colinodell
composer.json
• Project dependencies
• Include PHP version &
extensions
• Development dependencies
@colinodell
composer.json
• Project dependencies
• Include PHP version &
extensions
• Development dependencies
• Autoloading configuration
• PSR-4, not PSR-0
• Separate namespace
for tests
@colinodell
Source
Code
@colinodell
Source Code
• Minimal dependencies; wide
constraint ranges
• Make framework agnostic
• Service providers for specific
frameworks okay
• Provide interfaces
• Consistent coding style (PSR-2?)
• Use community standards (PSRs)
• Follow best practices and design
principles
@colinodell
Project Hosting
Features:
• Project downloads
• Issue reporting
• Pull requests / code reviews
• Collaboration
• CI integrations
@colinodell
Testing
Automating the testing process
@colinodell
Automated
Tests
@colinodell
Unit Tests
• Test individual
components
• PHPUnit – defacto
standard
• Aim for 80% code
coverage
@colinodell
@colinodell
Automated Tests
• Not just unit tests:
• Functional tests
• Integration tests
• Acceptance tests
• Other good test frameworks:
• Phpspec
• Behat
• Codeception
• Don’t forget static analysis!
@colinodell
Static Analysis
Automated analysis of source code without executing the application
Checks for:
• Missing or incorrect type hints (param/return types and docblocks)
• Type errors
• Existence of methods and properties
• Unnecessary/useless code
• Correct argument types passed to (s)printf()
• etc.
Supports generics too!
@colinodell
Static Analysis
@colinodell
phpstan.neon.dist
@colinodell
psalm.xml
@colinodell
Continuous Integration
@colinodell
Continuous Integration
GitHub Actions
@colinodell
Continuous Integration
• Run tests across all supported
versions
• PHPUnit
• Check code style
• PHPCS
• Static code analysis
• Psalm
• PHPStan
• Track code quality metrics
• Scrutinizer CI
@colinodell
GitHub Actions
.github/workflows/tests.yml
@colinodell
phpcs.xml.dist
@colinodell
@colinodell
Project
Structure
@colinodell
Packaging
Getting the code ready for distribution
@colinodell
Licensing
• Modifications
• Distribution
• Attribution
• Commercial Use
Permissive: MIT; BSD; ISC
Prevent Closed Source: GPLv3; Mozilla Public License
Documentation: Creative Commons
@colinodell
Licensing
• choosealicense.com
• creativecommons.org/choose
@colinodell
Licensing
@colinodell
Licensing
@colinodell
Project
Structure
@colinodell
Documentation:
README.md
• What problem your package solves
• Installation steps
• Configuration
• Sample Usage
• FAQs
• Link to more comprehensive docs
• Badges!
@colinodell
Documentation:
docblocks
Benefits:
• Read docs while coding
• IDE auto-completion
• Short description
• Parameter types, names, and
purposes
• Return types
• Any thrown exceptions
@colinodell
Documentation:
RTFM
• Advanced usage or configuration
• Additional code samples
• Other functionality
Where to host?
• GitHub Pages
• Jekyll
• MkDocs
• Other static site generator
• readthedocs.org
• Your own hosting
@colinodell
Archive Settings
Package consumers (probably) don’t want:
• Tests
• Dev dependencies
• Issue / PR templates
• GitHub Actions configuration
• Your .gitignore development settings
• Images used in README
@colinodell
Archive Settings - .gitattributes
@colinodell
Archive Settings:
composer.json
{
@colinodell
Project
Structure
@colinodell
Packagist.org
@colinodell
Releasing
Launching your package
@colinodell
Semantic Versioning – semver.org
1.0.0 (stable)
or
0.1.0 (unstable)
@colinodell
Semantic Versioning – semver.org
x . y . z
Major . Minor . Patch
@colinodell
Semantic Versioning – semver.org
2 . 4 . 5
Major . Minor . Patch
Incompatible
Changes
Backwards-
Compatible;
New Features
Bug Fixes
@colinodell
2 . 4 . 6
2 . 4 . 5
Major . Minor . Patch
Incompatible
Changes
Backwards-
Compatible;
New Features
Bug Fixes
@colinodell
2 . 5 . 0
2 . 4 . 5
Major . Minor . Patch
Incompatible
Changes
Backwards-
Compatible;
New Features
Bug Fixes
@colinodell
3 . 0 . 0
2 . 4 . 5
Major . Minor . Patch
Incompatible
Changes
Backwards-
Compatible;
New Features
Bug Fixes
@colinodell
Semantic Versioning – semver.org
0 . x . y
Major . Minor . Patch
Any 0.x.y release may break backwards compatibility!
My recommendation: treat X.Y as major.minor
@colinodell
CHANGELOG.md
• Follow https://keepachangelog.com
@colinodell
@colinodell
Upgrading Notes
• Documentation on upgrading between major versions
• Describe BC breaks
• Provide instructions for users to update their code
UPGRADE.md file or in site docs
@colinodell
@colinodell
Tagging a
Release
@colinodell
Tagging a
Release
@colinodell
Tagging a
Release
@colinodell
Released!
@colinodell
Project
Structure
@colinodell
Ongoing Maintenance
Addressing issues, handling PRs, and maintaining your community
@colinodell
Maintainer Responsibilities
•Be responsive!
•Triage issues; keep queue clean
•Review PRs & provide feedback
•Share responsibility with core contributors
@colinodell
CONTRIBUTING.md
• Requirements
• Considerations
• Process
• Tips
@colinodell
Issue / PR Templates
@colinodell
Issue / PR Templates
@colinodell
Issue / PR Templates
@colinodell
@colinodell
CODE_OF_CONDUCT.md
• Expresses values and rules that contributors should adhere to
• Promotes inclusion and contributions
• Defines unacceptable behavior and enforcement
• https://www.contributor-covenant.org/
@colinodell
@colinodell
.editorconfig
• Defines preferred indentation style and line breaks
• Automatically configures contributor IDEs
• Most major IDEs supported
@colinodell
.gitignore
Ensures certain files are never committed to Git
@colinodell
Project
Structure
@colinodell
Further Reading
Additional information and resources on creating high-quality PHP packages
@colinodell
Further Reading
• https://github.com/thephpleague/skeleton
• http://phppackagechecklist.com
• https://getcomposer.org/doc/04-schema.md
• https://packagist.org/?type=phpcodesniffer-standard
• https://medium.com/bumble-tech/php-code-static-analysis-based-on-the-
example-of-phpstan-phan-and-psalm-a20654c4011d
• https://leanpub.com/principles-of-package-design
@colinodell
Questions?
Slides / Feedback: https://joind.in/talk/e81ae
@colinodell
Thank you!
Slides / Feedback: https://joind.in/talk/e81ae
1 of 87

Recommended

Magento 2 performance profiling and best practices by
Magento 2 performance profiling and best practicesMagento 2 performance profiling and best practices
Magento 2 performance profiling and best practicesJacques Bodin-Hullin
608 views32 slides
You Were Lied To About Optimization by
You Were Lied To About OptimizationYou Were Lied To About Optimization
You Were Lied To About OptimizationChris Tankersley
373 views61 slides
Developing PHP Applications Faster by
Developing PHP Applications FasterDeveloping PHP Applications Faster
Developing PHP Applications FasterAdam Culp
484 views56 slides
They why behind php frameworks by
They why behind php frameworksThey why behind php frameworks
They why behind php frameworksKirk Madera
254 views31 slides
Testing Alfresco extensions by
Testing Alfresco extensionsTesting Alfresco extensions
Testing Alfresco extensionsITD Systems
942 views22 slides
Enterprise PHP by
Enterprise PHPEnterprise PHP
Enterprise PHPMohammad Emran Hasan
1.9K views37 slides

More Related Content

What's hot

Backing Data Silo Atack: Alfresco sharding, SOLR for non-flat objects by
Backing Data Silo Atack: Alfresco sharding, SOLR for non-flat objectsBacking Data Silo Atack: Alfresco sharding, SOLR for non-flat objects
Backing Data Silo Atack: Alfresco sharding, SOLR for non-flat objectsITD Systems
868 views45 slides
TDD for APIs @ Europython 2015, Bilbao by Michael Kuehne by
TDD for APIs @ Europython 2015, Bilbao by Michael KuehneTDD for APIs @ Europython 2015, Bilbao by Michael Kuehne
TDD for APIs @ Europython 2015, Bilbao by Michael KuehneMichael Kuehne-Schlinkert
845 views22 slides
Automatic codefixes by
Automatic codefixesAutomatic codefixes
Automatic codefixesSven Rautenberg
321 views45 slides
Trunk-Based Development and Toggling by
Trunk-Based Development and TogglingTrunk-Based Development and Toggling
Trunk-Based Development and TogglingBryan Liu
785 views24 slides
Software Design Patterns in Laravel by Phill Sparks by
Software Design Patterns in Laravel by Phill SparksSoftware Design Patterns in Laravel by Phill Sparks
Software Design Patterns in Laravel by Phill SparksPhill Sparks
272.9K views51 slides
Perl Continous Integration by
Perl Continous IntegrationPerl Continous Integration
Perl Continous IntegrationMichael Peters
6K views34 slides

What's hot(20)

Backing Data Silo Atack: Alfresco sharding, SOLR for non-flat objects by ITD Systems
Backing Data Silo Atack: Alfresco sharding, SOLR for non-flat objectsBacking Data Silo Atack: Alfresco sharding, SOLR for non-flat objects
Backing Data Silo Atack: Alfresco sharding, SOLR for non-flat objects
ITD Systems868 views
Trunk-Based Development and Toggling by Bryan Liu
Trunk-Based Development and TogglingTrunk-Based Development and Toggling
Trunk-Based Development and Toggling
Bryan Liu785 views
Software Design Patterns in Laravel by Phill Sparks by Phill Sparks
Software Design Patterns in Laravel by Phill SparksSoftware Design Patterns in Laravel by Phill Sparks
Software Design Patterns in Laravel by Phill Sparks
Phill Sparks272.9K views
Android Continuous Integration and Automation - Enrique Lopez Manas, Sixt by DroidConTLV
Android Continuous Integration and Automation - Enrique Lopez Manas, SixtAndroid Continuous Integration and Automation - Enrique Lopez Manas, Sixt
Android Continuous Integration and Automation - Enrique Lopez Manas, Sixt
DroidConTLV1.5K views
Practical PHP Deployment with Jenkins by Adam Culp
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
Adam Culp11.3K views
Continuous delivery with open source tools by Sebastian Helzle
Continuous delivery with open source toolsContinuous delivery with open source tools
Continuous delivery with open source tools
Sebastian Helzle5.4K views
Continuous Integration at Mollie by willemstuursma
Continuous Integration at MollieContinuous Integration at Mollie
Continuous Integration at Mollie
willemstuursma2.2K views
Speed up your regression and reduce cost load with Selenoid + K8s + ReportPortal by Danylo Kuvshynov
Speed up your regression and reduce cost load with Selenoid + K8s + ReportPortalSpeed up your regression and reduce cost load with Selenoid + K8s + ReportPortal
Speed up your regression and reduce cost load with Selenoid + K8s + ReportPortal
Danylo Kuvshynov326 views
30 Skills to Master to Become a Senior Software Engineer by Sean Coates
30 Skills to Master to Become a Senior Software Engineer30 Skills to Master to Become a Senior Software Engineer
30 Skills to Master to Become a Senior Software Engineer
Sean Coates775 views
Integration Testing Practice using Perl by Masaki Nakagawa
Integration Testing Practice using PerlIntegration Testing Practice using Perl
Integration Testing Practice using Perl
Masaki Nakagawa6.6K views
Trying Out Tomorrow’s WordPress Today by DrewAPicture
Trying Out Tomorrow’s WordPress TodayTrying Out Tomorrow’s WordPress Today
Trying Out Tomorrow’s WordPress Today
DrewAPicture13.4K views
API Design in the Modern Era - Architecture Next 2020 by Eran Stiller
API Design in the Modern Era - Architecture Next 2020API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020
Eran Stiller308 views
Trunk Based Development in the Enterprise - Its Relevance and Economics by Perforce
Trunk Based Development in the Enterprise - Its Relevance and EconomicsTrunk Based Development in the Enterprise - Its Relevance and Economics
Trunk Based Development in the Enterprise - Its Relevance and Economics
Perforce9.8K views
KYSUC - Keep Your Schema Under Control by Coimbra JUG
KYSUC - Keep Your Schema Under ControlKYSUC - Keep Your Schema Under Control
KYSUC - Keep Your Schema Under Control
Coimbra JUG5.7K views
Ratpack Web Framework by Daniel Woods
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
Daniel Woods2.4K views

Similar to Releasing High Quality Packages - Longhorn PHP 2021

Releasing High Quality PHP Packages - ConFoo Montreal 2019 by
Releasing High Quality PHP Packages - ConFoo Montreal 2019Releasing High Quality PHP Packages - ConFoo Montreal 2019
Releasing High Quality PHP Packages - ConFoo Montreal 2019Colin O'Dell
625 views74 slides
Releasing High-Quality Packages - php[world] 2018 by
Releasing High-Quality Packages - php[world] 2018Releasing High-Quality Packages - php[world] 2018
Releasing High-Quality Packages - php[world] 2018Colin O'Dell
326 views73 slides
SQL Server DevOps Jumpstart by
SQL Server DevOps JumpstartSQL Server DevOps Jumpstart
SQL Server DevOps JumpstartOri Donner
1.6K views57 slides
Continuous Integration by
Continuous IntegrationContinuous Integration
Continuous IntegrationXPDays
123 views38 slides
Next Generation Architecture Showcase July 2019 by
Next Generation Architecture Showcase July 2019Next Generation Architecture Showcase July 2019
Next Generation Architecture Showcase July 2019Alan Pearson Mathews
121 views33 slides
CarTrawler's Feature Team Architecture and Development Process Showcase by Lu... by
CarTrawler's Feature Team Architecture and Development Process Showcase by Lu...CarTrawler's Feature Team Architecture and Development Process Showcase by Lu...
CarTrawler's Feature Team Architecture and Development Process Showcase by Lu...Lucas Sacramento
217 views33 slides

Similar to Releasing High Quality Packages - Longhorn PHP 2021(20)

Releasing High Quality PHP Packages - ConFoo Montreal 2019 by Colin O'Dell
Releasing High Quality PHP Packages - ConFoo Montreal 2019Releasing High Quality PHP Packages - ConFoo Montreal 2019
Releasing High Quality PHP Packages - ConFoo Montreal 2019
Colin O'Dell625 views
Releasing High-Quality Packages - php[world] 2018 by Colin O'Dell
Releasing High-Quality Packages - php[world] 2018Releasing High-Quality Packages - php[world] 2018
Releasing High-Quality Packages - php[world] 2018
Colin O'Dell326 views
SQL Server DevOps Jumpstart by Ori Donner
SQL Server DevOps JumpstartSQL Server DevOps Jumpstart
SQL Server DevOps Jumpstart
Ori Donner1.6K views
Continuous Integration by XPDays
Continuous IntegrationContinuous Integration
Continuous Integration
XPDays123 views
CarTrawler's Feature Team Architecture and Development Process Showcase by Lu... by Lucas Sacramento
CarTrawler's Feature Team Architecture and Development Process Showcase by Lu...CarTrawler's Feature Team Architecture and Development Process Showcase by Lu...
CarTrawler's Feature Team Architecture and Development Process Showcase by Lu...
Lucas Sacramento217 views
Sitecore development approach evolution – destination helix by Peter Nazarov
Sitecore development approach evolution – destination helixSitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helix
Peter Nazarov406 views
Understand release engineering by gaoliang641
Understand release engineeringUnderstand release engineering
Understand release engineering
gaoliang6415.4K views
OUG Ireland Meet-up 12th January by Brendan Tierney
OUG Ireland Meet-up 12th JanuaryOUG Ireland Meet-up 12th January
OUG Ireland Meet-up 12th January
Brendan Tierney2.4K views
Continuous Delivery: Fly the Friendly CI in Pivotal Cloud Foundry with Concourse by VMware Tanzu
Continuous Delivery: Fly the Friendly CI in Pivotal Cloud Foundry with ConcourseContinuous Delivery: Fly the Friendly CI in Pivotal Cloud Foundry with Concourse
Continuous Delivery: Fly the Friendly CI in Pivotal Cloud Foundry with Concourse
VMware Tanzu1.8K views
Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao... by hamidsamadi
Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...
Git workflows á la-carte, Presenation at jdays2013 www.jdays.se by Nicola Pao...
hamidsamadi890 views
The Future of Adhearson by Mojo Lingo
The Future of AdhearsonThe Future of Adhearson
The Future of Adhearson
Mojo Lingo371 views
QConSP 2014 - Continuous Delivery - Part 03 - Continuous Integration by Rodrigo Russo
QConSP 2014 - Continuous Delivery - Part 03 - Continuous IntegrationQConSP 2014 - Continuous Delivery - Part 03 - Continuous Integration
QConSP 2014 - Continuous Delivery - Part 03 - Continuous Integration
Rodrigo Russo1.5K views
Build your android app with gradle by Swain Loda
Build your android app with gradleBuild your android app with gradle
Build your android app with gradle
Swain Loda186 views
Continuous Deployment to the cloud by VMware Tanzu
Continuous Deployment to the cloudContinuous Deployment to the cloud
Continuous Deployment to the cloud
VMware Tanzu341 views
Symfony2 for legacy app rejuvenation: the eZ Publish case study by Gaetano Giunta
Symfony2 for legacy app rejuvenation: the eZ Publish case studySymfony2 for legacy app rejuvenation: the eZ Publish case study
Symfony2 for legacy app rejuvenation: the eZ Publish case study
Gaetano Giunta2K views
Continuous Deployment of your Application @SpringOne by ciberkleid
Continuous Deployment of your Application @SpringOneContinuous Deployment of your Application @SpringOne
Continuous Deployment of your Application @SpringOne
ciberkleid491 views

More from Colin O'Dell

Demystifying Unicode - Longhorn PHP 2021 by
Demystifying Unicode - Longhorn PHP 2021Demystifying Unicode - Longhorn PHP 2021
Demystifying Unicode - Longhorn PHP 2021Colin O'Dell
263 views116 slides
Debugging Effectively - ConFoo Montreal 2019 by
Debugging Effectively - ConFoo Montreal 2019Debugging Effectively - ConFoo Montreal 2019
Debugging Effectively - ConFoo Montreal 2019Colin O'Dell
499 views70 slides
Automating Deployments with Deployer - php[world] 2018 by
Automating Deployments with Deployer - php[world] 2018Automating Deployments with Deployer - php[world] 2018
Automating Deployments with Deployer - php[world] 2018Colin O'Dell
468 views89 slides
Debugging Effectively - DrupalCon Nashville 2018 by
Debugging Effectively - DrupalCon Nashville 2018Debugging Effectively - DrupalCon Nashville 2018
Debugging Effectively - DrupalCon Nashville 2018Colin O'Dell
830 views70 slides
CommonMark: Markdown Done Right - ZendCon 2017 by
CommonMark: Markdown Done Right - ZendCon 2017CommonMark: Markdown Done Right - ZendCon 2017
CommonMark: Markdown Done Right - ZendCon 2017Colin O'Dell
1.4K views61 slides
Rise of the Machines: PHP and IoT - ZendCon 2017 by
Rise of the Machines: PHP and IoT - ZendCon 2017Rise of the Machines: PHP and IoT - ZendCon 2017
Rise of the Machines: PHP and IoT - ZendCon 2017Colin O'Dell
2.3K views67 slides

More from Colin O'Dell(20)

Demystifying Unicode - Longhorn PHP 2021 by Colin O'Dell
Demystifying Unicode - Longhorn PHP 2021Demystifying Unicode - Longhorn PHP 2021
Demystifying Unicode - Longhorn PHP 2021
Colin O'Dell263 views
Debugging Effectively - ConFoo Montreal 2019 by Colin O'Dell
Debugging Effectively - ConFoo Montreal 2019Debugging Effectively - ConFoo Montreal 2019
Debugging Effectively - ConFoo Montreal 2019
Colin O'Dell499 views
Automating Deployments with Deployer - php[world] 2018 by Colin O'Dell
Automating Deployments with Deployer - php[world] 2018Automating Deployments with Deployer - php[world] 2018
Automating Deployments with Deployer - php[world] 2018
Colin O'Dell468 views
Debugging Effectively - DrupalCon Nashville 2018 by Colin O'Dell
Debugging Effectively - DrupalCon Nashville 2018Debugging Effectively - DrupalCon Nashville 2018
Debugging Effectively - DrupalCon Nashville 2018
Colin O'Dell830 views
CommonMark: Markdown Done Right - ZendCon 2017 by Colin O'Dell
CommonMark: Markdown Done Right - ZendCon 2017CommonMark: Markdown Done Right - ZendCon 2017
CommonMark: Markdown Done Right - ZendCon 2017
Colin O'Dell1.4K views
Rise of the Machines: PHP and IoT - ZendCon 2017 by Colin O'Dell
Rise of the Machines: PHP and IoT - ZendCon 2017Rise of the Machines: PHP and IoT - ZendCon 2017
Rise of the Machines: PHP and IoT - ZendCon 2017
Colin O'Dell2.3K views
Debugging Effectively - All Things Open 2017 by Colin O'Dell
Debugging Effectively - All Things Open 2017Debugging Effectively - All Things Open 2017
Debugging Effectively - All Things Open 2017
Colin O'Dell1.1K views
Hacking Your Way To Better Security - DrupalCon Baltimore 2017 by Colin O'Dell
Hacking Your Way To Better Security - DrupalCon Baltimore 2017Hacking Your Way To Better Security - DrupalCon Baltimore 2017
Hacking Your Way To Better Security - DrupalCon Baltimore 2017
Colin O'Dell1.4K views
Debugging Effectively - PHP UK 2017 by Colin O'Dell
Debugging Effectively - PHP UK 2017Debugging Effectively - PHP UK 2017
Debugging Effectively - PHP UK 2017
Colin O'Dell1.7K views
Debugging Effectively - SunshinePHP 2017 by Colin O'Dell
Debugging Effectively - SunshinePHP 2017Debugging Effectively - SunshinePHP 2017
Debugging Effectively - SunshinePHP 2017
Colin O'Dell432 views
Automating Your Workflow with Gulp.js - php[world] 2016 by Colin O'Dell
Automating Your Workflow with Gulp.js - php[world] 2016Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016
Colin O'Dell1.3K views
Rise of the Machines: PHP and IoT - php[world] 2016 by Colin O'Dell
Rise of the Machines: PHP and IoT - php[world] 2016Rise of the Machines: PHP and IoT - php[world] 2016
Rise of the Machines: PHP and IoT - php[world] 2016
Colin O'Dell1.6K views
Debugging Effectively - ZendCon 2016 by Colin O'Dell
Debugging Effectively - ZendCon 2016Debugging Effectively - ZendCon 2016
Debugging Effectively - ZendCon 2016
Colin O'Dell520 views
Hacking Your Way to Better Security - ZendCon 2016 by Colin O'Dell
Hacking Your Way to Better Security - ZendCon 2016Hacking Your Way to Better Security - ZendCon 2016
Hacking Your Way to Better Security - ZendCon 2016
Colin O'Dell601 views
Hacking Your Way to Better Security - PHP South Africa 2016 by Colin O'Dell
Hacking Your Way to Better Security - PHP South Africa 2016Hacking Your Way to Better Security - PHP South Africa 2016
Hacking Your Way to Better Security - PHP South Africa 2016
Colin O'Dell959 views
Debugging Effectively - DrupalCon Europe 2016 by Colin O'Dell
Debugging Effectively - DrupalCon Europe 2016Debugging Effectively - DrupalCon Europe 2016
Debugging Effectively - DrupalCon Europe 2016
Colin O'Dell544 views
CommonMark: Markdown done right - Nomad PHP September 2016 by Colin O'Dell
CommonMark: Markdown done right - Nomad PHP September 2016CommonMark: Markdown done right - Nomad PHP September 2016
CommonMark: Markdown done right - Nomad PHP September 2016
Colin O'Dell1.1K views
Debugging Effectively - Frederick Web Tech 9/6/16 by Colin O'Dell
Debugging Effectively - Frederick Web Tech 9/6/16Debugging Effectively - Frederick Web Tech 9/6/16
Debugging Effectively - Frederick Web Tech 9/6/16
Colin O'Dell604 views
Debugging Effectively by Colin O'Dell
Debugging EffectivelyDebugging Effectively
Debugging Effectively
Colin O'Dell1.7K views
Hacking Your Way To Better Security - Dutch PHP Conference 2016 by Colin O'Dell
Hacking Your Way To Better Security - Dutch PHP Conference 2016Hacking Your Way To Better Security - Dutch PHP Conference 2016
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Colin O'Dell863 views

Recently uploaded

Ports-and-Adapters Architecture for Embedded HMI by
Ports-and-Adapters Architecture for Embedded HMIPorts-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMIBurkhard Stubert
35 views19 slides
What is API by
What is APIWhat is API
What is APIartembondar5
15 views15 slides
predicting-m3-devopsconMunich-2023.pptx by
predicting-m3-devopsconMunich-2023.pptxpredicting-m3-devopsconMunich-2023.pptx
predicting-m3-devopsconMunich-2023.pptxTier1 app
10 views24 slides
Quality Engineer: A Day in the Life by
Quality Engineer: A Day in the LifeQuality Engineer: A Day in the Life
Quality Engineer: A Day in the LifeJohn Valentino
10 views18 slides
Automated Testing of Microsoft Power BI Reports by
Automated Testing of Microsoft Power BI ReportsAutomated Testing of Microsoft Power BI Reports
Automated Testing of Microsoft Power BI ReportsRTTS
11 views20 slides
Transport Management System - Shipment & Container Tracking by
Transport Management System - Shipment & Container TrackingTransport Management System - Shipment & Container Tracking
Transport Management System - Shipment & Container TrackingFreightoscope
6 views3 slides

Recently uploaded(20)

Ports-and-Adapters Architecture for Embedded HMI by Burkhard Stubert
Ports-and-Adapters Architecture for Embedded HMIPorts-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMI
Burkhard Stubert35 views
predicting-m3-devopsconMunich-2023.pptx by Tier1 app
predicting-m3-devopsconMunich-2023.pptxpredicting-m3-devopsconMunich-2023.pptx
predicting-m3-devopsconMunich-2023.pptx
Tier1 app10 views
Quality Engineer: A Day in the Life by John Valentino
Quality Engineer: A Day in the LifeQuality Engineer: A Day in the Life
Quality Engineer: A Day in the Life
John Valentino10 views
Automated Testing of Microsoft Power BI Reports by RTTS
Automated Testing of Microsoft Power BI ReportsAutomated Testing of Microsoft Power BI Reports
Automated Testing of Microsoft Power BI Reports
RTTS11 views
Transport Management System - Shipment & Container Tracking by Freightoscope
Transport Management System - Shipment & Container TrackingTransport Management System - Shipment & Container Tracking
Transport Management System - Shipment & Container Tracking
Freightoscope 6 views
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P... by NimaTorabi2
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...
NimaTorabi217 views
predicting-m3-devopsconMunich-2023-v2.pptx by Tier1 app
predicting-m3-devopsconMunich-2023-v2.pptxpredicting-m3-devopsconMunich-2023-v2.pptx
predicting-m3-devopsconMunich-2023-v2.pptx
Tier1 app14 views
FOSSLight Community Day 2023-11-30 by Shane Coughlan
FOSSLight Community Day 2023-11-30FOSSLight Community Day 2023-11-30
FOSSLight Community Day 2023-11-30
Shane Coughlan8 views
Electronic AWB - Electronic Air Waybill by Freightoscope
Electronic AWB - Electronic Air Waybill Electronic AWB - Electronic Air Waybill
Electronic AWB - Electronic Air Waybill
Freightoscope 6 views
Introduction to Git Source Control by John Valentino
Introduction to Git Source ControlIntroduction to Git Source Control
Introduction to Git Source Control
John Valentino8 views
Mobile App Development Company by Richestsoft
Mobile App Development CompanyMobile App Development Company
Mobile App Development Company
Richestsoft 5 views

Releasing High Quality Packages - Longhorn PHP 2021