How do plugin-style addons actually work? Many of us have reaped the benefits of an Ember addon plugin approach, like with ember-service-worker and ember-cli-deploy.
These ecosystems utilize the build process to enable a plugin architecture requiring only configuration to implement powerful capabilities. But how, you ask?
We’ll do a technical deep dive into the mechanics of how the ember-service-worker ecosystem utilizes plugins. Along the way we’ll investigate the addon lifecycle and broccoli customizations. Finally we’ll touch on the unique problems of testing such addons.
Details on how we capture application data in our access and error logs, as well as how to generate quick reports and graphs from these logs.
This talk was presented at O'Reilly's Velocity Online Conference on October 26, 2011.
The document discusses best practices and anti-patterns for Django projects. It recommends keeping projects simple by avoiding over-engineering, using application-based modular design, and properly structuring settings files across multiple environments rather than relying on local_settings.py files. It also addresses common issues like import errors caused by PYTHONPATH configuration.
Stop Hacking WordPress, Start Working with it - Charly Leetham - WordCamp Syd...WordCamp Sydney
Many developers know how to write code in php but that doesn't mean they can write code for Wordpress.
When developing sites for clients in Wordpress, it sometimes preferably to write a custom function that will simplify data input, management and display.
The Wordpress coding framework is continually evolving and provides a number of hooks (through actions & filters) to allow developers to quickly and easily grab functions to create world class websites.
Charly will speak about the power of hooks and filters and explain some of the most common ones to use if you want to write your own custom functions, to make the management of your wordpress websites a breeze.
This document discusses Noah, a system for orchestration and coordination of infrastructure components like configuration management tools, applications, servers, and services. Noah uses a hierarchical data model and API to represent these components as objects that can be manipulated and watched. It aims to address the need for orchestration beyond single nodes and provide synchronization between different aspects of infrastructure.
The document discusses the importance of testing services and provides various strategies and tools for doing so effectively when developing software applications. It begins by defining what a service is and why testing services is important for building reliable applications. It then outlines challenges with testing external APIs and services that are beyond a developer's control. The document spends significant time exploring different approaches for stubbing or mocking external services in tests to avoid real network requests. These include built-in stubbing tools, services that provide pre-recorded responses, and technologies that can automatically record and replay API responses for future tests. It emphasizes the benefits of each approach and provides examples of implementing them. Finally, it discusses additional techniques for verifying tests that interact with external services.
This document discusses metrics-driven engineering practices at Etsy including collecting and visualizing business, application, and system metrics to gain visibility and make data-driven decisions. Key points include using tools like Ganglia, Graphite, Splunk, Logster, and StatsD to monitor metrics on clusters, applications, logs, and more. The metrics provide insights on site traffic, feature usage, server health, code deployments, and errors to help optimize performance, detect and address issues, and plan infrastructure needs.
CodeIgniter is an MVC framework that allows developers to build applications in a logical manner. It provides features like clean URLs, form validation, security protections, and image manipulation tools out of the box. While CodeIgniter does not enforce rigid structures, it enables organization of applications into models, views, and controllers. It aims to help developers write code faster without forcing atypical approaches. The framework has good documentation and an active community for support.
Crossing the Bridge: Connecting Rails and your Front-end FrameworkDaniel Spector
1. The document discusses integrating front-end frameworks like Angular, Ember, and React with Rails by constructing JSON APIs, preloading data to avoid loading screens, and server-side rendering for SEO and performance.
2. It provides code examples for building a TODO application with each framework, including using ngResource and factories in Angular, Ember conventions like Ember Data, and building isolated React components.
3. Server-side rendering is highlighted as the future for isomorphic JavaScript, providing benefits like prerendering on initial page load.
Details on how we capture application data in our access and error logs, as well as how to generate quick reports and graphs from these logs.
This talk was presented at O'Reilly's Velocity Online Conference on October 26, 2011.
The document discusses best practices and anti-patterns for Django projects. It recommends keeping projects simple by avoiding over-engineering, using application-based modular design, and properly structuring settings files across multiple environments rather than relying on local_settings.py files. It also addresses common issues like import errors caused by PYTHONPATH configuration.
Stop Hacking WordPress, Start Working with it - Charly Leetham - WordCamp Syd...WordCamp Sydney
Many developers know how to write code in php but that doesn't mean they can write code for Wordpress.
When developing sites for clients in Wordpress, it sometimes preferably to write a custom function that will simplify data input, management and display.
The Wordpress coding framework is continually evolving and provides a number of hooks (through actions & filters) to allow developers to quickly and easily grab functions to create world class websites.
Charly will speak about the power of hooks and filters and explain some of the most common ones to use if you want to write your own custom functions, to make the management of your wordpress websites a breeze.
This document discusses Noah, a system for orchestration and coordination of infrastructure components like configuration management tools, applications, servers, and services. Noah uses a hierarchical data model and API to represent these components as objects that can be manipulated and watched. It aims to address the need for orchestration beyond single nodes and provide synchronization between different aspects of infrastructure.
The document discusses the importance of testing services and provides various strategies and tools for doing so effectively when developing software applications. It begins by defining what a service is and why testing services is important for building reliable applications. It then outlines challenges with testing external APIs and services that are beyond a developer's control. The document spends significant time exploring different approaches for stubbing or mocking external services in tests to avoid real network requests. These include built-in stubbing tools, services that provide pre-recorded responses, and technologies that can automatically record and replay API responses for future tests. It emphasizes the benefits of each approach and provides examples of implementing them. Finally, it discusses additional techniques for verifying tests that interact with external services.
This document discusses metrics-driven engineering practices at Etsy including collecting and visualizing business, application, and system metrics to gain visibility and make data-driven decisions. Key points include using tools like Ganglia, Graphite, Splunk, Logster, and StatsD to monitor metrics on clusters, applications, logs, and more. The metrics provide insights on site traffic, feature usage, server health, code deployments, and errors to help optimize performance, detect and address issues, and plan infrastructure needs.
CodeIgniter is an MVC framework that allows developers to build applications in a logical manner. It provides features like clean URLs, form validation, security protections, and image manipulation tools out of the box. While CodeIgniter does not enforce rigid structures, it enables organization of applications into models, views, and controllers. It aims to help developers write code faster without forcing atypical approaches. The framework has good documentation and an active community for support.
Crossing the Bridge: Connecting Rails and your Front-end FrameworkDaniel Spector
1. The document discusses integrating front-end frameworks like Angular, Ember, and React with Rails by constructing JSON APIs, preloading data to avoid loading screens, and server-side rendering for SEO and performance.
2. It provides code examples for building a TODO application with each framework, including using ngResource and factories in Angular, Ember conventions like Ember Data, and building isolated React components.
3. Server-side rendering is highlighted as the future for isomorphic JavaScript, providing benefits like prerendering on initial page load.
This document discusses GAEO, a web framework for developing applications on Google App Engine. It summarizes GAEO's model-view-controller architecture and how it handles common tasks like routing, accessing request parameters, sessions and cookies. It also covers how to extend GAEO through plugins and includes contact information for the GAEO community.
This document discusses Sling Models in AEM, including what they are, why they are useful, how to use them, and examples of Sling Model annotations. Sling Models allow mapping of Sling objects like resources and requests to plain Java objects using annotations. They reduce coding efforts and make code more maintainable by avoiding redundant code. The document covers the necessary dependencies, common annotations like @Model, @Inject, @Optional, and examples of injecting resources, child resources, and retrieving values from the request.
The document discusses best practices for using RSpec, a testing library for Ruby projects. It provides examples of good and bad ways to write RSpec tests and describes techniques like using contexts and shared examples to organize tests and DRY up code. The document emphasizes testing edge cases, mocking only when needed, creating data dynamically in tests rather than using fixtures, and following practices like describing methods under test and having single-expectation tests. It encourages starting to use RSpec and provides contact information for the author to learn more.
Supercharging WordPress Development - Wordcamp Brighton 2019Adam Tomat
Slide links:
- https://lumberjack.rareloop.com
- https://docs.lumberjack.rareloop.com
- https://github.com/Rareloop/lumberjack-bedrock-installer
- https://github.com/Rareloop/lumberjack
- https://github.com/Rareloop/lumberjack-validation
- https://github.com/Rareloop/hatchet
- rareloop.com/careers
- https://www.rareloop.com/posts/comparing-modern-mvc-wordpress-frameworks/
- https://lizkeogh.com/2017/08/31/reflecting-reality/amp
- https://www.youtube.com/watch?v=uQUxJObxTUs
- https://www.upstatement.com/timber
- https://roots.io/bedrock
---
Often WordPress themes are not easy to change, maintain or fun to work on. This can rule WordPress out as a viable option for bespoke, non-trivial websites.
In this talk we’ll dive into how this happens & look at how we can benefit from software engineering techniques to help make your code easier to change. I’ll also show how using Lumberjack, a powerful MVC framework built on Timber, can be used to power-up your themes.
This document provides an introduction to PHP for WordPress themes and plugins. It explains where PHP code is used, basic PHP syntax like variables and conditionals, and common WordPress PHP functions. Key topics covered include the PHP opening and closing tags, variable types, conditional statements, loops, and functions for retrieving post data like the title and content. The goal is to explain the basics of PHP in a WordPress context for those familiar with HTML and theme files.
Presentation on user-focused testing and product development for the WordPress DC October 2011 meetup. Similar to my presentation from WordCamp Portland, but much better!
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...apidays
The document discusses specification-driven development and maintaining OpenAPI specifications. It provides examples of using TinySpec to define models and endpoints in separate files. Specifications can then be used to write endpoint tests that validate response data structures and types. They can also be used to validate user-provided data against JSON schemas before updating models in the code. Specifications allow reusing defined formats across tests, input validation, and response serialization.
OSCON Google App Engine Codelab - July 2010ikailan
Slides for the App Engine codelab given on July 20, 2010. Note that a more verbose version of this codelab is available at:
https://sites.google.com/site/gdevelopercodelabs/app-engine/python-codelab
Django is very stable web-framework that has been actively developed over past ten years. There might be many tutorials and talks out there about Django but there is hardly one that is more catered to mobile developers. After all, mobile developers have to carefully choose a backend for their app because it’s the building block of a good project.This talk is not only for mobile app developers but also for beginners in both Python and Django. This talk will suggest libraries and show how they can help you implement a wonderful and flexible project. Video : https://www.youtube.com/watch?v=-RpxpKuyCBE&t=1s
This document discusses Oracle Java certification paths. It provides an overview of Oracle's certification categories including Oracle Certified Associate, Professional, Master, and Expert. It then focuses on the steps to achieve the Oracle Certified Master certification for Java SE 6 Developer, which includes having a prior certification, completing training, an assignment, essay exam, and application form. The assignment and essay exam topics are also outlined. Breaking the certification process into steps helps applicants understand the requirements to advance their skills and achieve Oracle's highest certification level.
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...apidays
This document discusses API versioning with REST, JSON, and Swagger. It argues that RESTful APIs do not need extensive versioning if they follow best practices. JSON provides good compatibility for payloads when fields are added without breaking existing clients. Swagger allows comparing versions to understand breaking changes and ensure backward compatibility when needed.
Web Performance Culture and Tools at EtsyMike Brittain
Mike Brittain presented on web performance culture and tools at Etsy. He discussed how Etsy focuses on performance to improve business metrics like conversion rates and page views. Engineers use tools like logging, Logster, Graphite, StatsD, and custom dashboards to measure performance. They have processes for continuous deployment, data-driven development and prioritizing optimizations. The tools and focus on measurement help Etsy engineers improve site stability and user experience.
An introduction to AWS Elastic Beanstalk, a service to help run your Java web applications on the Amazon cloud, leaving you free to focus on your app. Slides from the London Java Community meetup, 1st June 2011.
This document discusses dependency injection (DI) and its benefits when applied in real world projects. It defines DI as a pattern that allows removal of hard-coded dependencies and makes dependencies changeable. The document explains that DI improves code reuse, testability, and maintainability by reducing tight coupling between classes. It presents different DI techniques like constructor injection and describes how to configure dependencies using annotations or XML configuration. The benefits of DI mentioned include easy unit testing, supporting multiple configurations of a class, and mocking external services.
Real-time Insights, powered by Reactive ProgrammingJay Phelps
Presented at Netflix HQ, March 21st, 2017
The time it takes you to debug your systems is critical, both in production and development. In this talk we'll reveal how we harness the power of Reactive Programming with RxJS and RxJava to provide real-time querying and transformation of extremely high volume logs.
The document discusses socket applications and real-time communication. It describes common examples like chat, live feeds, and games. It then explains the typical solution of using AJAX requests and the problems with that approach. The proposed solution is to use a multi-threaded model with asynchronous I/O and the reactor pattern to process requests while waiting for network responses. Various tools for implementing this pattern in Ruby and JavaScript are also mentioned, including Pusher, Socket.IO, and SocketStream.
Programming of middle and large size applications with a team of programmers require predefined style guides, structure, selected technologies and tools. Development with technologies and in platforms / languages, that are not familiar to the development team, hide different pitfalls, that could cause expensive problems.
Scaffolding / code generation is an effective answer for these challenges: it can increase productivity 3 times, and it gently enforces the architecture decisions also by less experienced developers.
This session introduces the Yeoman code generator framework. It shows the structure of generator code, speaks about testing of generators and pitfalls by writing your own generator.
Yasuo Harada is a PHP developer in Osaka who blogs about slyly walking PHP techniques. He gave a presentation about using plugins in three stages: 1) Organize functionality into plugins by feature, 2) Share generic plugins between applications, and 3) Gradually improve plugins during development and repair. Plugins can be used to add features like debugging, user management, mailing, and theming. Templates, assets, and translations can be included in plugins and used in applications. Custom dispatchers can be created to handle asset loading from plugins.
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkAmazon Web Services
AWS offers a number of services that help you easily deploy and run applications in the cloud. Come to this session to learn how to choose among these options. Through interactive demonstrations, this session will show you how to get an application running using AWS OpsWorks and AWS Elastic Beanstalk application management services. You will also learn how to use AWS CloudFormation templates to document, version control, and share your application configuration. This session will cover topics like application updates, customization, and working with resources such as load balancers and databases.
This document discusses GAEO, a web framework for developing applications on Google App Engine. It summarizes GAEO's model-view-controller architecture and how it handles common tasks like routing, accessing request parameters, sessions and cookies. It also covers how to extend GAEO through plugins and includes contact information for the GAEO community.
This document discusses Sling Models in AEM, including what they are, why they are useful, how to use them, and examples of Sling Model annotations. Sling Models allow mapping of Sling objects like resources and requests to plain Java objects using annotations. They reduce coding efforts and make code more maintainable by avoiding redundant code. The document covers the necessary dependencies, common annotations like @Model, @Inject, @Optional, and examples of injecting resources, child resources, and retrieving values from the request.
The document discusses best practices for using RSpec, a testing library for Ruby projects. It provides examples of good and bad ways to write RSpec tests and describes techniques like using contexts and shared examples to organize tests and DRY up code. The document emphasizes testing edge cases, mocking only when needed, creating data dynamically in tests rather than using fixtures, and following practices like describing methods under test and having single-expectation tests. It encourages starting to use RSpec and provides contact information for the author to learn more.
Supercharging WordPress Development - Wordcamp Brighton 2019Adam Tomat
Slide links:
- https://lumberjack.rareloop.com
- https://docs.lumberjack.rareloop.com
- https://github.com/Rareloop/lumberjack-bedrock-installer
- https://github.com/Rareloop/lumberjack
- https://github.com/Rareloop/lumberjack-validation
- https://github.com/Rareloop/hatchet
- rareloop.com/careers
- https://www.rareloop.com/posts/comparing-modern-mvc-wordpress-frameworks/
- https://lizkeogh.com/2017/08/31/reflecting-reality/amp
- https://www.youtube.com/watch?v=uQUxJObxTUs
- https://www.upstatement.com/timber
- https://roots.io/bedrock
---
Often WordPress themes are not easy to change, maintain or fun to work on. This can rule WordPress out as a viable option for bespoke, non-trivial websites.
In this talk we’ll dive into how this happens & look at how we can benefit from software engineering techniques to help make your code easier to change. I’ll also show how using Lumberjack, a powerful MVC framework built on Timber, can be used to power-up your themes.
This document provides an introduction to PHP for WordPress themes and plugins. It explains where PHP code is used, basic PHP syntax like variables and conditionals, and common WordPress PHP functions. Key topics covered include the PHP opening and closing tags, variable types, conditional statements, loops, and functions for retrieving post data like the title and content. The goal is to explain the basics of PHP in a WordPress context for those familiar with HTML and theme files.
Presentation on user-focused testing and product development for the WordPress DC October 2011 meetup. Similar to my presentation from WordCamp Portland, but much better!
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...apidays
The document discusses specification-driven development and maintaining OpenAPI specifications. It provides examples of using TinySpec to define models and endpoints in separate files. Specifications can then be used to write endpoint tests that validate response data structures and types. They can also be used to validate user-provided data against JSON schemas before updating models in the code. Specifications allow reusing defined formats across tests, input validation, and response serialization.
OSCON Google App Engine Codelab - July 2010ikailan
Slides for the App Engine codelab given on July 20, 2010. Note that a more verbose version of this codelab is available at:
https://sites.google.com/site/gdevelopercodelabs/app-engine/python-codelab
Django is very stable web-framework that has been actively developed over past ten years. There might be many tutorials and talks out there about Django but there is hardly one that is more catered to mobile developers. After all, mobile developers have to carefully choose a backend for their app because it’s the building block of a good project.This talk is not only for mobile app developers but also for beginners in both Python and Django. This talk will suggest libraries and show how they can help you implement a wonderful and flexible project. Video : https://www.youtube.com/watch?v=-RpxpKuyCBE&t=1s
This document discusses Oracle Java certification paths. It provides an overview of Oracle's certification categories including Oracle Certified Associate, Professional, Master, and Expert. It then focuses on the steps to achieve the Oracle Certified Master certification for Java SE 6 Developer, which includes having a prior certification, completing training, an assignment, essay exam, and application form. The assignment and essay exam topics are also outlined. Breaking the certification process into steps helps applicants understand the requirements to advance their skills and achieve Oracle's highest certification level.
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...apidays
This document discusses API versioning with REST, JSON, and Swagger. It argues that RESTful APIs do not need extensive versioning if they follow best practices. JSON provides good compatibility for payloads when fields are added without breaking existing clients. Swagger allows comparing versions to understand breaking changes and ensure backward compatibility when needed.
Web Performance Culture and Tools at EtsyMike Brittain
Mike Brittain presented on web performance culture and tools at Etsy. He discussed how Etsy focuses on performance to improve business metrics like conversion rates and page views. Engineers use tools like logging, Logster, Graphite, StatsD, and custom dashboards to measure performance. They have processes for continuous deployment, data-driven development and prioritizing optimizations. The tools and focus on measurement help Etsy engineers improve site stability and user experience.
An introduction to AWS Elastic Beanstalk, a service to help run your Java web applications on the Amazon cloud, leaving you free to focus on your app. Slides from the London Java Community meetup, 1st June 2011.
This document discusses dependency injection (DI) and its benefits when applied in real world projects. It defines DI as a pattern that allows removal of hard-coded dependencies and makes dependencies changeable. The document explains that DI improves code reuse, testability, and maintainability by reducing tight coupling between classes. It presents different DI techniques like constructor injection and describes how to configure dependencies using annotations or XML configuration. The benefits of DI mentioned include easy unit testing, supporting multiple configurations of a class, and mocking external services.
Real-time Insights, powered by Reactive ProgrammingJay Phelps
Presented at Netflix HQ, March 21st, 2017
The time it takes you to debug your systems is critical, both in production and development. In this talk we'll reveal how we harness the power of Reactive Programming with RxJS and RxJava to provide real-time querying and transformation of extremely high volume logs.
The document discusses socket applications and real-time communication. It describes common examples like chat, live feeds, and games. It then explains the typical solution of using AJAX requests and the problems with that approach. The proposed solution is to use a multi-threaded model with asynchronous I/O and the reactor pattern to process requests while waiting for network responses. Various tools for implementing this pattern in Ruby and JavaScript are also mentioned, including Pusher, Socket.IO, and SocketStream.
Programming of middle and large size applications with a team of programmers require predefined style guides, structure, selected technologies and tools. Development with technologies and in platforms / languages, that are not familiar to the development team, hide different pitfalls, that could cause expensive problems.
Scaffolding / code generation is an effective answer for these challenges: it can increase productivity 3 times, and it gently enforces the architecture decisions also by less experienced developers.
This session introduces the Yeoman code generator framework. It shows the structure of generator code, speaks about testing of generators and pitfalls by writing your own generator.
Yasuo Harada is a PHP developer in Osaka who blogs about slyly walking PHP techniques. He gave a presentation about using plugins in three stages: 1) Organize functionality into plugins by feature, 2) Share generic plugins between applications, and 3) Gradually improve plugins during development and repair. Plugins can be used to add features like debugging, user management, mailing, and theming. Templates, assets, and translations can be included in plugins and used in applications. Custom dispatchers can be created to handle asset loading from plugins.
Deploy, Manage, and Scale Your Apps with OpsWorks and Elastic BeanstalkAmazon Web Services
AWS offers a number of services that help you easily deploy and run applications in the cloud. Come to this session to learn how to choose among these options. Through interactive demonstrations, this session will show you how to get an application running using AWS OpsWorks and AWS Elastic Beanstalk application management services. You will also learn how to use AWS CloudFormation templates to document, version control, and share your application configuration. This session will cover topics like application updates, customization, and working with resources such as load balancers and databases.
Building Offline Ready and Installable Web AppMuhammad Samu
This talks introduces Progressive Web Apps as a way of building web applications that works like native application, keeping users engaged even when on flaky or no network connection also giving them the ability to install the app on their home screen
This document discusses best practices for developing WordPress plugins. It recommends that plugins be built as frameworks rather than blueprints, and that they are extensible, use WordPress core APIs, create custom actions and filters, allow overriding templates, and include utility functions. The document warns that plugins need to be kept up to date and that the WordPress repository does not support plugin dependencies. It provides resources for further learning.
DevOps aims to bridge the gap between development and operations by fostering collaboration. Key aspects of DevOps include establishing a collaborative culture through open communication and engagement between teams, automating processes like builds, deployments, testing and system configuration, and implementing monitoring of applications and infrastructure through metrics and logging to ensure stability and enable issues to be quickly identified and addressed. Tools like Puppet, Munin, Graphite, Logstash and Graylog can help operationalize these aspects of DevOps.
Talk given at JavaOne 2009 discussing how to build web applications using OSGi. The source for the demo found at http://github.com/mrdon/jforum-plugins/tree/master
Session Abstract: Enterprise Web applications tend to grow like weeds in monolithic complexity. OSGi, although more often associated with Java™ technology-based clients and application servers, can bring a new level of modularity, uptime, and stability that is needed with today's always-on hosted Web applications. OSGi gets really interesting when the pretty architecture diagrams meet the real world, because it consists of various deployment platforms, development environments, and application architectures. This presentation, for Java 2 Platform, Enterprise Edition (J2EE™ platform)-savvy architects and senior developers, provides a practical guide to the Web on OSGi, from integration approach to bundle development, to real-world code you can use today.
The session discusses
• What benefits OSGi brings to the J2EE platform
• Three integration strategies
• How to use Spring DM and Maven to ease development
• Lessons learned from Atlassian's recent OSGi deployment
• A production-ready example to use immediately
This document discusses writing extensible plugins in WordPress. It begins by introducing the speaker and their experience developing news websites using WordPress VIP. It then distinguishes between usability and extensibility, noting that extensibility allows plugins to be modified and extended by other plugins and themes. The document outlines reasons for writing extensible plugins like saving time and increasing code portability. It covers concepts like hooks, actions, filters and provides examples of how they can be used. It concludes with tips for writing extensible code like prefixing hook names and validating return values.
A gentle Introduction to the concept of Progressive Web Apps, explaining the key concept needed to build a website/app that works even when your user is on a flaky network.
Making Continuous Security a Reality with OWASP’s AppSec Pipeline - Matt Tesa...Matt Tesauro
You’ve probably heard many talks about DevSecOps and continuous security testing but how many provided the tools needed to actually start that testing? This talk does exactly that. It provides an overview of the open source AppSec Pipeline tool which has been used in real world companies to do real security work. Beyond a stand alone tool, the OWASP AppSec Pipeline provides numerous docker containers ready to automate, a specification to customize with the ability to create your own implementation and references to get you started.
The talk will also cover how to add an AppSec Pipeline to your team’s arsenal and provide example templates of how best to run the automated tools provided. Finally, we’ll briefly cover using OWASP Defect Dojo to store and curate the issues found by your AppSec Pipeline. The goal of this talk is to share the field-tested methods of two AppSec professionals with nearly 20 years of experience between them. If you want to start your DevSecOps journey by continuously testing rather then hear about it, this talk is for you.
Drilling Cyber Security Data With Apache DrillCharles Givre
This deck walks you through using Apache Drill and Apache Superset (Incubating) to explore cyber security datasets including PCAP, HTTPD log files, Syslog and more.
Developing Highly Instrumented Applications with Minimal EffortTim Hobson
Presentation from Silicon Valley Code Camp 2013. Related code on github:
* https://github.com/hoserdude/mvcmusicstore-instrumented
* https://github.com/hoserdude/spring-petclinic-instrumented
* https://github.com/hoserdude/nodecellar-instrumented
This document discusses OpenSocial and how it can be used in enterprises. Some key points:
- OpenSocial allows for integration between different enterprise applications through the use of gadgets, which are small web applications that can display and interact with data from multiple sources.
- Gadgets are defined using an XML specification file and core JavaScript APIs. They provide benefits like easy development, security, and the ability to write once and display across different systems.
- Challenges include issues with enterprise readiness like single sign-on, deployment behind firewalls, and immaturity as OpenSocial 1.0 is still in progress.
- The future of OpenSocial includes finalizing the 1.0 specification, a
Uncovering breaking changes behind UI on mobile applicationsKazuaki Matsuo
Capturing HTTP requests during automated tests using a proxy server can help uncover breaking changes in the non-UI layers of mobile applications. The author conducted a case study capturing requests over Appium test scenarios for a long-running app with multiple developers. This uncovered issues like logs being incorrectly reused between views. Placing logs in fragments posed problems if those fragments were used across views. Changes like moving to new programming languages could also inadvertently affect log behavior if not implemented carefully.
The Automation Summit is the leading peer-to-peer educational and networking event for IT automation professionals. As an attendee, you’ll learn why today’s automation innovations are critical for your operation. Plan to be part of this year’s knowledge exchange, April 27 at the Park Plaza, Bangalore.
It has been aimed to provide IT automation industry a unique platform to converge and showcase its capabilities and products. It also allows managers and engineers working in IT Automation projects to exchange, engage and explore new opportunities.
Use Jenkins For Continuous Load Testing And Mobile Test AutomationClever Moe
The document discusses using Jenkins for continuous load testing and mobile test automation. It describes how Jenkins can be used to automate testing across sprints in an agile methodology. Specifically, it outlines how to leverage Jenkins to run functional tests continuously and repurpose those tests for performance and load testing. This helps ensure applications are thoroughly tested before each release.
The document provides tips and best practices for deploying Django applications. It emphasizes making deployments reproducible by standardizing infrastructure, systems, and applications. This includes using configuration management, packaging dependencies locally, separating configuration from code, and managing databases and fixtures programmatically. The document also recommends deploying via a blue-green process of backing up existing systems, updating and testing new systems, then switching production traffic over in a reversible way.
Continuous Integration, Deploy, Test From Beginning To End 2014Clever Moe
Frank Cohen, CTO/Founder at Appvance, teaches developers and testers how to become more closely aligned with easily deployable and configurable tools such as Jenkins CI and performance testing platforms. Learn how to: * Merge Agile SDLC and Performance Testing * Speed-up test operations by configuring Jenkins for automatic build, deploy, and tests * Instantly identify functional and performance issues using Jenkins as a performance dashboard * Use effective choices in Jenkins deployment – in the cloud, hosted, or in your datacenter
This document discusses AWS Step Functions and how it can be used to orchestrate serverless applications and functions. It provides examples of how Step Functions allows developers to sequence functions, select functions based on data, retry functions, implement try/catch/finally blocks, run functions in parallel, and coordinate long-running code. It also discusses how Step Functions is scalable, maintains state, handles errors/timeouts, is easy to build and operate, and provides auditable workflows. The document contains examples of JSON state machine definitions and demonstrates how Step Functions integrates with other AWS services.
Everyone talks about raising the bar on quality of code, but it's always hard to start implementing it when you have no clue where to start. With this talk I'm shooing that there are many levels developers can improve themselves by using the right tools. In this talk I'll go over each tool with examples how to use them against your codebase. A must attend talk for every developer that wants to scale up their quality. Most PHP developers deploy code that does what the customer requested but they don't have a clue about the quality of the product they deliver. Without this knowledge, maintenance can be a hell and very expensive. In this workshop I cover unit testing, code measuring, performance testing, debugging and profiling and give tips and tricks how to continue after this workshop.
Similar to Anatomy of an Addon Ecosystem - EmberConf 2019 (20)
Liberarsi dai framework con i Web Component.pptxMassimo Artizzu
In Italian
Presentazione sulle feature e l'utilizzo dei Web Component nell sviluppo di pagine e applicazioni web. Racconto delle ragioni storiche dell'avvento dei Web Component. Evidenziazione dei vantaggi e delle sfide poste, indicazione delle best practices, con particolare accento sulla possibilità di usare web component per facilitare la migrazione delle proprie applicazioni verso nuovi stack tecnologici.
14 th Edition of International conference on computer visionShulagnaSarkar2
About the event
14th Edition of International conference on computer vision
Computer conferences organized by ScienceFather group. ScienceFather takes the privilege to invite speakers participants students delegates and exhibitors from across the globe to its International Conference on computer conferences to be held in the Various Beautiful cites of the world. computer conferences are a discussion of common Inventions-related issues and additionally trade information share proof thoughts and insight into advanced developments in the science inventions service system. New technology may create many materials and devices with a vast range of applications such as in Science medicine electronics biomaterials energy production and consumer products.
Nomination are Open!! Don't Miss it
Visit: computer.scifat.com
Award Nomination: https://x-i.me/ishnom
Conference Submission: https://x-i.me/anicon
For Enquiry: Computer@scifat.com
UI5con 2024 - Bring Your Own Design SystemPeter Muessig
How do you combine the OpenUI5/SAPUI5 programming model with a design system that makes its controls available as Web Components? Since OpenUI5/SAPUI5 1.120, the framework supports the integration of any Web Components. This makes it possible, for example, to natively embed own Web Components of your design system which are created with Stencil. The integration embeds the Web Components in a way that they can be used naturally in XMLViews, like with standard UI5 controls, and can be bound with data binding. Learn how you can also make use of the Web Components base class in OpenUI5/SAPUI5 to also integrate your Web Components and get inspired by the solution to generate a custom UI5 library providing the Web Components control wrappers for the native ones.
Project Management: The Role of Project Dashboards.pdfKarya Keeper
Project management is a crucial aspect of any organization, ensuring that projects are completed efficiently and effectively. One of the key tools used in project management is the project dashboard, which provides a comprehensive view of project progress and performance. In this article, we will explore the role of project dashboards in project management, highlighting their key features and benefits.
Using Query Store in Azure PostgreSQL to Understand Query PerformanceGrant Fritchey
Microsoft has added an excellent new extension in PostgreSQL on their Azure Platform. This session, presented at Posette 2024, covers what Query Store is and the types of information you can get out of it.
What to do when you have a perfect model for your software but you are constrained by an imperfect business model?
This talk explores the challenges of bringing modelling rigour to the business and strategy levels, and talking to your non-technical counterparts in the process.
Microservice Teams - How the cloud changes the way we workSven Peters
A lot of technical challenges and complexity come with building a cloud-native and distributed architecture. The way we develop backend software has fundamentally changed in the last ten years. Managing a microservices architecture demands a lot of us to ensure observability and operational resiliency. But did you also change the way you run your development teams?
Sven will talk about Atlassian’s journey from a monolith to a multi-tenanted architecture and how it affected the way the engineering teams work. You will learn how we shifted to service ownership, moved to more autonomous teams (and its challenges), and established platform and enablement teams.
Artificia Intellicence and XPath Extension FunctionsOctavian Nadolu
The purpose of this presentation is to provide an overview of how you can use AI from XSLT, XQuery, Schematron, or XML Refactoring operations, the potential benefits of using AI, and some of the challenges we face.
Most important New features of Oracle 23c for DBAs and Developers. You can get more idea from my youtube channel video from https://youtu.be/XvL5WtaC20A
3. Figuring Out an Addon Ecosystem by Reading Code
Line... By... Line
4. Figuring Out an Addon Ecosystem by Reading Code
Line... By... Line
Special Assistance Provided by
5. 3
• A lifelong Muppet fan
• A maintainer for ember-service-worker
• Web developer for almost 20 years
• Remember before open source was a "thing"
Lisa Backer
Senior Software Engineer, DockYard
6. 3
• A lifelong Muppet fan
• A maintainer for ember-service-worker
• Web developer for almost 20 years
• Remember before open source was a "thing"
Lisa Backer
Senior Software Engineer, DockYard
• Yes... I'm feeling old right now
8. • Script in your browser that runs in the
background
4
Intro: Service Worker
9. • Script in your browser that runs in the
background
• Can enable offline cache, intercept network
requests, push notifications, background
synchronizations, and more
4
Intro: Service Worker
10. • Script in your browser that runs in the
background
• Can enable offline cache, intercept network
requests, push notifications, background
synchronizations, and more
• Must be registered from JavaScript by loading
a definition file
4
Intro: Service Worker
14. Intro: Ember-Service-Worker
• An addon that provides a framework
• Compiles and register custom service
workers
• The plugins define the actual service
worker scripts.
5
15. Intro: Ember-Service-Worker
• An addon that provides a framework
• Compiles and register custom service
workers
• The plugins define the actual service
worker scripts.
5
25. Study Goals
9
• What is a "plugin"
• How does registration process work
• How do we locate plugins that the
application has installed
26. Study Goals
9
• What is a "plugin"
• How does registration process work
• How do we locate plugins that the
application has installed
• How do we test it all
27. 10
What Is a Plugin?
A plugin is a bundle that adds functionality
to an application, called the host application,
through some well-defined architecture for
extensibility
28. 10
What Is a Plugin?
A plugin is a bundle that adds functionality
to an application, called the host application,
through some well-defined architecture for
extensibility
29. • Enable developers to extend an application
10
What Is a Plugin?
A plugin is a bundle that adds functionality
to an application, called the host application,
through some well-defined architecture for
extensibility
30. • Enable developers to extend an application
• Reduce the size of the application
10
What Is a Plugin?
A plugin is a bundle that adds functionality
to an application, called the host application,
through some well-defined architecture for
extensibility
31. • Enable developers to extend an application
• Reduce the size of the application
• Provides a well-defined API
10
What Is a Plugin?
A plugin is a bundle that adds functionality
to an application, called the host application,
through some well-defined architecture for
extensibility
64. Broccoli Trees
Are actually now called broccoli nodes
34
Image credit: http://www.oligriffiths.com/broccolijs/
65. Broccoli Trees
Are actually now called broccoli nodes
Represent a set of files that can be transformed by
plugins
34
Image credit: http://www.oligriffiths.com/broccolijs/
66. Broccoli Trees
Are actually now called broccoli nodes
Represent a set of files that can be transformed by
plugins
A build function is called on each plugin
34
Image credit: http://www.oligriffiths.com/broccolijs/
67. Broccoli Trees
Are actually now called broccoli nodes
Represent a set of files that can be transformed by
plugins
A build function is called on each plugin
Broccoli itself is the tool that handles plugging all this
together so that we end up with our build output.
34
Image credit: http://www.oligriffiths.com/broccolijs/
72. postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
let plugins = this._findPluginsFor(this.project);
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
let serviceWorkerTree = serviceWorkerBuilder.build('service-worker');
let serviceWorkerRegistrationTree =
serviceWorkerBuilder.build('service-worker-registration');
return mergeTrees([
appTree,
serviceWorkerTree,
serviceWorkerRegistrationTree
], { overwrite: true });
// ember-service-worker: index.js
74. postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
let plugins = this._findPluginsFor(this.project);
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
let serviceWorkerTree = serviceWorkerBuilder.build('service-worker');
let serviceWorkerRegistrationTree =
serviceWorkerBuilder.build('service-worker-registration');
return mergeTrees([
appTree,
serviceWorkerTree,
serviceWorkerRegistrationTree
], { overwrite: true });
// ember-service-worker: index.js
75. _findPluginsFor(project) {
let addons = project.addons || [];
return addonUtils.filterByKeyword(addons, 'ember-service-worker-plugin');
}
postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
let plugins = this._findPluginsFor(this.project);
// ember-service-worker: index.js
76. _findPluginsFor(project) {
let addons = project.addons || [];
return addonUtils.filterByKeyword(addons, 'ember-service-worker-plugin');
}
postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
let plugins = this._findPluginsFor(this.project);
// ember-service-worker: index.js
77. postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
let plugins = this._findPluginsFor(this.project);
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
// ember-service-worker: index.js
78. let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
// ember-service-worker: index.js
let plugins = this._findPluginsFor(this.project);
79. let serviceWorkerTree = serviceWorkerBuilder.build('service-worker');
let serviceWorkerRegistrationTree =
serviceWorkerBuilder.build('service-worker-registration');
let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
// ember-service-worker: index.js
let plugins = this._findPluginsFor(this.project);
80.
81. • Detect and include specific directories
• treeFor hooks to process generated trees
Ember-Service-
Worker Plugin API
46
82. Ember-Service-
Worker Plugin API
47
• Detect and include specific directories
/service-worker/*
• treeFor hooks to process generated trees
treeForServiceWorker
83. Ember-Service-
Worker Plugin API
47
• Detect and include specific directories
/service-worker/*
• treeFor hooks to process generated trees
treeForServiceWorker
84. Ember-Service-
Worker Plugin API
47
• Detect and include specific directories
/service-worker/*
• treeFor hooks to process generated trees
treeForServiceWorker
85. Ember-Service-
Worker Plugin API
48
• Detect and include specific directories
/service-worker-registration/*
• treeFor hooks to process generated trees
treeForServiceWorkerRegistration
87. // same as above but for windows paths like D:my-emberember-service-workerwhateversw.js; which are updated before this step to D:/
my-ember/ember-service/worker/whatever/sw.js
// the original one doesn't work when the source code and the %TMP% folder, which ember started to use after v3.5, are located on
different logical drives
// which is quite common in Windows.
/^[a-z]:/(?:[^/:*?"<>|rn]+/)*ember-service-worker/(?:[^/:*?"<>|rn]+/)*[^/:*?"<>|rn]*.js$/i
],
delimiters: ['{{', '}}'],
ROOT_URL: this.options.rootURL
};
return new Rollup(tree, {
inputFiles: '**/*.js',
rollup: {
input: entryFile,
output: {
file: destFile || entryFile,
format: 'iife',
},
exports: 'none',
plugins: [
rollupReplace(rollupReplaceConfig)
]
}
});
}
_uglifyTree(tree) {
if (this.options.minifyJS && this.options.minifyJS.enabled) {
let options = this.options.minifyJS.options || {};
options.sourceMapConfig = this.options.sourcemaps;
return uglify(tree, options);
}
return tree;
}
_babelTranspile(tree) {
let emberCliBabel = this.app.project.addons.filter((a) => a.name === 'ember-cli-babel')[0];
return emberCliBabel.transpileTree(tree, { 'ember-cli-babel': { compileModules: false } });
}
}
88. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker',
'service-worker-registration': 'treeForServiceWorkerRegistration'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins(type);
return this._compileTrees(trees, ENTRY_POINT_FILENAMES[type]);
}
// ember-service-worker: lib/service-worker-builder.js
89. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker',
'service-worker-registration': 'treeForServiceWorkerRegistration'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins(type);
return this._compileTrees(trees, ENTRY_POINT_FILENAMES[type]);
}
_treesForPlugins(type) {
return this.plugins.reduce((trees, plugin) => {
let pluginTree = this._treeForPlugin(plugin, type);
if (pluginTree) {
return trees.concat(pluginTree);
}
return trees
}, []);
}
// ember-service-worker: lib/service-worker-builder.js
90. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker',
'service-worker-registration': 'treeForServiceWorkerRegistration'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin, type) {
let pluginPath = path.resolve(plugin.root, type);
let treeForMethod = TREE_FOR_METHODS[type];
let tree;
}
if (fs.existsSync(pluginPath)) {
tree = this.app.treeGenerator(pluginPath);
}
if (plugin[treeForMethod]) {
tree = plugin[treeForMethod](tree, this.appTree);
}
if (tree) {
return new Funnel(tree, {
destDir: plugin.pkg.name + '/' + type
});
}
// ember-service-worker: lib/service-worker-builder.js
91. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin) {
let pluginPath = path.resolve(plugin.root,'service-worker');
let treeForMethod = 'treeForServiceWorker';
let tree;
}
if (fs.existsSync(pluginPath)) {
tree = this.app.treeGenerator(pluginPath);
}
if (plugin[treeForMethod]) {
tree = plugin[treeForMethod](tree, this.appTree);
}
if (tree) {
return new Funnel(tree, {
destDir: plugin.pkg.name + '/service-worker'
});
}
// ember-service-worker: lib/service-worker-builder.js
92. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin) {
let pluginPath = path.resolve(plugin.root,'service-worker');
let treeForMethod = 'treeForServiceWorker';
let tree;
}
// ember-service-worker: lib/service-worker-builder.js
93. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin) {
let pluginPath = path.resolve(plugin.root,'service-worker');
let treeForMethod = 'treeForServiceWorker';
let tree;
}
// ember-service-worker: lib/service-worker-builder.js
if (fs.existsSync(pluginPath)) {
tree = this.app.treeGenerator(pluginPath);
}
94. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin) {
let pluginPath = path.resolve(plugin.root,'service-worker');
let treeForMethod = 'treeForServiceWorker';
let tree;
}
if (fs.existsSync(pluginPath)) {
tree = this.app.treeGenerator(pluginPath);
}
if (plugin[treeForMethod]) {
tree = plugin[treeForMethod](tree, this.appTree);
}
// ember-service-worker: lib/service-worker-builder.js
95. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin) {
let pluginPath = path.resolve(plugin.root,'service-worker');
let treeForMethod = 'treeForServiceWorker';
let tree;
}
if (fs.existsSync(pluginPath)) {
tree = this.app.treeGenerator(pluginPath);
}
if (plugin[treeForMethod]) {
tree = plugin[treeForMethod](tree, this.appTree);
}
if (tree) {
return new Funnel(tree, {
destDir: plugin.pkg.name + '/service-worker'
});
}
// ember-service-worker: lib/service-worker-builder.js
96. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker'
};
module.exports = class ServiceWorkerBuilder {
_treeForPlugin(plugin) {
let pluginPath = path.resolve(plugin.root,'service-worker');
let treeForMethod = 'treeForServiceWorker';
let tree;
}
if (fs.existsSync(pluginPath)) {
tree = this.app.treeGenerator(pluginPath);
}
if (plugin[treeForMethod]) {
tree = plugin[treeForMethod](tree, this.appTree);
}
if (tree) {
return new Funnel(tree, {
destDir: plugin.pkg.name + '/service-worker'
});
}
// ember-service-worker: lib/service-worker-builder.js
97. const TREE_FOR_METHODS = {
'service-worker': 'treeForServiceWorker',
'service-worker-registration': 'treeForServiceWorkerRegistration'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins(type);
return this._compileTrees(trees, ENTRY_POINT_FILENAMES[type]);
}
// ember-service-worker: lib/service-worker-builder.js
98. const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js',
'service-worker-registration': 'sw-registration.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins(type);
return this._compileTrees(trees, ENTRY_POINT_FILENAMES[type]);
}
// ember-service-worker: lib/service-worker-builder.js
99. const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins('service-worker');
return this._compileTrees(trees, 'sw.js');
}
// ember-service-worker: lib/service-worker-builder.js
100. _compileTrees(trees, 'sw.js') {
let entryPoint = new EntryPoint(trees, { entryPoint: 'sw.js' });
let tree = mergeTrees(trees.concat(entryPoint), { overwrite: true });
tree = this._babelTranspile(tree);
tree = this._rollupTree(tree, 'sw.js', this.treeDistPath);
tree = this._uglifyTree(tree);
return tree;
}
const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins('service-worker');
return this._compileTrees(trees, 'sw.js');
}
// ember-service-worker: lib/service-worker-builder.js
101. _compileTrees(trees, 'sw.js') {
let entryPoint = new EntryPoint(trees, { entryPoint: 'sw.js' });
}
const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins('service-worker');
return this._compileTrees(trees, 'sw.js');
}
// ember-service-worker: lib/service-worker-builder.js
110. _compileTrees(trees, 'sw.js') {
let entryPoint = new EntryPoint(trees, { entryPoint: 'sw.js' });
let tree = mergeTrees(trees.concat(entryPoint), { overwrite: true });
}
const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins('service-worker');
return this._compileTrees(trees, 'sw.js');
}
// ember-service-worker: lib/service-worker-builder.js
111. _compileTrees(trees, 'sw.js') {
let entryPoint = new EntryPoint(trees, { entryPoint: 'sw.js' });
let tree = mergeTrees(trees.concat(entryPoint), { overwrite: true });
}
const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins('service-worker');
return this._compileTrees(trees, 'sw.js');
}
// ember-service-worker: lib/service-worker-builder.js
112. _compileTrees(trees, 'sw.js') {
let entryPoint = new EntryPoint(trees, { entryPoint: 'sw.js' });
let tree = mergeTrees(trees.concat(entryPoint), { overwrite: true });
}
const ENTRY_POINT_FILENAMES = {
'service-worker': 'sw.js'
};
module.exports = class ServiceWorkerBuilder {
build(type) {
let trees = this._treesForPlugins('service-worker');
return this._compileTrees(trees, 'sw.js');
}
// ember-service-worker: lib/service-worker-builder.js
tree = this._babelTranspile(tree);
tree = this._rollupTree(tree, 'sw.js', this.treeDistPath);
tree = this._uglifyTree(tree);
return tree;
113. let serviceWorkerTree = serviceWorkerBuilder.build('service-worker');
let serviceWorkerRegistrationTree =
serviceWorkerBuilder.build('service-worker-registration');
let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
// ember-service-worker: index.js
let plugins = this._findPluginsFor(this.project);
114. postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
return mergeTrees([
appTree,
serviceWorkerTree,
serviceWorkerRegistrationTree
], { overwrite: true });
let serviceWorkerTree = serviceWorkerBuilder.build('service-worker');
let serviceWorkerRegistrationTree =
serviceWorkerBuilder.build('service-worker-registration');
let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
// ember-service-worker: index.js
let plugins = this._findPluginsFor(this.project);
115. postprocessTree(type, appTree) {
let options = this._getOptions();
if (type !== 'all' || options.enabled === false) {
return appTree;
}
}
return mergeTrees([
appTree,
serviceWorkerTree,
serviceWorkerRegistrationTree
], { overwrite: true });
let serviceWorkerTree = serviceWorkerBuilder.build('service-worker');
let serviceWorkerRegistrationTree =
serviceWorkerBuilder.build('service-worker-registration');
let serviceWorkerBuilder = new ServiceWorkerBuilder({
app: this,
appTree,
minifyJS: this.app.options.minifyJS,
fingerprint: this.app.options.fingerprint.enabled,
plugins,
rootURL: this._getRootURL(),
sourcemaps: this.app.options.sourcemaps,
registrationDistPath: options.registrationDistPath
});
// Add the project itself as a possible plugin, this way user can add custom
// service-worker code in their app, without needing to build a plugin.
plugins = [this].concat(plugins, this.project);
// ember-service-worker: index.js
let plugins = this._findPluginsFor(this.project);
131. • Unit tests for core functionality
• Host addon should test that the API is called
when expected
81
Testing
132. • Unit tests for core functionality
• Host addon should test that the API is called
when expected
• Plugins should test that they implement
required hooks
81
Testing
133. • Unit tests for core functionality
• Host addon should test that the API is called
when expected
• Plugins should test that they implement
required hooks
• Both should test the build output
81
Testing
141. What We Learned
88
• Plugin architecture is just a fancy way of talking about what
we already know
142. What We Learned
88
• Plugin architecture is just a fancy way of talking about what
we already know
• Ember addons implement a plugin architecture via hooks
and can provide their own API for other addons
143. What We Learned
88
• Plugin architecture is just a fancy way of talking about what
we already know
• Ember addons implement a plugin architecture via hooks
and can provide their own API for other addons
• Broccoli, Babel, and Rollup implement a plugin architecture
144. What We Learned
88
• Plugin architecture is just a fancy way of talking about what
we already know
• Ember addons implement a plugin architecture via hooks
and can provide their own API for other addons
• Broccoli, Babel, and Rollup implement a plugin architecture
• None of these are scary but are usually more complicated
than a hand-wavy demo
145. What We Learned
88
• Plugin architecture is just a fancy way of talking about what
we already know
• Ember addons implement a plugin architecture via hooks
and can provide their own API for other addons
• Broccoli, Babel, and Rollup implement a plugin architecture
• None of these are scary but are usually more complicated
than a hand-wavy demo
• We can take advantage of these concepts to write our own
addon ecosystems