This is the Moose talk I gave at YAPC::NA 2012.
It included a practical example of a Moose objects code, a simple app called Comican. The code is not available online. If you want it, just email me (sawyer ATT cpan DOTT org).
The document provides an overview of modern Perl features including:
- Using say() instead of print for output
- Defined-or operator //
- switch/given statement for conditionals
- Smart matching with ~~ operator
- state keyword for static variables
- New regex features like named capture buffers
- Object oriented programming with Moose
- Defining classes, attributes, types and inheritance with Moose
- Exception handling with TryCatch and autodie
- Best practices for coding style, layout, testing and more
The document discusses how the author evolved the Perlanet software by refactoring it to use Moose and a trait-based architecture. Some key points:
- Perlanet started as a monolithic module but was hard to customize or add new features to.
- The author used Moose to "slash and burn" the code into a more object-oriented and overridable structure using traits instead of large subclasses.
- Traits were used to extract specific behaviors like HTML scrubbing, YAML configuration, etc. into reusable modules.
- This allowed Perlanet to become a "hollow shell" that loads functionality via traits, making it easier to customize and extend.
- The
This document discusses non-relational databases and MongoDB. It provides an overview of MongoDB, how to install and connect to it using Perl, and how to perform common operations like inserting, updating, querying and indexing data. Examples are given for inserting documents, updating them by pushing to arrays, and querying based on field values, regular expressions and JavaScript expressions. Tips are also provided on optimizing queries, paging through results and logging data.
Puppet Camp Paris 2015: Power of Puppet 4 (Beginner) Puppet
Puppet 4 introduces several new features and changes including improved performance, scalability, measurability and flexibility. It features a new Puppet Server based on Clojure and Trapperkeeper, packaging changes, improved environment handling, r10k for managing environments from git, new language features like lambdas and EPP templates, improved data binding and overriding, stronger typing support, and various deprecations around node inheritance, hyphens in names, and other changes. Upgrading requires testing modules against the new version and addressing any compatibility issues.
Ruby was created in 1995 by Yukihiro Matsumoto who wanted a scripting language more powerful than Perl and more object-oriented than Python. It draws inspiration from Perl for its syntax, Smalltalk for its object model, and Lisp for its meta-programming capabilities. Ruby is an interpreted, object-oriented language with dynamic typing where everything is an object and supports features like classes, modules, blocks and iterators. The Ruby on Rails framework further popularized Ruby for web development.
Perl provides many powerful features and modules that allow developers to customize and extend the language. Some popular modules include Moose for object-oriented programming, TryCatch for exception handling inspired by Perl 6, and P5.10 features that backport Perl 6 functionality. While useful, some features like autoboxing and state variables could introduce subtle bugs if misused. Overall, Perl's extensibility makes it a very flexible language that can be adapted to many different use cases.
This is the Moose talk I gave at YAPC::NA 2012.
It included a practical example of a Moose objects code, a simple app called Comican. The code is not available online. If you want it, just email me (sawyer ATT cpan DOTT org).
The document provides an overview of modern Perl features including:
- Using say() instead of print for output
- Defined-or operator //
- switch/given statement for conditionals
- Smart matching with ~~ operator
- state keyword for static variables
- New regex features like named capture buffers
- Object oriented programming with Moose
- Defining classes, attributes, types and inheritance with Moose
- Exception handling with TryCatch and autodie
- Best practices for coding style, layout, testing and more
The document discusses how the author evolved the Perlanet software by refactoring it to use Moose and a trait-based architecture. Some key points:
- Perlanet started as a monolithic module but was hard to customize or add new features to.
- The author used Moose to "slash and burn" the code into a more object-oriented and overridable structure using traits instead of large subclasses.
- Traits were used to extract specific behaviors like HTML scrubbing, YAML configuration, etc. into reusable modules.
- This allowed Perlanet to become a "hollow shell" that loads functionality via traits, making it easier to customize and extend.
- The
This document discusses non-relational databases and MongoDB. It provides an overview of MongoDB, how to install and connect to it using Perl, and how to perform common operations like inserting, updating, querying and indexing data. Examples are given for inserting documents, updating them by pushing to arrays, and querying based on field values, regular expressions and JavaScript expressions. Tips are also provided on optimizing queries, paging through results and logging data.
Puppet Camp Paris 2015: Power of Puppet 4 (Beginner) Puppet
Puppet 4 introduces several new features and changes including improved performance, scalability, measurability and flexibility. It features a new Puppet Server based on Clojure and Trapperkeeper, packaging changes, improved environment handling, r10k for managing environments from git, new language features like lambdas and EPP templates, improved data binding and overriding, stronger typing support, and various deprecations around node inheritance, hyphens in names, and other changes. Upgrading requires testing modules against the new version and addressing any compatibility issues.
Ruby was created in 1995 by Yukihiro Matsumoto who wanted a scripting language more powerful than Perl and more object-oriented than Python. It draws inspiration from Perl for its syntax, Smalltalk for its object model, and Lisp for its meta-programming capabilities. Ruby is an interpreted, object-oriented language with dynamic typing where everything is an object and supports features like classes, modules, blocks and iterators. The Ruby on Rails framework further popularized Ruby for web development.
Perl provides many powerful features and modules that allow developers to customize and extend the language. Some popular modules include Moose for object-oriented programming, TryCatch for exception handling inspired by Perl 6, and P5.10 features that backport Perl 6 functionality. While useful, some features like autoboxing and state variables could introduce subtle bugs if misused. Overall, Perl's extensibility makes it a very flexible language that can be adapted to many different use cases.
The document describes a project to build a website called PerkyProfiler that retrieves user profile information from different services like GitHub, Flickr, and Twitter by taking URLs as input. It will use Perl and several Perl modules. The project will be built using the Catalyst web framework and Moose/MooseX for object-oriented programming. It describes using Moose roles, custom types, declarative class definitions, and functional programming techniques in Perl. The goal is to generate a unified user profile by combining data from different services for a given URL.
Rails workshop for Java people (September 2015)Andre Foeken
Ruby on Rails is a web application framework that follows the model-view-controller (MVC) pattern. It emphasizes convention over configuration and includes tools and frameworks needed to build database-backed web applications according to its conventions. Some of these conventions include generating model, view, and controller code automatically through scaffolding and using RESTful routing. The document provides an overview of how to build a basic Rails application that displays a list of people from a database. It demonstrates concepts like MVC, RESTful routing, ActiveRecord models, database migrations, and using form helpers and templates to create views.
This document provides an introduction to Ruby on Rails. It discusses generating a new Rails application called "address book", generating models and views, preparing the database with migrations, and viewing the application. It also covers Ruby basics like classes, objects, variables, methods, inheritance, modules, and extending classes. The goal is to build a simple address book application to demonstrate fundamental Rails and Ruby concepts.
The document discusses various shell and command line tools to improve productivity for developers, including:
- Bash basics like keyboard navigation, piping, I/O redirection
- Tools like GNU Screen for multitasking and Vim for text editing
- Phing for project automation and deployment
- Benchmarking tools like Apache Bench and Siege
It provides examples of using these tools and resources for further learning shell scripting and command line skills. The overall agenda is around becoming a more efficient "Bash Ninja" through mastering the shell environment.
This script analyzes directory structures and generates arrays or commands to recreate the structure including permissions and ownership. It uses the find command to retrieve directory information, then processes the output to extract attributes like owner, group, and permissions. It can generate shell code defining arrays of the attributes, or commands to recreate the directories and set permissions. The script works in KornShell, ZShell or Bash.
The document discusses Node.js and compares it to other technologies like CakePHP. It provides an overview of Node.js including its event-driven and asynchronous model, key features like the V8 engine and packages/modules, and frameworks like Express. It then demonstrates building a sample messaging application with a JSON API using both CakePHP and Node.js.
This document provides an introduction and overview of DBIx::Class, an ORM (object relational mapper) for Perl. It discusses setting up tables for an authors and books example database, and performing CRUD (create, read, update, delete) operations both manually using SQL and using DBIx::Class. It also covers creating models with Schema::Loader, debugging, overloading result and result set classes, and inflating/deflating columns.
OdessaJs conference 2016, better quality presentation: https://goo.gl/SQjwod
Speaker: Kozhukharenko Nikolay, K&C;
Topic: "Koajs as an alternative to Express"
Content:
- Why Koajs is the better version of Express?
- What is es6 js generators?
- How to use generators to write errorless code in NodeJS
- Asynchronous code in synchronous manner with tj/co library;
- Comparison of KoaJs and Express, similarities and differences
CoffeeScript is a little language that compiles to JavaScript. It repairs confusing aspects of JavaScript while keeping its flexibility. The document discusses CoffeeScript types like numbers, strings, booleans, objects and functions. It also covers CoffeeScript concepts like variables, operators, expressions, statements, control flow, arrays, objects, loops, classes, inheritance and functions. CoffeeScript aims to expose the good parts of JavaScript in a simpler way.
The document discusses various technologies for real-time web applications including PSGI, Plack, AnyEvent, AnyMQ, server-push technologies like Comet, WebSockets, and the Web::Hippie and Web::Hippie::Pipe modules. It provides code examples of using AnyEvent and POE for asynchronous programming, AnyMQ for publishing messages to different message queues, and Web::Hippie::Pipe for abstracting persistent bidirectional connections. The document advocates for relaxing the definition of "hippies" to support more connection types and demonstrates how Hippie::Pipe can provide a unified interface.
The document describes different frameworks used for ISUCON including Sinatra, Kossy, and Express for Ruby, Perl, and Node.js respectively. It then shows an example Python application built with Flask that defines routes for index and post endpoints, renders templates, and is deployed on Apache with mod_wsgi. The Flask app code is available on GitHub from the user memememomo.
WordPress London 16 May 2012 - You don’t know queryl3rady
How to alter the main WordPress query the correct way. No more query_posts() pwease!
by Scott Cariss of Philosophy Design
Philosophy is a thought-led brand and digital consultancy based in London.
If your not using an ORM (object relational mapper) and are still writing SQL by hand, here's what you need to know.
An introduction into DBIx::Class and some of the concepts and goodies you should be aware off.
Dealing with Legacy Perl Code - Peter ScottO'Reilly Media
The document discusses best practices for maintaining Perl code while avoiding burnout. It provides tips on dealing with legacy Perl code, avoiding common myths, testing code, improving code layout and readability, analyzing code for improvements, and handling inherited code. Key recommendations include adopting best practices, writing tests, using tools like perltidy and Devel modules, improving documentation, and refactoring code for clarity and maintainability.
This document discusses Symfony 2.0 and its new features.
[1] Symfony 2.0 will require PHP 5.3 and features a new lightweight request handling system. Key components like the event dispatcher and dependency injection container have been extracted into standalone packages.
[2] The request handler is responsible for dispatching events, loading controllers, and ensuring requests are converted to responses. It is very lightweight, being under 100 lines of code.
[3] Symfony 2.0 aims to be highly flexible and optimized for performance. Benchmark tests show the new request handling system can be up to 10 times faster than Symfony 1.x.
What we Learned Implementing Puppet at BackstopPuppet
"What We Learned Implementing Puppet at Backstop" by Bill Weiss at Puppet Camp Chicago 2013. Learn about upcoming Puppet Camps at http://puppetlabs.com/community/puppet-camp/
PuppetConf 2014 Killer R10K Workflow With NotesPhil Zimmerman
R10K is a tool that automates the deployment of Puppet modules and environments. The presenter's organization previously used a single monolithic repository to manage all of their Puppet code and hiera data, which led to long test cycles, all-or-nothing deployments, and other issues. They transitioned to using R10K along with separate repositories for each module and hiera data. Now, changes can be tested and deployed independently for each module through a Sinatra-based Git hook that handles dynamic Puppetfile manipulation and environment deployment with R10K.
Elegant Solutions For Everyday Python Problems - Nina ZakharenkoNina Zakharenko
The document discusses elegant Python code through the use of several Python concepts and techniques including magic methods, iterators, context managers, partial functions, and decorators. Magic methods allow objects to behave like built-in types through methods like __add__ and __iter__. Context managers provide a way to cleanly handle setup and teardown tasks using the with statement. Partial functions and decorators allow modifying and extending existing functions. Overall the document presents many examples of how to write clean, elegant Python code through leveraging language features.
The document describes a project to build a website called PerkyProfiler that retrieves user profile information from different services like GitHub, Flickr, and Twitter by taking URLs as input. It will use Perl and several Perl modules. The project will be built using the Catalyst web framework and Moose/MooseX for object-oriented programming. It describes using Moose roles, custom types, declarative class definitions, and functional programming techniques in Perl. The goal is to generate a unified user profile by combining data from different services for a given URL.
Rails workshop for Java people (September 2015)Andre Foeken
Ruby on Rails is a web application framework that follows the model-view-controller (MVC) pattern. It emphasizes convention over configuration and includes tools and frameworks needed to build database-backed web applications according to its conventions. Some of these conventions include generating model, view, and controller code automatically through scaffolding and using RESTful routing. The document provides an overview of how to build a basic Rails application that displays a list of people from a database. It demonstrates concepts like MVC, RESTful routing, ActiveRecord models, database migrations, and using form helpers and templates to create views.
This document provides an introduction to Ruby on Rails. It discusses generating a new Rails application called "address book", generating models and views, preparing the database with migrations, and viewing the application. It also covers Ruby basics like classes, objects, variables, methods, inheritance, modules, and extending classes. The goal is to build a simple address book application to demonstrate fundamental Rails and Ruby concepts.
The document discusses various shell and command line tools to improve productivity for developers, including:
- Bash basics like keyboard navigation, piping, I/O redirection
- Tools like GNU Screen for multitasking and Vim for text editing
- Phing for project automation and deployment
- Benchmarking tools like Apache Bench and Siege
It provides examples of using these tools and resources for further learning shell scripting and command line skills. The overall agenda is around becoming a more efficient "Bash Ninja" through mastering the shell environment.
This script analyzes directory structures and generates arrays or commands to recreate the structure including permissions and ownership. It uses the find command to retrieve directory information, then processes the output to extract attributes like owner, group, and permissions. It can generate shell code defining arrays of the attributes, or commands to recreate the directories and set permissions. The script works in KornShell, ZShell or Bash.
The document discusses Node.js and compares it to other technologies like CakePHP. It provides an overview of Node.js including its event-driven and asynchronous model, key features like the V8 engine and packages/modules, and frameworks like Express. It then demonstrates building a sample messaging application with a JSON API using both CakePHP and Node.js.
This document provides an introduction and overview of DBIx::Class, an ORM (object relational mapper) for Perl. It discusses setting up tables for an authors and books example database, and performing CRUD (create, read, update, delete) operations both manually using SQL and using DBIx::Class. It also covers creating models with Schema::Loader, debugging, overloading result and result set classes, and inflating/deflating columns.
OdessaJs conference 2016, better quality presentation: https://goo.gl/SQjwod
Speaker: Kozhukharenko Nikolay, K&C;
Topic: "Koajs as an alternative to Express"
Content:
- Why Koajs is the better version of Express?
- What is es6 js generators?
- How to use generators to write errorless code in NodeJS
- Asynchronous code in synchronous manner with tj/co library;
- Comparison of KoaJs and Express, similarities and differences
CoffeeScript is a little language that compiles to JavaScript. It repairs confusing aspects of JavaScript while keeping its flexibility. The document discusses CoffeeScript types like numbers, strings, booleans, objects and functions. It also covers CoffeeScript concepts like variables, operators, expressions, statements, control flow, arrays, objects, loops, classes, inheritance and functions. CoffeeScript aims to expose the good parts of JavaScript in a simpler way.
The document discusses various technologies for real-time web applications including PSGI, Plack, AnyEvent, AnyMQ, server-push technologies like Comet, WebSockets, and the Web::Hippie and Web::Hippie::Pipe modules. It provides code examples of using AnyEvent and POE for asynchronous programming, AnyMQ for publishing messages to different message queues, and Web::Hippie::Pipe for abstracting persistent bidirectional connections. The document advocates for relaxing the definition of "hippies" to support more connection types and demonstrates how Hippie::Pipe can provide a unified interface.
The document describes different frameworks used for ISUCON including Sinatra, Kossy, and Express for Ruby, Perl, and Node.js respectively. It then shows an example Python application built with Flask that defines routes for index and post endpoints, renders templates, and is deployed on Apache with mod_wsgi. The Flask app code is available on GitHub from the user memememomo.
WordPress London 16 May 2012 - You don’t know queryl3rady
How to alter the main WordPress query the correct way. No more query_posts() pwease!
by Scott Cariss of Philosophy Design
Philosophy is a thought-led brand and digital consultancy based in London.
If your not using an ORM (object relational mapper) and are still writing SQL by hand, here's what you need to know.
An introduction into DBIx::Class and some of the concepts and goodies you should be aware off.
Dealing with Legacy Perl Code - Peter ScottO'Reilly Media
The document discusses best practices for maintaining Perl code while avoiding burnout. It provides tips on dealing with legacy Perl code, avoiding common myths, testing code, improving code layout and readability, analyzing code for improvements, and handling inherited code. Key recommendations include adopting best practices, writing tests, using tools like perltidy and Devel modules, improving documentation, and refactoring code for clarity and maintainability.
This document discusses Symfony 2.0 and its new features.
[1] Symfony 2.0 will require PHP 5.3 and features a new lightweight request handling system. Key components like the event dispatcher and dependency injection container have been extracted into standalone packages.
[2] The request handler is responsible for dispatching events, loading controllers, and ensuring requests are converted to responses. It is very lightweight, being under 100 lines of code.
[3] Symfony 2.0 aims to be highly flexible and optimized for performance. Benchmark tests show the new request handling system can be up to 10 times faster than Symfony 1.x.
What we Learned Implementing Puppet at BackstopPuppet
"What We Learned Implementing Puppet at Backstop" by Bill Weiss at Puppet Camp Chicago 2013. Learn about upcoming Puppet Camps at http://puppetlabs.com/community/puppet-camp/
PuppetConf 2014 Killer R10K Workflow With NotesPhil Zimmerman
R10K is a tool that automates the deployment of Puppet modules and environments. The presenter's organization previously used a single monolithic repository to manage all of their Puppet code and hiera data, which led to long test cycles, all-or-nothing deployments, and other issues. They transitioned to using R10K along with separate repositories for each module and hiera data. Now, changes can be tested and deployed independently for each module through a Sinatra-based Git hook that handles dynamic Puppetfile manipulation and environment deployment with R10K.
Elegant Solutions For Everyday Python Problems - Nina ZakharenkoNina Zakharenko
The document discusses elegant Python code through the use of several Python concepts and techniques including magic methods, iterators, context managers, partial functions, and decorators. Magic methods allow objects to behave like built-in types through methods like __add__ and __iter__. Context managers provide a way to cleanly handle setup and teardown tasks using the with statement. Partial functions and decorators allow modifying and extending existing functions. Overall the document presents many examples of how to write clean, elegant Python code through leveraging language features.
Twig: Friendly Curly Braces Invade Your Templates!Ryan Weaver
Video: http://youtu.be/Jikkiqt-nBo
Twig! Yep, it's that fancy magic that's supposed to make theming in Drupal 8 as much fun as eating beef brisket at Rudy's Country Store in Austin (apologies to my veggie friends!). And in fact, Twig was *born* for this: a language that was created with one job in mind: making writing templates awesome and powerful. Oh, and to make you love using it.
In this talk, we'll learn about Twig from the ground-up: syntax, filters, inheritance and other tricks you can learn now to be ready for Drupal 8. We'll also look at how Twig looks inside Drupal, and how it compares to what you're used to in Drupal 7.
By the end, you'll know everything to start getting your Drupal 8 theme on and be shouting its praises from the hills! Ok, maybe not that last part (but I do love how excited Drupalers get), but you'll definitely have a new friend in your world: Twig.
The document discusses Ruby coding style guidelines including:
- Using 2 spaces for indentation and avoiding tabs
- Formatting code layout such as spacing around operators and line breaks
- Naming conventions like snake_case and avoiding unnecessary comments
- Following patterns for classes, modules and methods
The document emphasizes consistency but acknowledges rules can be broken for readability or consistency within a codebase. Automatic checking and team adoption are suggested for enforcing style guidelines.
- The document discusses performance problems that can arise from ORM use and how to identify them. It recommends examining database logs to see queries being executed. Different types of scans like sequential, index, and bitmap scans are explained. Techniques like select_related, prefetch_related, and using indexes are suggested to reduce queries. The EXPLAIN command is demonstrated to analyze query plans and identify optimizations.
Queues can provide parallel processing, cross language scripting and more! The talk was focused on Gearman but the principles apply to any alternative.
PuppetDB: Sneaking Clojure into Operationsgrim_radical
The document provides an overview of PuppetDB, which is a system for storing and querying data about infrastructure as code and system configurations. Some key points:
- PuppetDB stores immutable data about systems and allows querying of this data to enable higher-level infrastructure operations.
- It uses techniques like command query responsibility separation (CQRS) to separate write and read pipelines for better performance and reliability.
- The data is stored in a relational database for efficient querying, and queries are expressed in an abstract syntax tree (AST)-based language.
- The system is designed for speed, reliability, and ease of deployment in operations. It leverages techniques from Clojure and the JVM.
Drupal 8: A story of growing up and getting off the islandAngela Byron
The document discusses Drupal's transition from Drupal 7 to Drupal 8. It describes how Drupal 8 modernized by adopting PHP best practices like Composer, OOP, and external libraries. This required rewriting large parts of the codebase. The transition was challenging due to technical debt from the past and fears about change. Lessons learned include setting goals, gaining buy-in through transparency, incremental changes, and addressing fears through support. While the transition is not complete, Drupal 8 has rejoined mainstream PHP development practices.
The document discusses using work queues with Gearman and CodeIgniter. It begins with an introduction to work queues, describing them as sequences of stored data or programs awaiting processing. It then discusses the client worker pattern for processing asynchronous jobs, some limitations of this approach, and how Gearman can help address those limitations by facilitating work distribution across languages and servers. The document provides instructions for installing and configuring Gearman to add work queue functionality.
This document discusses debugging and testing Elasticsearch systems. It provides tips for debugging issues like typos in mappings, setting up a local environment for testing, useful commands like analyze and explain, tuning queries, and testing strategies using Java and Ruby. The document emphasizes the importance of testing representative queries to ensure expected results and the ability to tune queries without breaking other queries. It also recommends using Elasticsearch plugins like Head for visualizing clusters and indices.
The potential problem with caching in update_homepage is that deleting the cache key after updating the page could lead to a race condition or stampede.
Since the homepage is being hit 1000/sec, between the time the cache key is deleted and a new value is set, many requests could hit the database simultaneously to refetch the page, overwhelming it.
It would be better to set a new value for the cache key instead of deleting it, to avoid this potential issue.
Solid and Sustainable Development in Scalascalaconfjp
Kazuhiro Sera introduced several of his Scala projects including ScalikeJDBC, Skinny Framework, and AWScala. He discussed some of his philosophies for solid and sustainable development in Scala including using simplified class-based OOP with immutable data structures, avoiding overkill abstraction, writing tests without question, keeping infrastructure lightweight, and ensuring projects have no surprises for newcomers. He welcomed questions during the upcoming AMA session.
The document discusses conducting a PHP code audit. It outlines steps like interviewing developers, performing black box testing, and conducting an open code audit. When auditing code, the speaker searches for injections like SQL, PHP, and HTML injections. Variables used in includes are reviewed, as are comments, variables, functions, and conditions. Register_globals is identified as a risk that can be emulated. The report would provide an executive summary, problems summary, and details on vulnerabilities found. Community involvement and continuous auditing are recommended for security.
A year ago, I was a committed VPS and dedicated-machine deployer. I thought the cloud imposed silly restrictions - how dare you take away my shell account! Whaddya mean I can't save files locally? Since then, I've had some interesting experiences. I've worked on big cloud-deployed systems, and certain large traditionally-deployed systems, and I've seen how a lot of the decisions that you're ... encouraged to make when designing an app to run in the cloud. Most interestingly, I've discovered how those same decisions can make for a much better app regardless of where it'll end up. In this talk, I'll share those architectural patterns with you, and show why they work. Hopefully, I'll convince all of you to build cloud castles -- even if you've got your foundation firmly on the ground.
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018Mike Harris
I never wrote it; everybody else did! How many times have you waded through an ageing, decaying, tangled forrest of code and wished it would just die? How many times have you heard someone say that what really needs to happen is a complete rewrite? I have heard this many times, and, have uttered that fatal sentence myself. But shouldn’t we love our legacy code? Doesn’t it represent our investment and the hard work of ourselves and our predecessors? Throwing it away is dangerous, because, before we do, we’ll need to work out exactly what it does, and we’ll need to tweeze out that critical business logic nestled in a deeply entangled knot of IF statements. It could take us years to do, and we’ll have to maintain two systems whilst we do it, inevitably adding new features to them both. Yes we get to reimplement using the latest, coolest programming language, instead of an old behemoth, but how long will our new cool language be around, and who will maintain that code, when it itself inevitably turns to legacy? We can throw our arms in the air, complaining and grumbling about how we didn’t write the code, how we would never have written it the way it is, how those that wrote it were lesser programmers, possibly lesser humans themselves, but the code still remains, staring us in the face and hanging around for longer that we could possibly imagine. We can sort it out, we can improve it, we can make it testable, and we can learn to love our legacy code.
https://www.youtube.com/watch?v=qRP45l5UugE
Fine-tuning your development environment means more than just getting your editor set up just so -- it means finding and setting up a variety of tools to take care of the mundane housekeeping chores that you have to do -- so you have more time to program, of course! I'll share the benefits of a number of yak shaving expeditions, including using App::GitGot to batch manage _all_ your git repos, App::MiseEnPlace to automate getting things _just_ so in your working environment, and a few others as time allows.
Delivered at OpenWest 2016, 13 July 2016
A Recovering Java Developer Learns to GoMatt Stine
As presented at OSCON 2014.
The Go programming language has emerged as a favorite tool of DevOps and cloud practitioners alike. In many ways, Go is more famous for what it doesn’t include than what it does, and co-author Rob Pike has said that Go represents a “less is more” approach to language design.
The Cloud Foundry engineering teams have steadily increased their use of Go for building components, starting with the Router, and progressing through Loggregator, the CLI, and more recently the Health Manager. As a “recovering-Java-developer-turned-DevOps-junkie” focused on helping our customers and community succeed with Cloud Foundry, it became very clear to me that I needed to add Go to my knowledge portfolio.
This talk will introduce Go and its distinctives to Java developers looking to add Go to their toolkits. We’ll cover Go vs. Java in terms of:
* type systems
* modularity
* programming idioms
* object-oriented constructs
* concurrency
Puppet camp2021 testing modules and controlrepoPuppet
This document discusses testing Puppet code when using modules versus a control repository. It recommends starting with simple syntax and unit tests using PDK or rspec-puppet for modules, and using OnceOver for testing control repositories, as it is specially designed for this purpose. OnceOver allows defining classes, nodes, and a test matrix to run syntax, unit, and acceptance tests across different configurations. Moving from simple to more complex testing approaches like acceptance tests is suggested. PDK and OnceOver both have limitations for testing across operating systems that may require customizing spec tests. Infrastructure for running acceptance tests in VMs or containers is also discussed.
This document appears to be for a PuppetCamp 2021 presentation by Corey Osman of NWOPS, LLC. It includes information about Corey Osman and NWOPS, as well as sections on efficient development, presentation content, demo main points, Git strategies including single branch and environment branch strategies, and workflow improvements. Contact information is provided at the bottom.
The document discusses operational verification and how Puppet is working on a new module to provide more confidence in infrastructure health. It introduces the concept of adding check resources to catalogs to validate configurations and service health directly during Puppet runs. Examples are provided of how this could detect issues earlier than current methods. Next steps outlined include integrating checks into more resource types, fixing reporting, integrating into modules, and gathering feedback. This allows testing and monitoring to converge by embedding checks within configurations.
This document provides tips and tricks for using Puppet with VS Code, including links to settings examples and recommended extensions to install like Gitlens, Remote Development Pack, Puppet Extension, Ruby, YAML Extension, and PowerShell Extension. It also mentions there will be a demo.
- The document discusses various patterns and techniques the author has found useful when working with Puppet modules over 10+ years, including some that may be considered unorthodox or anti-patterns by some.
- Key topics covered include optimization of reusable modules, custom data types, Bolt tasks and plans, external facts, Hiera classification, ensuring resources for presence/absence, application abstraction with Tiny Puppet, and class-based noop management.
- The author argues that some established patterns like roles and profiles can evolve to be more flexible, and that running production nodes in noop mode with controls may be preferable to fully enforcing on all nodes.
Applying Roles and Profiles method to compliance codePuppet
This document discusses adapting the roles and profiles design pattern to writing compliance code in Puppet modules. It begins by noting the challenges of writing compliance code, such as it touching many parts of nodes and leading to sprawling code. It then provides an overview of the roles and profiles pattern, which uses simple "front-end" roles/interfaces and more complex "back-end" profiles/implementations. The rest of the document discusses how to apply this pattern when authoring Puppet modules for compliance - including creating interface and implementation classes, using Hiera for configuration, and tools for reducing boilerplate code. It aims to provide a maintainable structure and simplify adapting to new compliance frameworks or requirements.
This document discusses Kinney Group's Puppet compliance framework for automating STIG compliance and reporting. It notes that customers often implement compliance Puppet code poorly or lack appropriate Puppet knowledge. The framework aims to standardize compliance modules that are data-driven and customizable. It addresses challenges like conflicting modules and keeping compliance current after implementation. The framework generates automated STIG checklists and plans future integration with Puppet Enterprise and Splunk for continued compliance reporting. Kinney Group cites practical experience implementing the framework for various military and government customers.
Enforce compliance policy with model-driven automationPuppet
This document discusses model-driven automation for enforcing compliance. It begins with an overview of compliance benchmarks and the CIS benchmarks. It then discusses implementing benchmarks, common challenges around configuration drift and lack of visibility, and how to define compliance policy as code. The key points are that automation is essential for compliance at scale; a model-driven approach defines how a system should be configured and uses desired-state enforcement to keep systems compliant; and defining compliance policy as code, managing it with source control, and automating it with CI/CD helps achieve continuous compliance.
This document discusses how organizations can move from a reactive approach to compliance to a proactive approach using automation. It notes that over 50% of CIOs cite security and compliance as a barrier to IT modernization. Puppet offers an end-to-end compliance solution that allows organizations to automatically eliminate configuration drift, enforce compliance at scale across operating systems and environments, and define policy as code. The solution helps organizations improve compliance from 50% to over 90% compliant. The document argues that taking a proactive automation approach to compliance can turn it into a competitive advantage by improving speed and innovation.
Automating it management with Puppet + ServiceNowPuppet
As the leading IT Service Management and IT Operations Management platform in the marketplace, ServiceNow is used by many organizations to address everything from self service IT requests to Change, Incident and Problem Management. The strength of the platform is in the workflows and processes that are built around the shared data model, represented in the CMDB. This provides the ‘single source of truth’ for the organization.
Puppet Enterprise is a leading automation platform focused on the IT Configuration Management and Compliance space. Puppet Enterprise has a unique perspective on the state of systems being managed, constantly being updated and kept accurate as part of the regular Puppet operation. Puppet Enterprise is the automation engine ensuring that the environment stays consistent and in compliance.
In this webinar, we will explore how to maximize the value of both solutions, with Puppet Enterprise automating the actions required to drive a change, and ServiceNow governing the process around that change, from definition to approval. We will introduce and demonstrate several published integration points between the two solutions, in the areas of Self-Service Infrastructure, Enriched Change Management and Automated Incident Registration.
This document promotes Puppet as a tool for hardening Windows environments. It states that Puppet can be used to harden Windows with one line of code, detect drift from desired configurations, report on missing or changing requirements, reverse engineer existing configurations, secure IIS, and export configurations to the cloud. Benefits of Puppet mentioned include hardening Windows environments, finding drift for investigation, easily passing audits, compliance reporting, easy exceptions, and exporting configurations. It also directs users to Puppet Forge modules for securing Windows and IIS.
Simplified Patch Management with Puppet - Oct. 2020Puppet
Does your company struggle with patching systems? If so, you’re not alone — most organizations have attempted to solve this issue by cobbling together multiple tools, processes, and different teams, which can make an already complicated issue worse.
Puppet helps keep hosts healthy, secure and compliant by replacing time-consuming and error prone patching processes with Puppet’s automated patching solution.
Join this webinar to learn how to do the following with Puppet:
Eliminate manual patching processes with pre-built patching automation for Windows and Linux systems.
Gain visibility into patching status across your estate regardless of OS with new patching solution from the PE console.
Ensure your systems are compliant and patched in a healthy state
How Puppet Enterprise makes patch management easy across your Windows and Linux operating systems.
Presented by: Margaret Lee, Product Manager, Puppet, and Ajay Sridhar, Sr. Sales Engineer, Puppet.
The document discusses how Puppet can be used to accelerate adoption of Microsoft Azure. It describes lift and shift migration of on-premises workloads to Azure virtual machines. It also covers infrastructure as code using Puppet and Terraform for provisioning, configuration management using Puppet Bolt, and implementing immutable infrastructure patterns on Azure. Integrations with Azure services like Key Vault, Blob Storage and metadata service are presented. Patch management and inventory of Azure resources with Puppet are also summarized.
This document discusses using Puppet Catalog Diff to analyze the impact of changes between Puppet environments or catalogs. It provides the command line usage and options for Puppet Catalog Diff. It also discusses how to integrate Puppet Catalog Diff into CI/CD pipelines for automated impact analysis when merging code changes. Additional resources like GitHub projects and Dev.to posts are provided for learning more about diffing Puppet environments and catalogs.
ServiceNow and Puppet- better together, Kevin ReeuwijkPuppet
ServiceNow and Puppet can be integrated in four key areas: 1) Self-service infrastructure allows non-Puppet experts to control infrastructure through a ServiceNow interface; 2) Enriched change management automatically generates ServiceNow change requests from Puppet changes and populates them with impact details; 3) Automated incident registration forwards details of configuration drift corrections in Puppet to ServiceNow to create incidents; and 4) Up-to-date asset management would periodically upload Puppet inventory data to ServiceNow to keep the CMDB accurate without disruptive discovery runs.
This document discusses how Puppet Relay uses Tekton pipelines to orchestrate containerized workflows. It provides an overview of how Tekton fits into the Relay architecture, with Tekton controllers managing taskrun pods to execute workflow steps defined in YAML. Triggers can initiate workflows based on events, with reusable and composable steps for tasks like provisioning infrastructure or clearing resources. Relay also includes features for parameters, secrets, outputs, and approvals to customize workflows. An ecosystem of open source integrations provides sample workflows and steps for common use cases.
100% Puppet Cloud Deployment of Legacy SoftwarePuppet
This document discusses deploying legacy software into the AWS cloud using Puppet. It proposes modeling AWS resources like security groups, autoscaling groups, and launch configurations as Puppet resources. This would allow Puppet to provision the underlying AWS infrastructure and configure servers launched in autoscaling groups. It acknowledges challenges around server reboots but suggests they can be addressed. In summary, it argues custom Puppet resources can easily model AWS resources and using Puppet to configure autoscaling servers is possible despite some challenges around rebooting servers during deployment.
This document discusses a partnership between Republic Polytechnic's School of Infocomm and Puppet to promote DevOps practices. It introduces several people involved with the partnership and outlines their mission to prepare more IT companies and individuals for jobs in the DevOps field through training courses. The document describes some short courses offered on DevOps topics and using the Puppet and Microsoft Azure platforms. It provides an example of how Republic Polytechnic has automated infrastructure configuration using Puppet to save time and reduce errors. There is a request at the end for readers to register their interest in DevOps by completing a survey.
This document discusses continuous compliance and DevSecOps best practices followed by financial services organizations.
Continuous compliance is defined as an ongoing process of proactive risk management that delivers predictable, transparent, and cost-effective compliance results. It involves continuously monitoring compliance controls, providing real-time alerts for failures and remediation recommendations, and maintaining up-to-date policies. Best practices for continuous compliance discussed include defining CIS controls and benchmarks, achieving transparent compliance dashboards and automated fixes for breaches.
DevSecOps is introduced as bringing security earlier in the application development lifecycle to minimize vulnerabilities. It aims to make everyone accountable for security. Challenges discussed include security teams struggling to keep up with DevOps pace and
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyPuppet
The document discusses using Puppet and Vault together to dynamically manage SSL certificates. Puppet can use the vault_cert resource to request signed certificates from Vault and configure services to use the certificates. On Windows, some additional logic is needed to retrieve certificates' thumbprints and bind services to certificates using those thumbprints. This approach provides automated certificate renewal and distribution across platforms.
GraphRAG for Life Science to increase LLM accuracyTomaz Bratanic
GraphRAG for life science domain, where you retriever information from biomedical knowledge graphs using LLMs to increase the accuracy and performance of generated answers
Skybuffer SAM4U tool for SAP license adoptionTatiana Kojar
Manage and optimize your license adoption and consumption with SAM4U, an SAP free customer software asset management tool.
SAM4U, an SAP complimentary software asset management tool for customers, delivers a detailed and well-structured overview of license inventory and usage with a user-friendly interface. We offer a hosted, cost-effective, and performance-optimized SAM4U setup in the Skybuffer Cloud environment. You retain ownership of the system and data, while we manage the ABAP 7.58 infrastructure, ensuring fixed Total Cost of Ownership (TCO) and exceptional services through the SAP Fiori interface.
Have you ever been confused by the myriad of choices offered by AWS for hosting a website or an API?
Lambda, Elastic Beanstalk, Lightsail, Amplify, S3 (and more!) can each host websites + APIs. But which one should we choose?
Which one is cheapest? Which one is fastest? Which one will scale to meet our needs?
Join me in this session as we dive into each AWS hosting service to determine which one is best for your scenario and explain why!
For the full video of this presentation, please visit: https://www.edge-ai-vision.com/2024/06/how-axelera-ai-uses-digital-compute-in-memory-to-deliver-fast-and-energy-efficient-computer-vision-a-presentation-from-axelera-ai/
Bram Verhoef, Head of Machine Learning at Axelera AI, presents the “How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-efficient Computer Vision” tutorial at the May 2024 Embedded Vision Summit.
As artificial intelligence inference transitions from cloud environments to edge locations, computer vision applications achieve heightened responsiveness, reliability and privacy. This migration, however, introduces the challenge of operating within the stringent confines of resource constraints typical at the edge, including small form factors, low energy budgets and diminished memory and computational capacities. Axelera AI addresses these challenges through an innovative approach of performing digital computations within memory itself. This technique facilitates the realization of high-performance, energy-efficient and cost-effective computer vision capabilities at the thin and thick edge, extending the frontier of what is achievable with current technologies.
In this presentation, Verhoef unveils his company’s pioneering chip technology and demonstrates its capacity to deliver exceptional frames-per-second performance across a range of standard computer vision networks typical of applications in security, surveillance and the industrial sector. This shows that advanced computer vision can be accessible and efficient, even at the very edge of our technological ecosystem.
Generating privacy-protected synthetic data using Secludy and MilvusZilliz
During this demo, the founders of Secludy will demonstrate how their system utilizes Milvus to store and manipulate embeddings for generating privacy-protected synthetic data. Their approach not only maintains the confidentiality of the original data but also enhances the utility and scalability of LLMs under privacy constraints. Attendees, including machine learning engineers, data scientists, and data managers, will witness first-hand how Secludy's integration with Milvus empowers organizations to harness the power of LLMs securely and efficiently.
FREE A4 Cyber Security Awareness Posters-Social Engineering part 3Data Hops
Free A4 downloadable and printable Cyber Security, Social Engineering Safety and security Training Posters . Promote security awareness in the home or workplace. Lock them Out From training providers datahops.com
How information systems are built or acquired puts information, which is what they should be about, in a secondary place. Our language adapted accordingly, and we no longer talk about information systems but applications. Applications evolved in a way to break data into diverse fragments, tightly coupled with applications and expensive to integrate. The result is technical debt, which is re-paid by taking even bigger "loans", resulting in an ever-increasing technical debt. Software engineering and procurement practices work in sync with market forces to maintain this trend. This talk demonstrates how natural this situation is. The question is: can something be done to reverse the trend?
"Choosing proper type of scaling", Olena SyrotaFwdays
Imagine an IoT processing system that is already quite mature and production-ready and for which client coverage is growing and scaling and performance aspects are life and death questions. The system has Redis, MongoDB, and stream processing based on ksqldb. In this talk, firstly, we will analyze scaling approaches and then select the proper ones for our system.
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfChart Kalyan
A Mix Chart displays historical data of numbers in a graphical or tabular form. The Kalyan Rajdhani Mix Chart specifically shows the results of a sequence of numbers over different periods.
Programming Foundation Models with DSPy - Meetup SlidesZilliz
Prompting language models is hard, while programming language models is easy. In this talk, I will discuss the state-of-the-art framework DSPy for programming foundation models with its powerful optimizers and runtime constraint system.
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframePrecisely
Inconsistent user experience and siloed data, high costs, and changing customer expectations – Citizens Bank was experiencing these challenges while it was attempting to deliver a superior digital banking experience for its clients. Its core banking applications run on the mainframe and Citizens was using legacy utilities to get the critical mainframe data to feed customer-facing channels, like call centers, web, and mobile. Ultimately, this led to higher operating costs (MIPS), delayed response times, and longer time to market.
Ever-changing customer expectations demand more modern digital experiences, and the bank needed to find a solution that could provide real-time data to its customer channels with low latency and operating costs. Join this session to learn how Citizens is leveraging Precisely to replicate mainframe data to its customer channels and deliver on their “modern digital bank” experiences.
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...Alex Pruden
Folding is a recent technique for building efficient recursive SNARKs. Several elegant folding protocols have been proposed, such as Nova, Supernova, Hypernova, Protostar, and others. However, all of them rely on an additively homomorphic commitment scheme based on discrete log, and are therefore not post-quantum secure. In this work we present LatticeFold, the first lattice-based folding protocol based on the Module SIS problem. This folding protocol naturally leads to an efficient recursive lattice-based SNARK and an efficient PCD scheme. LatticeFold supports folding low-degree relations, such as R1CS, as well as high-degree relations, such as CCS. The key challenge is to construct a secure folding protocol that works with the Ajtai commitment scheme. The difficulty, is ensuring that extracted witnesses are low norm through many rounds of folding. We present a novel technique using the sumcheck protocol to ensure that extracted witnesses are always low norm no matter how many rounds of folding are used. Our evaluation of the final proof system suggests that it is as performant as Hypernova, while providing post-quantum security.
Paper Link: https://eprint.iacr.org/2024/257
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
The Worst Code I Ever Wrote
1.
2. The worst code I ever wrote (maybe)
Tomas Doran
@bobtfish
tdoran@yelp.com
15/11/2013
3. Key lessons
!
•‘Working’ != ‘done’
– I’m a terrible person
– Working now doesn’t mean you can maintain it
•Functions for reuse
– and my horrible propensity for inline templating
•exec {} abuse
– Lets fit an entire shell script in the command => “…”
•Looping
– Hacks you have probably used.
– Doing it sanely with puppet >= 3.2
tl;dl: This talk is about bad puppet code, and how and why to do it better. The worst code I ever wrote is a
lie ;)
We’re going to concentrate on 2 main topics - functions and looping, with a nod to exec abuse.
4. Managing ssh keys - gitolite
!
• Legacy user management code
–Old non-modular code
–Have to fit in
–Can’t change everything
• Built in sshkey {}
– Not suitable for our requirements
We’re rapidly updating our puppet codebase, but the user management code is one of the most complex
parts, so we wanted to be minimally invasive.. We needed to generate a very custom authorized keys files to
integrate gitolite authentication into our current model.
5. sshkey resource
The built in sshkey {} isn’t perfect for everyone.
Most of the solutions on forge aren’t generic
7. http://forge.puppetlabs.com/nightfly/ssh_keys
!
• Legacy user management code
!
–Old non-modular code
–Have to fit in
• Almost
– But not quite suitable for our requirements
Doing it myself as a concat {} seemed sane, especially given other people’s evidence..
8. Managing ssh keys - gitolite
!
• Legacy user management code
!
–Old non-modular code
–Have to fit in
–Can’t change everything
• Built in sshkey {}
– Not suitable for our requirements
!
• Hack what we want
with define
So, we’re gonna use a bunch of defines and concat {}, easy?
9. Inputs and outputs
!
gitolite::user { ‘tdoran’:
key_source => $key_source;
}
– Add in current user management code
– $keysource = puppet:///files/
users/tdoran/authorized_keys
/etc/authorized_keys.d/git.pub
– Use concat
– Multiple gitolite instances!
- API for creating a key we drop into our current user management path
- Eventual generated file, from a concat {} resource
- Note we can have multiple gitolite instances on one box, that makes everything much harder.
10. So how does it work?
First, get an array of key lines, with names prepended
$864
11. Split the key into an array
$864
We split the file of keys into an array of lines.
We remove comments, whitespace only lines etc
We capture the entire key passed in.
12. Split the key into an array
$864
We interpolate the username in front of that key, space separating them
13. Split the key into an array
$864
End up with an array of strings which are username and key joined by a space
We then abuse a define as a loop by calling it with the array of lines as $title
14. Prepend instance name
!
Add user to every instance
– [“${username} ${restofkey}”]
– [“${instance} “]
– [“${instance} ${username} ${restofkey}”]
– Use this as $name in a define to iterate
– ssh/authorized_keys.d/${instance}.pub
We then have an array of instances, and an array of users/keys.
Our array_prefix function makes the product of both lists.
Complexity due to iterating over two lists $key_lines and $instances
15. Prepend instance name
!
Add user to every instance
– [“${username} ${restofkey}”]
– [“${instance} “]
– [“${instance} ${username} ${restofkey}”]
– Use this as $name in a define to iterate
– ssh/authorized_keys.d/${instance}.pub
We then have an array of instances, and an array of users/keys.
Our array_prefix function makes the product of both lists.
Complexity due to iterating over two lists $key_lines and $instances
16. Prepend instance name
!
Add user to every instance
– [“${username} ${restofkey}”]
– [“${instance} “]
– [“${instance} ${username} ${restofkey}”]
– Use this as $name in a define to iterate
– ssh/authorized_keys.d/${instance}.pub
We then have an array of instances, and an array of users/keys.
Our array_prefix function makes the product of both lists.
Complexity due to iterating over two lists $key_lines and $instances
17. Prepend instance name
!
Add user to every instance
– [“${username} ${restofkey}”]
– [“${instance} “]
– [“${instance} ${username} ${restofkey}”]
– Use this as $name in a define to iterate
– ssh/authorized_keys.d/${instance}.pub
We then have an array of instances, and an array of users/keys.
Our array_prefix function makes the product of both lists.
Complexity due to iterating over two lists $key_lines and $instances
18. Prepend instance name
!
Add user to every instance
– [“${username} ${restofkey}”]
– [“${instance} “]
– [“${instance} ${username} ${restofkey}”]
– Use this as $name in a define to iterate
– ssh/authorized_keys.d/${instance}.pub
This is gross
We then have an array of instances, and an array of users/keys.
Our array_prefix function makes the product of both lists.
Complexity due to iterating over two lists $key_lines and $instances
19. My original next code
Stare in horror!
$864
This was hideous. Whilst looping without define abuse is hard, there’s just no excuse for this.
21. Sins
$864
Shift the user name off the array.
Lol, who knew you could do that?
Use the remaining data joined back up
LOL??
Hideous abuse of variables
22. Sins
Hideous abuse of interpolation
LOL??
LOL??
$864
So, here, I have a double quoted string containing erb, and I’m then using double quote (not erb)
interpolation.. Niiice.
30. I am a bad person
LOL?
$864
Someone stopped me ;)
31. Don’t abuse inline_template()
!
• Please?
– I’m a terrible person
– Working now doesn’t mean you can maintain it
• Functions for reuse
– Full power of ruby
– Composable
– There should be more libraries of functions
Do what I’m saying, not what I do :)
32. More sane
Except each user can have multiple keys, and we want to prevent any key being reused by multiple
users.
33. Issues with functions
!
• What functions do I even have?
– Hard to know what functions you have imported
– stdlib, builtins, ….your $modulepath here…
• What do these even do?
– Often need to read the code to determine
– Lots of functions packaged with modules - don’t do
this!
• Millions of twisty little functions, all alike
• Millions of twisty little functions, all different
– You know what this reminds me of?
37. a few too many..
The problem is, functions in a global namespace aren’t all that modular/composable.
You can call functions from functions - but dependency hell
38. we’re almost half way through….
Shall I stop now? :)
puppet problem is worse than this - what functions you have depends on what modules are in your codebase.
39. Get docs for project’s functions
I wrote a thing to help with this - this will document _your_ functions for you. gist at end of talk.
40. gitolite group file generation
!
• /etc/groups on system
!
• gitolite groups have a different
format:
@admins = tdoran joebloggs!
!
• Use exec {… add mess here … }
This is another great example of what not to do.
41. exec {} abuse
Syntax highlighting won’t save you now puny human!
$864
This. DO NOT DO THIS.
Please?
46. This madness actually worked
LOL?
!
•exec {} abuse
– Lets fit an entire shell script in the
command => “…”
– Don’t do it! :)
– Drop a perl/python/ruby script (or two)
instead, call them from the exec.
$864
– Think about writing a type/provider
– Lots of examples of parsedfile available
55. Hypocrisy avoidance
!
”There should be more libraries
of functions”
- Me, about 5m ago
– https://github.com/bobtfish/puppetsshkey_utilities
– https://github.com/bobtfish/puppet-better_file
– https://gist.github.com/bobtfish/7403811
– Whole module to follow (eventually)
56. That’s all folks
!
• Where was that code?
– https://github.com/bobtfish/puppet-sshkey_utilities
– https://github.com/bobtfish/puppet-better_file
• Did you say you were hiring?
– YES
– Hamburg.
– London.
– San Francisco.
• Questions?