+ All Categories
Home > Technology > My four preferences in Perl Web practices

My four preferences in Perl Web practices

Date post: 18-Nov-2014
Category:
Upload: andysh
View: 1,896 times
Download: 0 times
Share this document with a friend
Description:
 
144
My Four Preferences
Transcript
Page 1: My four preferences in Perl Web practices

My Four Preferences

Page 2: My four preferences in Perl Web practices

My Four Preferences

in my Perl Web practice

Page 3: My four preferences in Perl Web practices
Page 4: My four preferences in Perl Web practices
Page 5: My four preferences in Perl Web practices

Architecture and music

Page 6: My four preferences in Perl Web practices
Page 7: My four preferences in Perl Web practices
Page 8: My four preferences in Perl Web practices
Page 9: My four preferences in Perl Web practices
Page 10: My four preferences in Perl Web practices
Page 11: My four preferences in Perl Web practices

Danube

Page 12: My four preferences in Perl Web practices
Page 13: My four preferences in Perl Web practices
Page 14: My four preferences in Perl Web practices

My Four Preferences

in my Perl Web practice

Page 15: My four preferences in Perl Web practices

1. Parsing URLs with grammar

2. .ini configuration files

3. WWW::Page

4. XSLT

Page 16: My four preferences in Perl Web practices

0. Perl 5.10

Page 17: My four preferences in Perl Web practices

1. Parsing URLs with grammar

Page 18: My four preferences in Perl Web practices

URL is . . .

Page 19: My four preferences in Perl Web practices

URL is . . .

a string

Page 20: My four preferences in Perl Web practices

URL is . . .

a string,

a set of parts

Page 21: My four preferences in Perl Web practices

URL is . . .

a string,

a set of parts,

a container of parameters

Page 22: My four preferences in Perl Web practices

Blog URL scheme

Page 23: My four preferences in Perl Web practices

Blog URL scheme/

Page 24: My four preferences in Perl Web practices

Blog URL scheme//message‐uri/

Page 25: My four preferences in Perl Web practices

Blog URL scheme//message‐uri//tag/tag‐name/

Page 26: My four preferences in Perl Web practices

Blog URL scheme//message‐uri//tag/tag‐name//post/

Page 27: My four preferences in Perl Web practices

Blog URL scheme//message‐uri//tag/tag‐name//post//message‐uri/post/

Page 28: My four preferences in Perl Web practices

Blog URL scheme//message‐uri//tag/tag‐name//post//message‐uri/post//message‐uri/comments/

Page 29: My four preferences in Perl Web practices

How to parse?

Page 30: My four preferences in Perl Web practices

How to parse?RewriteRules in .htaccess

Page 31: My four preferences in Perl Web practices

How to parse?RewriteRules in .htaccess^$ /index.pl?page=home

Page 32: My four preferences in Perl Web practices

How to parse?RewriteRules in .htaccess^$ /index.pl?page=home

^post/?$ /post.pl

Page 33: My four preferences in Perl Web practices

How to parse?RewriteRules in .htaccess^$ /index.pl?page=home

^post/?$ /post.pl

^([^/]+)/? /index.pl?page=$1

Page 34: My four preferences in Perl Web practices

How to parse?RewriteRules in .htaccess^$ /index.pl?page=home

^post/?$ /post.pl

^([^/]+)/? /index.pl?page=$1

etc.

Page 35: My four preferences in Perl Web practices

How to parse?RewriteRules in .htaccess

Bad: involves programmingoutside Perl

Page 36: My four preferences in Perl Web practices

How to parse?Regular expressions

Page 37: My four preferences in Perl Web practices

How to parse?Regular expressionsgiven ($uri) {

   when (/^\/$/) {...}

}

Page 38: My four preferences in Perl Web practices

How to parse?Regular expressionsgiven ($uri) {

   when (/^\/$/) {...}

   when (/^\/post\/?/) {...}

}

Page 39: My four preferences in Perl Web practices

How to parse?Regular expressionsgiven ($uri) {

   when (/^\/$/) {...}

   when (/^\/post\/?/) {...}

   # (regexes as in .htaccess)

}

Page 40: My four preferences in Perl Web practices

How to parse?Regular expressions

Bad: rules are not obvious

Page 41: My four preferences in Perl Web practices

How to parse?split builtin

Page 42: My four preferences in Perl Web practices

How to parse?split builtin

@parts = split m{/}, $uri;

given (scalar @parts) {

   when (1) {...}

   when (2) {...}

}

Page 43: My four preferences in Perl Web practices

How to parse?split builtin

Bad: boring

