Top Banner
My Four Preferences
144

My four preferences in Perl Web practices

Nov 18, 2014

Download

Technology

andy.sh

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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