Exploiting the newer perl to improve your plugins

30
. 1H com . 1H com . 1H com . 1H com Exploiting the Newer Perl to Improve Your Plugins - . Marian Marinov mm@1h co - . Marian Marinov mm@1h co - & Co founder CEO of 1H Lt - & Co founder CEO of 1H Lt

Transcript of Exploiting the newer perl to improve your plugins

Page 1: Exploiting the newer perl to improve your plugins

.1H com.1H com.1H com.1H com

Exploit ing the Newer Perl to Improve Your Plugins

- .Marian Marinov mm@1h com - .Marian Marinov mm@1h com- & .Co founder CEO of 1H Ltd- & .Co founder CEO of 1H Ltd

Page 2: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 22

AGENDAAGENDA

- Building feature rich plug ins the easy way - Building feature rich plug ins the easy way Queuing for the masses Queuing for the masses

Cache me please Cache me please

Page 3: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 33

$ $$ $$$ $$ $ $ $$ $$$ $$ $

, If you rate my survey I' l l hook you up , If you rate my survey I' l l hook you up .with $20 cPCache $$$ .with $20 cPCache $$$

:Go to this address to take the survey :Go to this address to take the survey :// . . /http go cpanel net b27:// . . /http go cpanel net b27

and come up to the podium once you've and come up to the podium once you've .completed it .completed it

Page 4: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 44

- Plug ins creation- Plug ins creation

jQueryjQuery::JavaScript Packer::JavaScript Packer

::JSON XS::JSON XS

Page 5: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 55

- cPanel plug ins with - cPanel plug ins withjQueryjQuery

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict;use strict;use JQuery::Demo;use JQuery::Demo;use JQuery::CSS;use JQuery::CSS;use CGI;use CGI;

package main;package main;my $tester = new JQuery::Demo;my $tester = new JQuery::Demo;$tester->run;$tester->run;

package JQuery::Demo;package JQuery::Demo;use JQuery::Tabs;use JQuery::Tabs;

Page 6: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 66

- cPanel plug ins with - cPanel plug ins withjQueryjQuery

sub start {sub start { my $my = shift;my $my = shift; my $q = new CGI;my $q = new CGI; $my->{info}{TITLE} = "Tabs";$my->{info}{TITLE} = "Tabs"; my $jquery = $my->{jquery};my $jquery = $my->{jquery}; my @tabs = ("tab 1","tab 2","tab 3","tab 4");my @tabs = ("tab 1","tab 2","tab 3","tab 4"); my @texts = ("line 1","line 2","line 3","line4");my @texts = ("line 1","line 2","line 3","line4");

Page 7: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 77

- cPanel plug ins with - cPanel plug ins withjQueryjQuery

my $tab = JQuery::Tabs->new(id => 'myTab',my $tab = JQuery::Tabs->new(id => 'myTab', addToJQuery => $jquery,addToJQuery => $jquery, tabs => \@tabs,tabs => \@tabs, remote => 'true', remote => 'true', remoteProgram => 'jquery_tabs_results.pl',remoteProgram => 'jquery_tabs_results.pl', rm => 'myMode',rm => 'myMode', spinner => 1 );spinner => 1 ); my $html = $tab->HTML;my $html = $tab->HTML; $my->{info}{BODY} = qq[<h1>START OF TAB EXAMPLE</$my->{info}{BODY} = qq[<h1>START OF TAB EXAMPLE</h1>$html</div>END OF EXAMPLE</h1>];h1>$html</div>END OF EXAMPLE</h1>];

}}

Page 8: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 88

- cPanel plug ins with - cPanel plug ins withjQueryjQuery

Page 9: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 99

: :JavaScript Packer: :JavaScript Packer

$ wc -l uncompressed.js $ wc -l uncompressed.js 1078 uncompressed.js1078 uncompressed.js$ ls -l uncompressed.js $ ls -l uncompressed.js -rw-r--r-- 1 hackman hackman 31609 Oct 8 00:43 -rw-r--r-- 1 hackman hackman 31609 Oct 8 00:43 uncompressed.jsuncompressed.js

$ ./minify-js.pl $ ./minify-js.pl $ ls -l compressed.js $ ls -l compressed.js -rw-rw-r-- 1 hackman hackman 15847 Oct 8 00:43 -rw-rw-r-- 1 hackman hackman 15847 Oct 8 00:43 compressed.jscompressed.js