Page 44: My four preferences in Perl Web practices

How to parse?Grammars

Page 45: My four preferences in Perl Web practices

How to parse?Grammars

Cool!

Page 46: My four preferences in Perl Web practices

How to parse?Grammars

Cool!Easy to maintain

Page 47: My four preferences in Perl Web practices

How to parse?Grammars

Cool!Easy to maintainBut might be slow

Page 48: My four preferences in Perl Web practices

How to parse?Grammars

Cool!Easy to maintainBut might be slow . . .up to 100 times over regexes.

Page 49: My four preferences in Perl Web practices

Gramars

Parse::RecDescent today

Perl 6 grammars tomorrow

Page 50: My four preferences in Perl Web practices

Gramars

Parse::RecDescent today

Perl 6 grammars after Christmas

Page 51: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

Page 52: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

Page 53: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

view         : view‐message

             | view‐tag

Page 54: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

view         : view‐message

             | view‐tag

view‐message : ‘/’ word ‘/’

Page 55: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

view         : view‐message

             | view‐tag

view‐message : ‘/’ word ‘/’

view‐tag     : ‘/tag/’ word ‘/’

Page 56: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

view         : view‐message

             | view‐tag

view‐message : ‘/’ word ‘/’

view‐tag     : ‘/tag/’ word ‘/’

word         : /\w+/

Page 57: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

view         : view‐message

             | view‐tag

view‐message : ‘/’ word ‘/’

view‐tag     : ‘/tag/’ word ‘/’

word         : /\w+/

post‐message : ‘/post/’

Page 58: My four preferences in Perl Web practices

uri          : post EOL

             | view EOL

post         : post‐message

             | post‐comment

view         : view‐message

             | view‐tag

view‐message : ‘/’ word ‘/’

view‐tag     : ‘/tag/’ word ‘/’

word         : /\w+/

post‐message : ‘/post/’

post‐comment : view‐message ‘/post/’

Page 59: My four preferences in Perl Web practices

Actions in grammars

Page 60: My four preferences in Perl Web practices

uri : post EOL

    | view EOL

Page 61: My four preferences in Perl Web practices

uri : post EOL {

         $action = ‘post’;

      }

    | view EOL

Page 62: My four preferences in Perl Web practices

uri : post EOL {

         $action = ‘post’;

      }

    | view EOL {

         $action = ‘view’;

      }

Page 63: My four preferences in Perl Web practices

view‐message : ‘/’ word ‘/’

view‐tag     : ‘/tag/’ word ‘/’

Page 64: My four preferences in Perl Web practices

view‐message : ‘/’ word ‘/’ {

                  $msg_sid = $item{word};

               }

view‐tag     : ‘/tag/’ word ‘/’

Page 65: My four preferences in Perl Web practices

view‐message : ‘/’ word ‘/’ {

                  $msg_sid = $item{word};

               }

view‐tag     : ‘/tag/’ word ‘/’ {

                  $action = ‘view‐tag’;

                  $tag = $item{word};

               }

Page 66: My four preferences in Perl Web practices

http://example.com/twincity/

$action = ‘view’;

$msg_sid = ‘twincity’;

Page 67: My four preferences in Perl Web practices

http://example.com/twincity/

$action = ‘view’;

$msg_sid = ‘twincity’;

http://example.com/tag/workshop/

$action = ‘view‐tag’;

$tag = ‘workshop’;

Page 68: My four preferences in Perl Web practices

my %uri = (

    '/'              => {

                       'type' => 'index',

                     },

    '/alpha/'        => {

                       'type' => 'section',

                       'sectionUri' => 'alpha',

                       'sectionPage' => 1,

                     },

    '/beta‐2/34/14/' => {

                       'type' => 'message',

                       'sectionUri' => 'beta',

                       'sectionPage' => 2,

                       'threadID' => 34,

                       'threadPage' => 1,

                       'messageID' => 14,

                     },

    '/‐/'            => {

                       'type' => '404',

                     });

Page 69: My four preferences in Perl Web practices

for $uri (keys %uri) {    

    $parser‐>parse($uri);

    cmp_deeply(

        $parser‐>{data},

        $uri{$uri},

        $uri

    );

}

Page 70: My four preferences in Perl Web practices

Grammars are

logical

Page 71: My four preferences in Perl Web practices

Grammars are

logical,

easy to extend

Page 72: My four preferences in Perl Web practices

Grammars are

logical,

easy to extend,

cacheable

Page 73: My four preferences in Perl Web practices

Grammars are

logical,

easy to extend,

cacheable,

easy to test

