From 08ef8853043a98995efdd977ee1da4ac58f48d12 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Tue, 17 Apr 2012 15:09:24 -0400 Subject: [PATCH] vhost skin example; beanstalk lessons; etc Signed-off-by: Bill Erickson --- eg2012_tpac.txt | 112 ++++++++++++++++++++++++----------- images/JSPACvsTPACNetworkDiagram.png | Bin 0 -> 17057 bytes 2 files changed, 77 insertions(+), 35 deletions(-) create mode 100644 images/JSPACvsTPACNetworkDiagram.png diff --git a/eg2012_tpac.txt b/eg2012_tpac.txt index 0eae30805..79888dbc8 100644 --- a/eg2012_tpac.txt +++ b/eg2012_tpac.txt @@ -12,9 +12,11 @@ This talk is licensed under a http://creativecommons.org/licenses/by-sa/3.0[Crea image::images/cc_by_sa_360.png[CC BY SA] -Slides available at +Slides and sources available at http://git.evergreen-ils.org/?p=working/random.git;a=tree;h=refs/heads/collab/berick/eg2012;hb=refs/heads/collab/berick/eg2012[git.evergreen-ils.org:working/random.git] +//////////////////////// + Scratch Outline --------------- * Alotted time is 45 mins @@ -28,6 +30,8 @@ Scratch Outline * Wither JSPAC / Whither TPAC (see also hackfest) -- 5 mins * Questions -- 5 mins +//////////////////////// + Why TPAC? --------- @@ -47,9 +51,10 @@ TPAC vs JSPAC Crude Speed Comparison ------------------------------------ * Very professional test methodology - ** Searched for "concerto" and then reloaded the page 3 times each - ** Timing data collected from Chrome's Developer Tools Network pane - ** Average times are for loading all page elements + ** Timing data collected from _Chrome's_ Developer Tools -> Network pane + ** Performed a search to pre-cache the search and page elements (images, + JS, etc.), then collected timing from 3 page reloads each. + ** Average times are for full page load. ** Test server was 350 miles away. * JSPAC ** `6.92` seconds. @@ -57,9 +62,17 @@ TPAC vs JSPAC Crude Speed Comparison * TPAC ** `2.49` seconds. ** `118 KB` transferred - * TPAC with AutoSuggest enabled (i.e. Dojo) after initially caching Dojo + * TPAC with AutoSuggest enabled (i.e. Dojo). ** `2.84` seconds. - ** `130 KB` transferred + ** `130 KB` transferred (`note`: dojo is already cached) + +Why the difference? +-------------------- + +image:images/JSPACvsTPACNetworkDiagram.png["JSPAC vs TPAC Network"] + +*100% Accurate. + Template Toolkit (TT) Syntax ---------------------------- @@ -169,7 +182,7 @@ Paragraph I would like [quant,_1,apple,apples] and a bag of peaches, please. Also, four score and seven years ago (minus four score plus 1 year), Evergreen went live in Georgia. It is a period of civil war. Rebel spaceships, -striking from a hidden base, have won... +striking from a hidden base... [% END %] ------------------------------------------------------------------------------ @@ -210,6 +223,38 @@ Common customizations - styles . Change templates/opac/parts/base.tt2 to point to the templated CSS . Stop maintaining many slight variations of the same CSS +Skinning and Localization with Apache Virtual Hosts +--------------------------------------------------- + + * Template paths and translations are all specified within the + Apache configuration. + * Applying template overrides from additional directories and + using alternate translations (for a given language) can be + managed with Apache virtual hosts. + +[source, conf] +------------------------------------------------------------------------------ + + ServerName libraryABC.exmaple.org:80 + DocumentRoot /openils/var/web/ + DirectoryIndex index.xml index.html index.xhtml + + # - Load the default virtualhost configuration + Include eg_vhost.conf + + # - Selectively override OPAC settings + + PerlSetVar OILSWebContextLoader "OpenILS::WWW::EGCatLoader" + PerlAddVar OILSWebTemplatePath "/openils/var/templates" + PerlAddVar OILSWebTemplatePath "/openils/var/templates_SYSA" + PerlAddVar OILSWebTemplatePath "/openils/var/templates_LIBABC" + PerlAddVar OILSWebLocale "en" + PerlAddVar OILSWebLocale "/openils/var/data/locale/SYSA/kpac.en.po" + + +------------------------------------------------------------------------------ + + Debugging TPAC -------------- @@ -270,42 +315,39 @@ Step 3: Templates image::images/beanstalk_results_template.png[height=600] -Home ----- +Home and Search Results +----------------------- // cram it into a table for borders -[width="10%", options="borders"] -|=== -|image:images/beanstalk_home.png[height=600] -|=== - -Results -------- -[width="10%", options="borders"] -|=== -|image:images/beanstalk_results.png[height=600] -|=== - -Record ------- -[width="10%", options="borders"] +[width="30%", options="borders"] |=== -|image:images/beanstalk_record.png[height=600] +|image:images/beanstalk_home.png[height=600] | image:images/beanstalk_results.png[height=600] |=== -Record Cont. ------------- -[width="10%", options="borders"] -|=== -|image:images/beanstalk_record2.png[height=600] -|=== - -Record Copies +Record Detail ------------- -[width="10%", options="borders"] +[width="60%", options="borders"] |=== -|image:images/beanstalk_copies.png[height=600] +|image:images/beanstalk_record.png[height=600] | image:images/beanstalk_record2.png[height=600] | image:images/beanstalk_copies.png[height=600] |=== +Lessons from the Beanstalk experiment +------------------------------------- + + * Relying on the EGCatLoader.pm for backend processing means + you have very little Perl to write, so you can focus on + HTML. + * Create new templates from existing templates. Removing and + altering existing code is much easier than creating new code. + * Link to as many of the existing templates as you can, + particularly those that do not create visible output. + * Mobile CSS mostly boils down to something like this: +[source, html] +------------------------------------------------------------------------------ + +------------------------------------------------------------------------------ + Wither JSPAC / Whither TPAC --------------------------- diff --git a/images/JSPACvsTPACNetworkDiagram.png b/images/JSPACvsTPACNetworkDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..29a00473828d8ac10c3c0c63ee2d4a1e7d44b27a GIT binary patch literal 17057 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