My four preferences in Perl Web practices

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    My four preferences in Perl Web practices - Presentation Transcript

    1. My Four Preferences
    2. My Four Preferences in my Perl Web practice
    3. Architecture and music
    4. Danube
    5. My Four Preferences in my Perl Web practice
    6. 1. Parsing URLs with grammar 2. .ini configuration files 3. WWW::Page 4. XSLT
    7. 0. Perl 5.10
    8. 1. Parsing URLs with grammar
    9. URL is . . .
    10. URL is . . . a string
    11. URL is . . . a string, a set of parts
    12. URL is . . . a string, a set of parts, a container of parameters
    13. Blog URL scheme
    14. Blog URL scheme /
    15. Blog URL scheme / /message‐uri/
    16. Blog URL scheme / /message‐uri/ /tag/tag‐name/
    17. Blog URL scheme / /message‐uri/ /tag/tag‐name/ /post/
    18. Blog URL scheme / /message‐uri/ /tag/tag‐name/ /post/ /message‐uri/post/
    19. Blog URL scheme / /message‐uri/ /tag/tag‐name/ /post/ /message‐uri/post/ /message‐uri/comments/
    20. How to parse?
    21. How to parse? RewriteRules in .htaccess
    22. How to parse? RewriteRules in .htaccess ^$ /index.pl?page=home
    23. How to parse? RewriteRules in .htaccess ^$ /index.pl?page=home ^post/?$ /post.pl
    24. How to parse? RewriteRules in .htaccess ^$ /index.pl?page=home ^post/?$ /post.pl ^([^/]+)/? /index.pl?page=$1
    25. How to parse? RewriteRules in .htaccess ^$ /index.pl?page=home ^post/?$ /post.pl ^([^/]+)/? /index.pl?page=$1 etc.
    26. How to parse? RewriteRules in .htaccess Bad: involves programming outside Perl
    27. How to parse? Regular expressions
    28. How to parse? Regular expressions given ($uri) {    when (/^\\/$/) {...} }
    29. How to parse? Regular expressions given ($uri) {    when (/^\\/$/) {...}    when (/^\\/post\\/?/) {...} }
    30. How to parse? Regular expressions given ($uri) {    when (/^\\/$/) {...}    when (/^\\/post\\/?/) {...}    # (regexes as in .htaccess) }
    31. How to parse? Regular expressions Bad: rules are not obvious
    32. How to parse? split builtin
    33. How to parse? split builtin @parts = split m{/}, $uri; given (scalar @parts) {    when (1) {...}    when (2) {...} }
    34. How to parse? split builtin Bad: boring
    35. How to parse? Grammars
    36. How to parse? Grammars Cool!
    37. How to parse? Grammars Cool! Easy to maintain
    38. How to parse? Grammars Cool! Easy to maintain But might be slow
    39. How to parse? Grammars Cool! Easy to maintain But might be slow . . . up to 100 times over regexes.
    40. Gramars Parse::RecDescent today Perl 6 grammars tomorrow
    41. Gramars Parse::RecDescent today Perl 6 grammars after Christmas
    42. uri          : post EOL              | view EOL
    43. uri          : post EOL              | view EOL post         : post‐message              | post‐comment
    44. uri          : post EOL              | view EOL post         : post‐message              | post‐comment view         : view‐message              | view‐tag
    45. uri          : post EOL              | view EOL post         : post‐message              | post‐comment view         : view‐message              | view‐tag view‐message : ‘/’ word ‘/’
    46. uri          : post EOL              | view EOL post         : post‐message              | post‐comment view         : view‐message              | view‐tag view‐message : ‘/’ word ‘/’ view‐tag     : ‘/tag/’ word ‘/’
    47. uri          : post EOL              | view EOL post         : post‐message              | post‐comment view         : view‐message              | view‐tag view‐message : ‘/’ word ‘/’ view‐tag     : ‘/tag/’ word ‘/’ word         : /\\w+/
    48. 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/’
    49. 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/’
    50. Actions in grammars
    51. uri : post EOL     | view EOL
    52. uri : post EOL {          $action = ‘post’;       }     | view EOL
    53. uri : post EOL {          $action = ‘post’;       }     | view EOL {          $action = ‘view’;       }
    54. view‐message : ‘/’ word ‘/’ view‐tag     : ‘/tag/’ word ‘/’
    55. view‐message : ‘/’ word ‘/’ {                   $msg_sid = $item{word};                } view‐tag     : ‘/tag/’ word ‘/’
    56. view‐message : ‘/’ word ‘/’ {                   $msg_sid = $item{word};                } view‐tag     : ‘/tag/’ word ‘/’ {                   $action = ‘view‐tag’;                   $tag = $item{word};                }
    57. http://example.com/twincity/ $action = ‘view’; $msg_sid = ‘twincity’;
    58. http://example.com/twincity/ $action = ‘view’; $msg_sid = ‘twincity’; http://example.com/tag/workshop/ $action = ‘view‐tag’; $tag = ‘workshop’;
    59. 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',                      });
    60. for $uri (keys %uri) {         $parser‐>parse($uri);     cmp_deeply(         $parser‐>{data},         $uri{$uri},         $uri     ); }
    61. Grammars are logical
    62. Grammars are logical, easy to extend
    63. Grammars are logical, easy to extend, cacheable
    64. Grammars are logical, easy to extend, cacheable, easy to test
    65. 2. .ini configuration files
    66. Application = code + configuration
    67. Example: blog number of messages per page
    68. #!/usr/bin/perl my $MSG_PER_PAGE = 10;
    69. #!/usr/bin/perl my $MSG_PER_PAGE = 10;
    70. Load configuration from external file
    71. Load configuration from external non-Perl file
    72. <config>    <page_length>10</page_length> </config>
    73. Question: XML or JSON or YAML ?
    74. Answer: Windows INI
    75. [page] length=10
    76. [section] page_length=10 [thread] page_length=10 [obsene] replacement=*** [preview] last_posts=31 last_message_length=200
    77. global.ini local.ini
    78. global.ini local.ini [page] length=10 [db] [db] host=db.int host=localhost port=3333 port=3306
    79. use Config::INI::Access; config‐>load(\"conf/config.ini\");
    80. use Config::INI::Access; config‐>load(\"conf/config.ini\"); config‐>load(\"conf/local.ini\");
    81. use Config::INI::Access; config‐>load(\"conf/config.ini\"); config‐>load(\"conf/local.ini\"); say config‐>db‐>host;
    82. [db] host=localhost port=3306 say config‐>db‐>host;
    83. 3. WWW::Page
    84. WWW::Page is a kinda MVC
    85. http://example.com/some/page
    86. http://example.com/some/page /www/example.com/some/page/index.xml
    87. http://example.com/some/page /www/example.com/some/page/index.xml XML
    88. http://example.com/some/page /www/example.com/some/page/index.xml XML Perl XML
    89. http://example.com/some/page /www/example.com/some/page/index.xml XML Perl XML XSLT HTML
    90. http://example.com/some/page /www/example.com/some/page/index.xml XML Perl XML XSLT HTML Browser
    91.     <?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>
    92.     use WWW::Page;     use encoding 'utf‐8';     my $page = new WWW::Page ({         'xslt‐root'       => \"../data/xsl\",     });     print $page‐>as_string();
    93.     <?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>
    94.     <?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>
    95.     <?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>
    96.    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;    }
    97.    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;    }
    98.    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;    }
    99.    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;    }
    100.     <?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>
    101.     <?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>
    102. <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>
    103.     <?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>
    104. XML XSLT HTML Browser
    105. Possible improvements
    106.     <?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>
    107.     <?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>
    108.     <?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>
    109.     <?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>
    110. 4. XSLT
    111. Not .WHAT XSLT is but .WHY I use it
    112. 4a. XSLT: divide and power
    113. website = logic + layout
    114. website = Perl-code + HTML
    115. website = Perl-code + XML+XSLT
    116. website = Perl-code + XML+XSLT Perl programmer XSLT coder
    117. website = Perl-code + XML+XSLT Perl programmer XSLT coder
    118. 4b. XSLT: multiple languages
    119. en.xml  <strings>     <months>        <item>January</item>        <item>February</item>           . . .        <item>December</item>     </months> </strings>
    120. de.xml  <strings>     <months>        <item>Januar</item>        <item>Februar</item>           . . .        <item>Dezember</item>     </months> </strings>
    121. at.xml  <strings>     <months>        <item>Jänner</item>        <item>Februar</item>           . . .        <item>Dezember</item>     </months> </strings>
    122. <xsl:variable name=\"str\">     <xsl:copy‐of select=\"        document(           concat($lang, ‘.xml’)        )\"/> </xsl:variable>
    123. <xsl:variable name=\"str\">     <xsl:copy‐of select=\"        document(           concat($lang, ‘.xml’)        )/strings\"/> </xsl:variable>
    124. <date day=\"7\" month=\"11\" year=\"2008\"/>
    125. <date day=\"7\" month=\"11\" year=\"2008\"/> <xsl:value‐of select=\"@day\"/>
    126. <date day=\"7\" month=\"11\" year=\"2008\"/> <xsl:value‐of select=\"@year\"/>
    127. <date day=\"7\" month=\"11\" year=\"2008\"/> <xsl:value‐of      select=\"$str/months/item[@month]\"/>
    128. 4b. XSLT: multiple layouts
    129.     <?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>
    130.     <?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>
    131.     <?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>
    132.     <?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>
    133. website = Perl-code + XML+XSLT Perl programmer XSLT coder
    134. website = Perl-code + XML+XSLT Perl programmer XSLT coder XSLT coder XSLT coder XSLT coder
    135. __END__ Andrew Shitov http://andy.sh | mail@andy.sh
    SlideShare Zeitgeist 2009

    + andy.shandy.sh Nominate

    custom

    884 views, 0 favs, 1 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 884
      • 883 on SlideShare
      • 1 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 7
    Most viewed embeds
    • 1 views on http://localhost

    more

    All embeds
    • 1 views on http://localhost

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories

    Tags