Page 74: My four preferences in Perl Web practices

2. .ini configuration files

Page 75: My four preferences in Perl Web practices

Application =

code + configuration

Page 76: My four preferences in Perl Web practices

Example: blog

number of messages per page

Page 77: My four preferences in Perl Web practices

#!/usr/bin/perl

my $MSG_PER_PAGE = 10;

Page 78: My four preferences in Perl Web practices

#!/usr/bin/perl

my $MSG_PER_PAGE = 10;

Page 79: My four preferences in Perl Web practices

Load configuration from external file

Page 80: My four preferences in Perl Web practices

Load configuration from external non-Perl file

Page 81: My four preferences in Perl Web practices

<config>

   <page_length>10</page_length>

</config>

Page 82: My four preferences in Perl Web practices

Question: XML

or JSON

or YAML

?

Page 83: My four preferences in Perl Web practices

Answer: Windows INI

Page 84: My four preferences in Perl Web practices

[page]

length=10

Page 85: My four preferences in Perl Web practices

[section]

page_length=10

[thread]

page_length=10

[obsene]

replacement=***

[preview]

last_posts=31

last_message_length=200

Page 86: My four preferences in Perl Web practices

global.ini local.ini

Page 87: My four preferences in Perl Web practices

global.ini local.ini

[page]

length=10

[db]

host=db.int

port=3333

[db]

host=localhost

port=3306

Page 88: My four preferences in Perl Web practices

use Config::INI::Access;

config‐>load("conf/config.ini");

Page 89: My four preferences in Perl Web practices

use Config::INI::Access;

config‐>load("conf/config.ini");

config‐>load("conf/local.ini");

Page 90: My four preferences in Perl Web practices

use Config::INI::Access;

config‐>load("conf/config.ini");

config‐>load("conf/local.ini");

say config‐>db‐>host;

Page 91: My four preferences in Perl Web practices

[db]

host=localhost

port=3306

say config‐>db‐>host;

Page 92: My four preferences in Perl Web practices

3. WWW::Page

Page 93: My four preferences in Perl Web practices

WWW::Page

is a kinda MVC

Page 94: My four preferences in Perl Web practices

http://example.com/some/page

Page 95: My four preferences in Perl Web practices

http://example.com/some/page

/www/example.com/some/page/index.xml

Page 100: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 101: My four preferences in Perl Web practices

    use WWW::Page;

    use encoding 'utf‐8';

    my $page = new WWW::Page ({

        'xslt‐root'       => "../data/xsl",

    });

    print $page‐>as_string();

Page 102: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 103: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 104: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

            sub Import::Client::keywordList

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 105: My four preferences in Perl Web practices

    package Import::Client;

    sub keywordList    {        my ($this, $page, $node, $args) = @_;            my $sth = $dbh‐>prepare(            "select keyword, uri from keywords");        $sth‐>execute();        while (my ($keyword, $uri) = $sth‐>fetchrow_array())        {            my $item =                 $page‐>{'xml'}‐>createElement ('item');            $item‐>appendText($keyword);            $item‐>setAttribute('uri', $uri);            $node‐>appendChild($item);        }            return $node;    }

Page 106: My four preferences in Perl Web practices

    package Import::Client;

    sub keywordList    {        my ($this, $page, $node, $args) = @_;            my $sth = $dbh‐>prepare(            "select keyword, uri from keywords");        $sth‐>execute();        while (my ($keyword, $uri) = $sth‐>fetchrow_array())        {            my $item =                 $page‐>{'xml'}‐>createElement ('item');            $item‐>appendText($keyword);            $item‐>setAttribute('uri', $uri);            $node‐>appendChild($item);        }            return $node;    }

Page 107: My four preferences in Perl Web practices

    package Import::Client;

    sub keywordList    {        my ($this, $page, $node, $args) = @_;            my $sth = $dbh‐>prepare(            "select keyword, uri from keywords");        $sth‐>execute();        while (my ($keyword, $uri) = $sth‐>fetchrow_array())        {            my $item =                 $page‐>{'xml'}‐>createElement ('item');            $item‐>appendText($keyword);            $item‐>setAttribute('uri', $uri);            $node‐>appendChild($item);        }            return $node;    }

Page 108: My four preferences in Perl Web practices

    package Import::Client;

    sub keywordList    {        my ($this, $page, $node, $args) = @_;            my $sth = $dbh‐>prepare(            "select keyword, uri from keywords");        $sth‐>execute();        while (my ($keyword, $uri) = $sth‐>fetchrow_array())        {            my $item =                 $page‐>{'xml'}‐>createElement ('item');            $item‐>appendText($keyword);            $item‐>setAttribute('uri', $uri);            $node‐>appendChild($item);        }            return $node;    }

