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.
Keep hearing about Plack and PSGI, and not really sure what they're for, and why they're popular? Maybe you're using Plack at work, and you're still copying-and-pasting `builder` lines in to your code without really knowing what's going on? What's the relationship between Plack, PSGI, and CGI? Plack from first principles works up from how CGI works, the evolution that PSGI represents, and how Plack provides a user-friendly layer on top of that.
An introduction to message queues with PHP. We'll focus on RabbitMQ and how to leverage queuing scenarios in your applications. The talk will cover the main concepts of RabbitMQ server and AMQP protocol and show how to use it in PHP. The RabbitMqBundle for Symfony2 will be presented and we'll see how easy you can start to use message queuing in minutes.
Presented at Symfony User Group Belgium: http://www.meetup.com/Symfony-User-Group-Belgium/events/169953362/
Keeping it small - Getting to know the Slim PHP micro frameworkJeremy Kendall
Learn what the big deal is about PHP micro frameworks by taking a tour through an application written in Slim PHP. I'll briefly introduce you to some high level concepts, show how those concepts can be implemented in Slim, and see how powerful and elegant micro framework can be.
How to avoid Benchmark Stuff ("BS") evaluating performance of code. This installment uses time to compare the execution speed of Perl and various shell commands, with and without plumbing.
Slides from the talk at http://www.meetup.com/GTA-PHP-User-Group-Toronto/events/151672182/
Source code for the demo at https://github.com/zymsys/Slim-RedBeanPHP-KnockoutJS
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...Arc & Codementor
Codementor PHP expert mentor Ben Edmunds is the co-host of PHP Town Hall and author of Building Secure PHP Apps.
Ben is also the creator of Ion Auth, a simple, lightweight authentication library for CodeIgniter.
In an interactive format, Ben talked about:
Modern PHP
Latest PHP tools
SQL Injection
Password Hashing and Authentication
Other Common Hacks
https://www.codementor.io/benedmunds
https://www.codementor.io/php-tutorial/building-modern-secure-php-applications-codementor-office-hours-ben-edmunds
Best Practices in Plugin Development (WordCamp Seattle)andrewnacin
My talk -- officially named "Y U NO CODE WELL" -- at WordCamp Seattle 2011 on best practices during plugin development. Find the video, as it provides some good context and conversation.
Keep hearing about Plack and PSGI, and not really sure what they're for, and why they're popular? Maybe you're using Plack at work, and you're still copying-and-pasting `builder` lines in to your code without really knowing what's going on? What's the relationship between Plack, PSGI, and CGI? Plack from first principles works up from how CGI works, the evolution that PSGI represents, and how Plack provides a user-friendly layer on top of that.
An introduction to message queues with PHP. We'll focus on RabbitMQ and how to leverage queuing scenarios in your applications. The talk will cover the main concepts of RabbitMQ server and AMQP protocol and show how to use it in PHP. The RabbitMqBundle for Symfony2 will be presented and we'll see how easy you can start to use message queuing in minutes.
Presented at Symfony User Group Belgium: http://www.meetup.com/Symfony-User-Group-Belgium/events/169953362/
Keeping it small - Getting to know the Slim PHP micro frameworkJeremy Kendall
Learn what the big deal is about PHP micro frameworks by taking a tour through an application written in Slim PHP. I'll briefly introduce you to some high level concepts, show how those concepts can be implemented in Slim, and see how powerful and elegant micro framework can be.
How to avoid Benchmark Stuff ("BS") evaluating performance of code. This installment uses time to compare the execution speed of Perl and various shell commands, with and without plumbing.
Slides from the talk at http://www.meetup.com/GTA-PHP-User-Group-Toronto/events/151672182/
Source code for the demo at https://github.com/zymsys/Slim-RedBeanPHP-KnockoutJS
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...Arc & Codementor
Codementor PHP expert mentor Ben Edmunds is the co-host of PHP Town Hall and author of Building Secure PHP Apps.
Ben is also the creator of Ion Auth, a simple, lightweight authentication library for CodeIgniter.
In an interactive format, Ben talked about:
Modern PHP
Latest PHP tools
SQL Injection
Password Hashing and Authentication
Other Common Hacks
https://www.codementor.io/benedmunds
https://www.codementor.io/php-tutorial/building-modern-secure-php-applications-codementor-office-hours-ben-edmunds
Best Practices in Plugin Development (WordCamp Seattle)andrewnacin
My talk -- officially named "Y U NO CODE WELL" -- at WordCamp Seattle 2011 on best practices during plugin development. Find the video, as it provides some good context and conversation.
Come to this talk prepared to learn about the Doctrine PHP open source project. The Doctrine project has been around for over a decade and has evolved from database abstraction software that dates back to the PEAR days. The packages provided by the Doctrine project have been downloaded almost 500 million times from packagist. In this talk we will take you through how to get started with Doctrine and how to take advantage of some of the more advanced features.
Replacing "exec" with a type and providerDominic Cleal
Far too often we abuse the "exec" type, when what we really need is a simple provider that allows for more complex tests and exception handling. This talk will show how to change that enormous "exec" resource to a new type and provider, then return your manifests to a declarative config description.
SADI in Perl - Protege Plugin Tutorial (fixed Aug 24, 2011)Mark Wilkinson
IMPORTANT CORRECTION TO THIS SLIDESHOW WAS MADE August 24, 2011. How to use the Protege SADI plugin to generate SADI-compliant semantic web services. Created for the 2011 DBCLS BioHackathon. Credits to Mark Wilkinson, Benjamin Vandervalk, Luke McCarthy, Edward Kawas.
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)James Titcumb
You've heard of Zend's new framework, Expressive, and you've heard it's the new hotness. In this talk, I will introduce the concepts of Expressive, how to bootstrap a simple application with the framework using best practices, and finally how to integrate a third party tool like Doctrine ORM.
Lithium: The Framework for People Who Hate FrameworksNate Abele
This is the presentation was given at ConFoo on March 11th by Nate Abele and Joël Perras, and is an introduction to the architectural problems with other frameworks that Lithium was designed to address, and how it addresses them. It also introduces programming paradigms like functional and aspect-oriented programming which address issues that OOP doesn't account for.
Finally, the talk provides a quick overview of the innovative and unparalleled features that Lithium provides, including the data layer, which supports both relational and non-relational databases.
https://speakerdeck.com/willroth/50-laravel-tricks-in-50-minutes - origin
Laravel 5.1 raised the bar for framework documentation, but there's much, much more lurking beneath the surface. In this 50-minute session, we'll explore 50 (yes, 50!) high-leverage implementation tips & tricks that you just won't find in the docs: the IoC Container, Blade, Eloquent, Middleware, Routing, Commands, Queues, Events, Caching — we'll cover them all! Join us as we drink from the fire hose & learn to take advantage of everything that Laravel has to offer to build better software faster!
PHP Frameworks: I want to break free (IPC Berlin 2024)Ralf Eggert
In this presentation, we examine the challenges and limitations of relying too heavily on PHP frameworks in web development. We discuss the history of PHP and its frameworks to understand how this dependence has evolved. The focus will be on providing concrete tips and strategies to reduce reliance on these frameworks, based on real-world examples and practical considerations. The goal is to equip developers with the skills and knowledge to create more flexible and future-proof web applications. We'll explore the importance of maintaining autonomy in a rapidly changing tech landscape and how to make informed decisions in PHP development.
This talk is aimed at encouraging a more independent approach to using PHP frameworks, moving towards a more flexible and future-proof approach to PHP development.
GraphRAG is All You need? LLM & Knowledge GraphGuy Korland
Guy Korland, CEO and Co-founder of FalkorDB, will review two articles on the integration of language models with knowledge graphs.
1. Unifying Large Language Models and Knowledge Graphs: A Roadmap.
https://arxiv.org/abs/2306.08302
2. Microsoft Research's GraphRAG paper and a review paper on various uses of knowledge graphs:
https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/
Epistemic Interaction - tuning interfaces to provide information for AI supportAlan Dix
Paper presented at SYNERGY workshop at AVI 2024, Genoa, Italy. 3rd June 2024
https://alandix.com/academic/papers/synergy2024-epistemic/
As machine learning integrates deeper into human-computer interactions, the concept of epistemic interaction emerges, aiming to refine these interactions to enhance system adaptability. This approach encourages minor, intentional adjustments in user behaviour to enrich the data available for system learning. This paper introduces epistemic interaction within the context of human-system communication, illustrating how deliberate interaction design can improve system understanding and adaptation. Through concrete examples, we demonstrate the potential of epistemic interaction to significantly advance human-computer interaction by leveraging intuitive human communication strategies to inform system design and functionality, offering a novel pathway for enriching user-system engagements.
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
Let's dive deeper into the world of ODC! Ricardo Alves (OutSystems) will join us to tell all about the new Data Fabric. After that, Sezen de Bruijn (OutSystems) will get into the details on how to best design a sturdy architecture within ODC.
JMeter webinar - integration with InfluxDB and GrafanaRTTS
Watch this recorded webinar about real-time monitoring of application performance. See how to integrate Apache JMeter, the open-source leader in performance testing, with InfluxDB, the open-source time-series database, and Grafana, the open-source analytics and visualization application.
In this webinar, we will review the benefits of leveraging InfluxDB and Grafana when executing load tests and demonstrate how these tools are used to visualize performance metrics.
Length: 30 minutes
Session Overview
-------------------------------------------
During this webinar, we will cover the following topics while demonstrating the integrations of JMeter, InfluxDB and Grafana:
- What out-of-the-box solutions are available for real-time monitoring JMeter tests?
- What are the benefits of integrating InfluxDB and Grafana into the load testing stack?
- Which features are provided by Grafana?
- Demonstration of InfluxDB and Grafana using a practice web application
To view the webinar recording, go to:
https://www.rttsweb.com/jmeter-integration-webinar
7. Slightly More Modern Perl
package PerkyProfiler::Service::Role::OwnsUri;
use Moose::Role;
requires 'source';
use URI;
sub owns_uri {
my ($self, $uri) = @_;
$uri = URI->new($uri) if not UNIVERSAL::isa( $uri, 'URI' );
my $source = $self->source;
return ( $uri->host() =~ /.$source./i )
}
1;
8. Modern Perl
use MooseX::Declare; use MooseX::MultiMethod;
use Moose::Role;
use URI;
role PerkyProfiler::Service::Role::OwnsUri requires 'source'
{
multi method owns_uri( URI $uri) {
my $source = $self->source;
return ( $uri->host() =~ /.$source./i )
}
}
1;
9. Hate it because it does a lot
Meta Object Protocol
new object system on top of MOP
Several nice web frameworks
functional programming
13. Project
Vending machine
except, instead of vending items it vends ‘identities’
and instead of taking ‘coins’ it takes ‘URL’s
14. Project
Vending machine
except, instead of vending items it vends ‘identities’
and instead of taking ‘coins’ it takes ‘URL’s
and instead of being a ‘machine’ it is a ‘website’
15. Project
Vending machine
except, instead of vending items it vends ‘identities’
and instead of taking ‘coins’ it takes ‘URL’s
and instead of being a ‘machine’ it is a ‘website’
and instead of having states it is ‘stateless’
16. Project
Vending machine
except, instead of vending items it vends ‘identities’
and instead of taking ‘coins’ it takes ‘URL’s
and instead of being a ‘machine’ it is a ‘website’
and instead of having states it is ‘stateless’
...
18. Goals of project
Given a URL
get info about the contributor on that service
comb other services for information on that user
Services chosen
GitHub
Flickr
Twitter
Use CPAN when possible
21. Helpers
Start an app:
catalyst.pl PerkyProfiler
Add a model:
./script/perkyprofiler_create.pl model Profiler
Add a view:
./script/perkyprofiler_create.pl view Main TTSite
22. Incorporating a new Model
package PerkyProfiler::Model::Profiler;
use strict;
use warnings;
use parent 'Catalyst::Model::Adaptor';
__PACKAGE__->config( class => 'PerkyProfiler::Profiler');
23. Use new model
sub index :Path :Args(0) {
my ( $self, $c ) = @_;
...
my $profiler = $c->model('Profiler');
my $entity;
eval {
$entity = $profiler->generate_entity_from_uri($c->req->param('url'));
$profiler->loop_update_entity($entity);
$c->stash->{'entity'} = $entity;
};
if( my $err = $@) {
$c->stash->{'message'} = "Sorry, but an error occured:" . $err->message(); }}
24. Profiler
loop_update_entity
given an entity loops through and updates it
generate_entity_from_uri
Generates a new entity object from a given URI
25. Example Service: Flickr
package PerkyProfiler::Service::Flickr;
use Flickr::Simple2;
use PerkyProfiler::Entity;
use PerkyProfiler::Entity::Attribute;
use Moose;
with 'PerkyProfiler::Service::Role';
has _core => ( isa => 'Flickr::Simple2', is => 'rw');
has key => ( isa => 'Str', is => 'ro' );
has secret => ( isa => 'Str', is => 'ro' );
has _contributed => ( isa => 'Bool', is => 'rw', default => 0 );
26. Moose
“Post Modern” Object System that provides:
roles
declarative definitions
delegation
typing
method modifiers
…and more!
27. Declarative Style Classes Ex
has _core => (
isa => ‘Flickr::Simple2’,
is => ‘rw’,
handles =>
{ entity_from_username => 'get_user_byUsername'
entity_from_url => 'get_user_byUrl ' }
);
28. Declarative Style Class Defs
Simply say what it has, eg, “has key => ( isa => 'Str', is => 'ro' )”
Declare different things:
is - read/write permissions
default - default value, or sub that generates the value
lazy - lazy generation
required
delegated tasks
isa - type
29. Types?
Yes, perl is loosely typed, but Moose checks for you.
It can do:
predefined types like strings, integers, numbers
ref too, eg, ArrayRef[CodeRef] is an array of subs
classes
custom types
30. Custom Types
New types
type ‘two_chars’ => where { defined $_ && length
$_ == 2};
Subtypes
subtype ‘EvenInt’ => as ‘Int’ => where { $_ % 2 + 1}
=> message {“Please provide an even number”}
31. Back to the example
package PerkyProfiler::Service::Flickr;
use Flickr::Simple2;
use PerkyProfiler::Entity;
use PerkyProfiler::Entity::Attribute;
use Moose;
with 'PerkyProfiler::Service::Role';
has _core => ( isa => 'Flickr::Simple2', is => 'rw');
has key => ( isa => 'Str', is => 'ro' );
has secret => ( isa => 'Str', is => 'ro' );
has _contributed => ( isa => 'Bool', is => 'rw', default => 0 );
32. Moose Roles
Roles can be used simply by saying: “with
'PerkyProfiler::Service::Role';”
Roles allow you to define a list of methods that must exist
(an interface)
Roles also allow you to define a list of methods that
cannot exist
Finally roles can provide you with additional functionality
(mixin)
33. New Example: Service::Role
package PerkyProfiler::Service::Role;
use Moose::Role;
with 'PerkyProfiler::Service::Role::UsernameGenerator';
with 'PerkyProfiler::Service::Role::OwnsUri';
requires '_get_user_from_uri';
requires '_get_user_info';
requires 'map_to_entity';
requires 'contributor';
34. Providing a Role
Just `use Moose::Role;`
Roles can consume other Roles
Roles can require subs via requires, eg, requires
‘map_to_entity’
Roles can exclude other roles via excludes, eg, exclude
‘ConflictingRole’
35. Example: Working with Roles
Objects can be introspected for roles
foreach my $service ( $self->_services->gen_iterator->() )
{
if($service->meta->does_role($owns_uri_role))
{
if($service->owns_uri($uri))
{
return $service->entity_from_uri($uri);
}}}
36. What else can Moose do?
Meta everything (Meta attributes, classes, roles)
Anonymous classes
autoboxing with MooseX::Autobox
multimethod dispatching with MooseX::MultiMethod
37. What else does Perl have?
DBIx::Class
Object Relational Mapper
classes are based off tables, but can be reassigned
columns can be custom inflated