$ wc -l compressed.js $ wc -l compressed.js 0 compressed.js0 compressed.js

Page 10: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1010

: :JavaScript Packer: :JavaScript Packer

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict;use strict;use JavaScript::Packer;use JavaScript::Packer;my $packer = JavaScript::Packer->init();my $packer = JavaScript::Packer->init();open( UNCOMPRESSED, 'uncompressed.js' );open( UNCOMPRESSED, 'uncompressed.js' );open( COMPRESSED, '>compressed.js' );open( COMPRESSED, '>compressed.js' );my $js = join( '', <UNCOMPRESSED> );my $js = join( '', <UNCOMPRESSED> );$packer->minify( \$js, { compress => 'best' });$packer->minify( \$js, { compress => 'best' });print COMPRESSED $js;print COMPRESSED $js;close(UNCOMPRESSED);close(UNCOMPRESSED);close(COMPRESSED);close(COMPRESSED);

Page 11: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1111

Why JSON and why Why JSON and why: :JSON XS: :JSON XS

We need to transfer data We need to transfer data XML is EVIL XML is EVIL The best format with the least overhead The best format with the least overhead The XS version is obviously faster The XS version is obviously faster

Page 12: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1212

Example with JSON Example with JSON

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict;use strict;use JSON::XS;use JSON::XS;my %res = ( 'a' => 'line1', 'b' => 'line2' );my %res = ( 'a' => 'line1', 'b' => 'line2' );my $json = JSON::XS->new->ascii->pretty-my $json = JSON::XS->new->ascii->pretty->allow_nonref;>allow_nonref;

print $json->encode(\%res);print $json->encode(\%res);

$ ./json-ex.pl $ ./json-ex.pl {"a":"line1","b":"line2"}{"a":"line1","b":"line2"}

Page 13: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1313

Why queuing is helpful Why queuing is helpful

PerformancePerformance No need to handle your own forks No need to handle your own forks

Queing slow commands Queing slow commands

" " The data is HOT " " The data is HOT

ConcurrencyConcurrency" " HOT connections" " HOT connections

No need to think about the position in a fi le No need to think about the position in a fi le

SecuritySecurity You have to encode and check the data sent You have to encode and check the data sent to the functions to the functions

Page 14: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1414

Introduce Queuing Introduce Queuing

GearmanGearman - :// .http gearman org- :// .http gearman orgRabbitMQRabbitMQ - :// . .http www rabbitmq com- :// . .http www rabbitmq com

Page 15: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1515

Gearman Architecture Gearman Architecture

- Server handles the queues - Server handles the queues - Client adds requests to the queue - Client adds requests to the queue - Worker handles requests from the queue - Worker handles requests from the queue

gearmand

Web App Daemon

WorkerClient

Page 16: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1616

Gearman client Gearman client

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict;use strict;use Gearman::Client;use Gearman::Client;my $client = Gearman::Client->new;my $client = Gearman::Client->new;$client->job_servers('127.0.0.1:4730');$client->job_servers('127.0.0.1:4730');$str = "my client has called";$str = "my client has called";eval {eval { local $SIG{ALRM} = sub { die 'timeout'; };local $SIG{ALRM} = sub { die 'timeout'; }; alarm(3);alarm(3); $client->dispatch_background('log_me', $str);$client->dispatch_background('log_me', $str); alarm(0); alarm(0); };};

Page 17: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1717

Gearman worker Gearman worker

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict;use strict;use Gearman::Worker;use Gearman::Worker;use POSIX qw(strftime);use POSIX qw(strftime);$logfile = '/home/hackman/test.log';$logfile = '/home/hackman/test.log';open LOG, '>>', $logfile;open LOG, '>>', $logfile;select((select(LOG), $| = 1)[0]);select((select(LOG), $| = 1)[0]);my $logger = sub { ... };my $logger = sub { ... };my $w = Gearman::Worker->new;my $w = Gearman::Worker->new;$w->job_servers('127.0.0.1:4730');$w->job_servers('127.0.0.1:4730');$w->register_function( log_me => $logger );$w->register_function( log_me => $logger );$w->work while 1;$w->work while 1;

Page 18: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1818

Gearman setup Gearman setup

# make && make install# make && make install# gearmand -d -u gearman -p 4730# gearmand -d -u gearman -p 4730

# gearman_status.pl # gearman_status.pl function name queue exec workerfunction name queue exec worker log_me 1 1 1log_me 1 1 1 check_oneh 0 0 1check_oneh 0 0 1 gather_child 154 72 72gather_child 154 72 72