Page 109: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 110: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 111: My four preferences in Perl Web practices

<keyword‐list>

    <item uri="http://perl.org/">Perl</item>

    <item uri="http://dev.perl.org/">Perl 6</item>

    <item uri="http://bbc.co.uk/">Perl on rails</item>

</keyword‐list>

Page 112: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <keyword‐list> . . . </keyword‐list>

        </manifest>

    

        <content>

            <month‐calendar> . . . </month‐calendar>

        </content>

    </page>

Page 114: My four preferences in Perl Web practices

Possible improvements

Page 115: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <page:keyword‐list remote="host2">

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 116: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <page:keyword‐list remote="host2">

        </manifest>

    

        <content>

            <page:month‐calendar cache="memcached"/>

        </content>

    </page>

Page 117: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <page:keyword‐list remote="host2">

        </manifest>

    

        <content>

            <page:month‐calendar cache="xml"/>

        </content>

    </page>

Page 118: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <page:keyword‐list remote="host2">

        </manifest>

    

        <content>

            <page:month‐calendar transform="other.xsl"/>

        </content>

    </page>

Page 119: My four preferences in Perl Web practices

4. XSLT

Page 120: My four preferences in Perl Web practices

Not .WHAT XSLT is

but .WHY I use it

Page 121: My four preferences in Perl Web practices

4a. XSLT: divide and power

Page 122: My four preferences in Perl Web practices

website = logic + layout

Page 123: My four preferences in Perl Web practices

website = Perl-code + HTML

Page 124: My four preferences in Perl Web practices

website = Perl-code + XML+XSLT

Page 125: My four preferences in Perl Web practices

website = Perl-code + XML+XSLT

Perl programmer XSLT coder

Page 126: My four preferences in Perl Web practices

XML+XSLT

Perl programmer XSLT coder

website = Perl-code +

Page 127: My four preferences in Perl Web practices

4b. XSLT: multiple languages

Page 128: My four preferences in Perl Web practices

en.xml 

<strings>

    <months>

       <item>January</item>

       <item>February</item>

          . . .

       <item>December</item>

    </months>

</strings>

Page 129: My four preferences in Perl Web practices

de.xml 

<strings>

    <months>

       <item>Januar</item>

       <item>Februar</item>

          . . .

       <item>Dezember</item>

    </months>

</strings>

Page 130: My four preferences in Perl Web practices

at.xml 

<strings>

    <months>

       <item>Jänner</item>

       <item>Februar</item>

          . . .

       <item>Dezember</item>

    </months>

</strings>

Page 131: My four preferences in Perl Web practices

<xsl:variable name="str">

    <xsl:copy‐of select="

       document(

          concat($lang, ‘.xml’)

       )"/>

</xsl:variable>

Page 132: My four preferences in Perl Web practices

<xsl:variable name="str">

    <xsl:copy‐of select="

       document(

          concat($lang, ‘.xml’)

       )/strings"/>

</xsl:variable>

Page 133: My four preferences in Perl Web practices

<date day="7" month="11" year="2008"/>

Page 134: My four preferences in Perl Web practices

<date day="7" month="11" year="2008"/>

<xsl:value‐of select="@day"/>

Page 135: My four preferences in Perl Web practices

<date day="7" month="11" year="2008"/>

<xsl:value‐of select="@year"/>

Page 136: My four preferences in Perl Web practices

<date day="7" month="11" year="2008"/>

<xsl:value‐of 

    select="$str/months/item[@month]"/>

Page 137: My four preferences in Perl Web practices

4b. XSLT: multiple layouts

Page 138: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 139: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="pda/view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 140: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="iphone/view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 141: My four preferences in Perl Web practices

    <?xml version="1.0" encoding="UTF‐8"?>

    <page

        import="Import::Client"

        transform="rss/view.xsl"

        xmlns:page="urn:www‐page">

    

        <manifest>

            <title>WWW::Page Web‐Site</title>

            <locale>en‐gb</locale>

            <page:keyword‐list/>

        </manifest>

    

        <content>

            <page:month‐calendar/>

        </content>

    </page>

Page 142: My four preferences in Perl Web practices

XML+XSLT

Perl programmer XSLT coder

website = Perl-code +

Page 143: My four preferences in Perl Web practices

XML+XSLT

Perl programmer XSLT coder

website = Perl-code +

XSLT coder

XSLT coder

XSLT coder


Recommended