Page 19: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 1919

RabbitMQ architecture RabbitMQ architecture

RabbitMQ

Queue

Exchange

Server

Server

QueueServer

Page 20: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2020

RabbitMQ architecture RabbitMQ architecture

RabbitMQ

AMQP XMPP STOMP HTTP

AMQP XMPP STOMP HTTP

Page 21: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2121

RabbitMQ setup RabbitMQ setup

# yum install erlang# yum install erlang# - -rpm Uvh rabbitmq# - -rpm Uvh rabbitmq

- . . - . .server 2 6 1 1 noarch rpm- . . - . .server 2 6 1 1 noarch rpm

# - -rabbitmq server detached# - -rabbitmq server detached# rabbitmqctl status# rabbitmqctl status

...Status of node rabbit@gamelon ...Status of node rabbit@gamelon[{ , }, { ,pid 6829 running_applications[{ , }, { ,pid 6829 running_applications [{ ," "," . . "},rabbit RabbitMQ 2 6 1[{ ," "," . . "},rabbit RabbitMQ 2 6 1 ... .. . . .

Page 22: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2222

RabbitMQ client RabbitMQ client

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict;use strict;use Net::RabbitMQ;use Net::RabbitMQ;my $mq = Net::RabbitMQ->new();my $mq = Net::RabbitMQ->new();$mq->connect("localhost", { user => "guest", password $mq->connect("localhost", { user => "guest", password => "guest" });=> "guest" });

$mq->channel_open(1);$mq->channel_open(1);$mq->publish(1, "testqueue", "Hi there!");$mq->publish(1, "testqueue", "Hi there!");$mq->disconnect();$mq->disconnect();

Page 23: Exploiting the newer perl to improve your plugins

2323

RabbitMQ server RabbitMQ server

#!/usr/bin/perl -w#!/usr/bin/perl -wuse strict; use Data::Dumperuse strict; use Data::Dumper;; use Net::RabbitMQ; use Net::RabbitMQ;my $mq = Net::RabbitMQ->new();my $mq = Net::RabbitMQ->new();$mq->connect("localhost",$mq->connect("localhost",{user=>"guest",password=>"guest"});{user=>"guest",password=>"guest"});

$mq->channel_open(1);$mq->channel_open(1);$mq->exchange_declare(1, 'my_x',{auto_delete => 0});$mq->exchange_declare(1, 'my_x',{auto_delete => 0});$mq->queue_declare(1, 'testqueue',{auto_delete => $mq->queue_declare(1, 'testqueue',{auto_delete => 0});0});

$mq->queue_bind(1, 'testqueue', 'my_x', 'foo');$mq->queue_bind(1, 'testqueue', 'my_x', 'foo');while(1){while(1){ my $hashref = $mq->get(1, 'testqueue');my $hashref = $mq->get(1, 'testqueue'); print Dumper($hashref) if (defined($hashref));print Dumper($hashref) if (defined($hashref));}}

Page 24: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2424

CachingCaching

Why cache ? Why cache ?

::Cache memcached::Cache memcached:: - Cache Redis written especially for this:: - Cache Redis written especially for this

:)talk :)talk

Page 25: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2525

: :Cache Memcached: :Cache Memcached

memcached

CGI CGI CGI CGI CGI

Page 26: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2626

: :Cache Redis: :Cache Redis

Page 27: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2727

ConclusionsConclusions

Page 28: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2828

QuestionsQuestions

? ? ? ? ? ???

? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

Page 29: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 2929

Thank you Thank you

Please visit us at Booth 23 Please visit us at Booth 23

- .Marian Marinov mm@1h com - .Marian Marinov mm@1h com- & .Co founder CIO at 1H Ltd- & .Co founder CIO at 1H Ltd

.1H com.1H com.1H com.1H com

Page 30: Exploiting the newer perl to improve your plugins

. .WWW 1H COM. .WWW 1H COM 3030

$ $$ $$$ $$ $ $ $$ $$$ $$ $

, If you rate my survey I' l l hook you up , If you rate my survey I' l l hook you up .with $20 cPCache $$$ .with $20 cPCache $$$

:Go to this address to take the survey :Go to this address to take the survey :// . . /http go cpanel net b27:// . . /http go cpanel net b27

and come up to the podium once you've and come up to the podium once you've .completed it .completed it