<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title></title>
  <subtitle></subtitle>
  <id>https://www.endpointdev.com/blog/tags/analytics/</id>
  <link href="https://www.endpointdev.com/blog/tags/analytics/"/>
  <link href="https://www.endpointdev.com/blog/tags/analytics/" rel="self"/>
  <updated>2023-06-01T00:00:00+00:00</updated>
  <author>
    <name>End Point Dev</name>
  </author>
  
    <entry>
      <title>Migrating from Universal Analytics to GA4</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/06/migrating-universal-analytics-ga4/"/>
      <id>https://www.endpointdev.com/blog/2023/06/migrating-universal-analytics-ga4/</id>
      <published>2023-06-01T00:00:00+00:00</published>
      <author>
        <name>Juan Pablo Ventoso</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/06/migrating-universal-analytics-ga4/birds-migration.jpg&#34; alt=&#34;Birds migration&#34;&gt;&lt;/p&gt;
&lt;p&gt;Image: Migration by Aivar Ruukel, 2014. Attribution 2.0 Generic (CC BY 2.0), obtained from &lt;a href=&#34;https://flic.kr/p/pEy1Er&#34;&gt;Flickr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most public-facing websites rely on &lt;a href=&#34;https://marketingplatform.google.com/about/analytics/&#34;&gt;Google Analytics&lt;/a&gt; to track their traffic, analyze the user’s characteristics and behavior, and run reports based on that information to improve marketing strategies, engage their public, and ultimately, increase the user’s loyalty.&lt;/p&gt;
&lt;h3 id=&#34;universal-analytics-vs-google-analytics-4&#34;&gt;Universal Analytics vs. Google Analytics 4&lt;/h3&gt;
&lt;p&gt;Until 2020, Google relied on &lt;a href=&#34;https://support.google.com/analytics/answer/2790010&#34;&gt;Universal Analytics&lt;/a&gt;, a system that offered a set of reports that were mainly based on page visits and content visualization. But in October 2020, Google announced that the new &lt;a href=&#34;https://developers.google.com/analytics/devguides/collection/ga4&#34;&gt;Google Analytics 4&lt;/a&gt; (GA4) was launched, using an event-centered approach for metrics. That allows several improvements in the way the data is collected and analyzed, like taking into account several platforms and devices as a source for the data (for example, combining website traffic with mobile app usage and activity on social networks).&lt;/p&gt;
&lt;p&gt;Another improvement is privacy: Among the new features, anonymous IP addresses are now the default setting for GA4. The user&amp;rsquo;s IP address will be still registered and used to group data when doing the initial collection, but it won&amp;rsquo;t be retained after, and only the location metadata will be used for reporting.&lt;/p&gt;
&lt;p&gt;At the present, both versions co-exist—but not for long! On &lt;a href=&#34;https://blog.google/products/marketingplatform/analytics/prepare-for-future-with-google-analytics-4/&#34;&gt;July 1&lt;/a&gt;, GA4 will be the one option available, and Universal Analytics will disappear completely. That means we have a month (or less, depending on when you’re reading this!) to add a GA4 property and export the existing data from the Universal Analytics property.&lt;/p&gt;
&lt;p&gt;One thing to consider is that the historical data will still be available under our Universal Analytics account for at least six months, but no new traffic will be processed.&lt;/p&gt;
&lt;h3 id=&#34;migrating-from-ua-to-ga4&#34;&gt;Migrating from UA to GA4&lt;/h3&gt;
&lt;p&gt;First, a few considerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We should do this process on the &lt;a href=&#34;https://analytics.google.com/analytics/web&#34;&gt;Google Analytics website&lt;/a&gt;. We cannot do it through the mobile app.&lt;/li&gt;
&lt;li&gt;We should repeat this process for every account that we need to migrate.&lt;/li&gt;
&lt;li&gt;We need access to our website’s source code in case we need to update the existing GA tag.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After navigating to the Analytics website, we need to do the following steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to the Settings item on the lower left.&lt;/li&gt;
&lt;li&gt;Select the existing Universal Analytics property.&lt;/li&gt;
&lt;li&gt;Click the GA4 Setup Assistant link.&lt;/li&gt;
&lt;li&gt;Create a new GA4 property with the assistant&amp;rsquo;s help.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/06/migrating-universal-analytics-ga4/google-analytics-ga4-setup-assistant.jpg&#34; alt=&#34;Screenshot of Google Analytics GA4 Setup Assistant&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you already have a Google tag on the website that can be reused for GA4, you won&amp;rsquo;t need to make any changes to your source code, and you will be all set. If your tag is not compatible, or Google can&amp;rsquo;t detect it properly, the assistant will provide you a new tag. In that case, you will need to install the JavaScript snippet that contains the tag on your website.&lt;/p&gt;
&lt;p&gt;The snippet will look similar to the one below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&amp;lt;!--&lt;/span&gt; Global Site Tag (gtag.js) --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;async&lt;/span&gt; src=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;https://www.googletagmanager.com/gtag/js?id=xxxxxxxxxxxxxxx&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#038&#34;&gt;window&lt;/span&gt;.dataLayer = &lt;span style=&#34;color:#038&#34;&gt;window&lt;/span&gt;.dataLayer || [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt; gtag(){dataLayer.push(arguments);}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gtag(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;js&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#038&#34;&gt;Date&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gtag(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;config&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;xxxxxxxxxxxxxxx&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After finishing the wizard, you will have the new GA4 property connected to your account. Now you can navigate to it and start the second Setup Assistant, that will allow you to customize your property and import the existing data from Universal Analytics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click on the &amp;ldquo;Set up conversions&amp;rdquo; option on the main screen of the assistant.&lt;/li&gt;
&lt;li&gt;Choose the option &amp;ldquo;Import from Universal Analytics&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Select which goals should be imported into events on the GA4 property.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Import selected conversions&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/06/migrating-universal-analytics-ga4/google-analytics-setup-assistant.jpg&#34; alt=&#34;Screenshot of Google Analytics Setup Assistant&#34;&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it! Once the import finishes, the existing goals will appear as &lt;a href=&#34;https://support.google.com/analytics/answer/9267568&#34;&gt;conversion events&lt;/a&gt; on the GA4 property. If the Google tag was set up properly, the traffic information should start flowing to the new property, showing real-time information about your traffic, and the conversion events should be registering specific user actions:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/06/migrating-universal-analytics-ga4/google-analytics-ga4-account-example.jpg&#34; alt=&#34;Screenshot of Google Analytics GA4 Account enabled&#34;&gt;&lt;/p&gt;
&lt;p&gt;We have done several migrations to GA4 for clients that were using Analytics during the past months. If you haven’t done it yet and need any assistance with the process, don’t hesitate to &lt;a href=&#34;https://www.endpointdev.com/contact/&#34;&gt;contact us&lt;/a&gt;!&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>3 Immediate Benefits of Google Analytics for Business Owners</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2021/04/benefits-of-google-anltcs-for-business/"/>
      <id>https://www.endpointdev.com/blog/2021/04/benefits-of-google-anltcs-for-business/</id>
      <published>2021-04-30T00:00:00+00:00</published>
      <author>
        <name>Ben Witten</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2021/04/benefits-of-google-anltcs-for-business/banner.png&#34; alt=&#34;&#34;&gt;
Image from &lt;a href=&#34;https://blog.google/products/marketingplatform/analytics/new_google_analytics/&#34;&gt;Google’s marketing platform blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Where is your traffic coming from? What drew the traffic to your website? Which parts of your website are most visited? How do visits change over time? And how can the answers to these questions help you?&lt;/p&gt;
&lt;p&gt;Answering such questions and doing something about it is called search engine optimization (SEO).&lt;/p&gt;
&lt;p&gt;To help you with this is Google Analytics, a web analytics service that lets you track and understand your website traffic. It is a valuable tool for businesses of all sizes that are looking to grow.&lt;/p&gt;
&lt;p&gt;Here are three ways Google Analytics can benefit your business:&lt;/p&gt;
&lt;h3 id=&#34;determining-site-improvements-to-strengthen-website-flow&#34;&gt;Determining Site Improvements to Strengthen Website Flow&lt;/h3&gt;
&lt;p&gt;This is a great way to generate more “conversions” — visitors to your website taking a desired action. Are visitors behaving the way you expected them to? Can you observe any bottlenecks in audience flow?&lt;/p&gt;
&lt;p&gt;Bottlenecks include traffic getting stuck on one page, when you want them to be going to a different one, like a contact page. Understanding how traffic gets stuck might point you toward the need to refresh certain web pages, which could in turn lead to more conversions.&lt;/p&gt;
&lt;p&gt;For example, we observed that our “Deployment Automation” Expertise subpage has had a 100% bounce rate over the past three months. This is concerning because it means that the content may not be engaging or there may not be a clear visitor navigation path, the end goal being a contact submission. Analytics helped us start looking at how to strengthen this subpage.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2021/04/benefits-of-google-anltcs-for-business/image-1.jpg&#34; alt=&#34;&#34;&gt;
Image from &lt;a href=&#34;https://blog.google/products/marketingplatform/analytics/new_google_analytics/&#34;&gt;Google’s marketing platform blog&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;understanding-your-audience&#34;&gt;Understanding your Audience&lt;/h3&gt;
&lt;p&gt;Who is coming to your site, and how are they finding you? What referral sites, partner sites, media, and blog posts are directing the most traffic to your page? How can you leverage that?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2021/04/benefits-of-google-anltcs-for-business/image-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;In reviewing your inbound traffic, you will see some combination of the following types of traffic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Direct: Traffic from directly typing the URL into the browser address bar.&lt;/li&gt;
&lt;li&gt;Organic: Traffic from people who navigate to your website through search engines after seeing you in search results. Having a strong online presence, especially strong SEO, will help more visitors arrive on your website without the need to pay for them.&lt;/li&gt;
&lt;li&gt;Referral: Traffic that comes to your website after being “referred” from a different website. This is when other websites link to your webpage. More backlinks and referral traffic typically leads to significant SEO benefits.&lt;/li&gt;
&lt;li&gt;Paid: This traffic arrives from paid search campaigns on platforms such as Google Ads.&lt;/li&gt;
&lt;li&gt;Email: Traffic from links in emails.&lt;/li&gt;
&lt;li&gt;Social: Traffic that comes from posts on social media networks like Facebook, LinkedIn, and Twitter.&lt;/li&gt;
&lt;li&gt;Other: All the traffic which doesn’t fit in any other category.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We recommend reviewing each type of traffic to get a better understanding of their flow through your website, and noting any trends you find within individual web traffic sources and mediums.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2021/04/benefits-of-google-anltcs-for-business/image-3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;data-driven-decision-making-stop-relying-on-assumptions-and-rely-on-data&#34;&gt;Data-Driven Decision Making: Stop Relying on Assumptions and Rely on Data&lt;/h3&gt;
&lt;p&gt;One great challenge to businesses is overconfidence in how much you understand about your audience. Google Analytics, and other similar analytics tools, can transform your work culture from being based on opinions and assumptions to being based on hard data. Google Analytics provides data in an organized and impactful format, and using analytics data in tandem with sales efforts can lead to more conversions and revenue for your business.&lt;/p&gt;
&lt;h3 id=&#34;alternatives&#34;&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;With Google having access to so much data and being one of the two major advertisers on the web, many people are looking for alternatives that allow them more control over their customer data, separation from Google’s advertising platforms, and a slimmer data footprint for compliance with privacy laws such as CCPA (California) and GDPR (European Union).&lt;/p&gt;
&lt;p&gt;There have always been various options for web visitor analytics. Google Analytics was originally created by a company called Urchin Software, which Google acquired in 2005. Some current alternatives include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cloudflare.com/web-analytics/&#34;&gt;Cloudflare web analytics&lt;/a&gt;, a new service offered by the popular CDN (Content Distribution Network) that simply shows visitor data already flowing through their systems.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.goatcounter.com/&#34;&gt;GoatCounter&lt;/a&gt;, a SaaS or self-hosted open source application, which aims to provide simple counters rather than collecting personal data, thus avoiding any need for a privacy notice.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://matomo.org/&#34;&gt;Matomo&lt;/a&gt;, formerly known as Piwik, a fully-featured SaaS or on-premises paid package with a limited open source version.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.openwebanalytics.com/&#34;&gt;Open Web Analytics&lt;/a&gt;, a customizable open source analytics framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We at End Point have found success with these core ideas and several of these services. We are happy to provide a &lt;a href=&#34;/contact/&#34;&gt;free consultation&lt;/a&gt; to discuss your website needs.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Using Google Analytics to understand and grow your business</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2016/01/using-google-analytics-to-understand/"/>
      <id>https://www.endpointdev.com/blog/2016/01/using-google-analytics-to-understand/</id>
      <published>2016-01-13T00:00:00+00:00</published>
      <author>
        <name>Ben Witten</name>
      </author>
      <content type="html">
        &lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2016/01/using-google-analytics-to-understand/image-0-big.png&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/01/using-google-analytics-to-understand/image-0.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Google Analytics, a web analytics service offered by Google, is a very handy tool for understanding your audience. It allows you to understand where traffic comes from and what resonates with your audience, which has led to Google Analytics being the most widely used web analytics service on the internet. If you understand your website’s traffic, you then have the ability to focus your website and content to optimize engagement and growth.&lt;/p&gt;
&lt;p&gt;With Google Analytics, you have the ability to see traffic from all channels. This will lead to clear insights, and will help you understand what’s working and what’s not.&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2016/01/using-google-analytics-to-understand/image-1-big.png&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/01/using-google-analytics-to-understand/image-1.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Organic — traffic from search engines which is not paid for&lt;/li&gt;
&lt;li&gt;Paid Search — visitors that clicked on one of your paid advertisements (also known as Pay-Per-Click or PPC)&lt;/li&gt;
&lt;li&gt;Direct — visitors that typed your website address directly into the browser (includes bookmarks)&lt;/li&gt;
&lt;li&gt;Social — traffic from sites that are considered to be social networking sites&lt;/li&gt;
&lt;li&gt;Referral — visitors that arrived from 3rd party referrals&lt;/li&gt;
&lt;li&gt;Email — visitors that are directed from an email&lt;/li&gt;
&lt;li&gt;Display — visitors directed from video and display advertising&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It will be helpful to walk through an example. Say you launch an email marketing campaign, and want to understand how your audience responded to your content. First, you can check how many people clicked the ad to come to your website. From there, you can see how they navigated the page. Who came to the webpage? Did they take the actions you were hoping they would take? How long did they spend viewing the page? Where did they click? Did this click lead to a conversion/sale?&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2016/01/using-google-analytics-to-understand/image-2-big.png&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/01/using-google-analytics-to-understand/image-2.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Prior to coming to End Point, I was working as an Analytic Strategist at a digital media agency. One of my biggest clients was luxury jewelry company Tiffany &amp;amp; Co. My responsibilities included analyzing seasonal and promotional trends to develop forecasts, broken out by channel. I would also evaluate the marketing effectiveness of initiatives by keeping a close eye on the user experience and navigational behavior, and provide recommendations throughout the customer journey.&lt;/p&gt;
&lt;p&gt;Many jewelry promotions are seasonal, so we were constantly making changes to optimize the page and ensure traffic was navigating the website as we hoped. I would make sure to keep in mind the 4 P’s—​Product, Price, Place, and Promotion. I wanted to ensure that the layout of your site, price-point, and specials were always in line with what the audience is most looking for during the season.&lt;/p&gt;
&lt;p&gt;This experience of understanding client goals, and helping them achieve those goals through the success of their websites, has proven to be a valuable skill since joining End Point’s team. Beyond having the ability to help clients with their websites, this knowledge has also been helpful internally. I keep a close eye on where our website traffic is coming from, including seeing which blog posts resonate with different audiences. I have made recommendations for adjustments to poor-performing pages, and taken time to analyze pages with high bounce rates, to see whether the bounce rates are due to the page not being well-constructed or due to traffic not being properly directed. I also take note of any industry changes, and make website adjustments to accommodate those changes. For example, End Point has a plethora of skill in many programming languages, and if we see one language gaining popularity we will make a point to highlight it more prominently.&lt;/p&gt;
&lt;p&gt;I look forward to continuing to use Google Analytics to strengthen our company websites and to help our clients strengthen theirs. Please don&amp;rsquo;t hesitate to &lt;a href=&#34;/contact/&#34;&gt;reach out&lt;/a&gt; if you would like to learn more.&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2016/01/using-google-analytics-to-understand/image-3-big.png&#34; imageanchor=&#34;1&#34; style=&#34;margin-left: 1em; margin-right: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/01/using-google-analytics-to-understand/image-3.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;

      </content>
    </entry>
  
    <entry>
      <title>Install Pentaho BI Server 4.8 Community Edition with PostgreSQL Repository</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2013/11/install-pentaho-bi-server-48-community/"/>
      <id>https://www.endpointdev.com/blog/2013/11/install-pentaho-bi-server-48-community/</id>
      <published>2013-11-07T00:00:00+00:00</published>
      <author>
        <name>Selvakumar Arumugam</name>
      </author>
      <content type="html">
        &lt;p&gt;Pentaho BI server community edition can be installed through an archive file available from SourceForge.&lt;/p&gt;
&lt;p&gt;Prerequisites&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 6&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Download Pentaho BI Server installation file (biserver-ce-4.8.0-stable.zip) from SourceForge: &lt;a href=&#34;http://sourceforge.net/projects/pentaho/files/Business%20Intelligence%20Server/4.8.0-stable&#34;&gt;http://sourceforge.net/projects/pentaho/files/Business%20Intelligence%20Server/4.8.0-stable&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unzip the archive file and navigate inside biserver-ce to set sh files to executable mode:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ unzip biserver-ce-4.8.0-stable.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#038&#34;&gt;cd&lt;/span&gt; biserver-ce
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ find . -type f -iname &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;*.sh&amp;#39;&lt;/span&gt; -exec chmod a+x {} &lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pentaho community edition uses hsql database as default. Need to create two databases in Postgres for Pentaho. Find the SQL files to create databases under biserver-ce/data/postgresql. database_name, user_name and password are configurable through SQL files. Fix two errors before creating database using SQL files. Comment two lines in below files tables as commented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create_quartz_postgresql.sql&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;qrtz_fired_triggers&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TRIGGER_NAME&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TRIGGER_GROUP&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;INSTANCE_NAME&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;JOB_NAME&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;JOB_GROUP&lt;span style=&#34;color:#bbb&#34;&gt;     &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ADD&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;COLUMN&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;PRIORITY&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;INTEGER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NULL&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;--    ADD COLUMN PRIORITY INTEGER NOT NULL;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;migrate_quartz_postgresql.sql&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;qrtz_fired_triggers&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TRIGGER_NAME&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TRIGGER_GROUP&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;INSTANCE_NAME&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;JOB_NAME&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ALTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;JOB_GROUP&lt;span style=&#34;color:#bbb&#34;&gt;     &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TYPE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;200&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;--    ADD COLUMN PRIORITY INTEGER NOT NULL;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;--    ALTER COLUMN PRIORITY SET NULL;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Modify database name, username &amp;amp; password if necessary and create databases for configuration and scheduling by running below commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -a -f create_quartz_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -a -f create_repository_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -a -f create_sample_datasource_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -a -f migrate_quartz_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -a -f migration.sql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Verify databases quartz (scheduling) and hibernate (configuration) and their tables.&lt;/p&gt;
&lt;p&gt;Now database name, username, password and driver should be configured in following places in files. By default hsql drivers, settings enabled in config files so comment hsql configurations and enable Postgres settings.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;biserver-ce/tomcat/webapps/pentaho/META-INF/context.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c00;font-weight:bold&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;Context&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;path=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;/pentaho&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;docbase=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;webapps/pentaho/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;Resource&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc/Hibernate&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;auth=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;Container&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;type=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;javax.sql.DataSource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;factory=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.apache.commons.dbcp.BasicDataSourceFactory&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;maxActive=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;maxIdle=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;maxWait=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;10000&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;username=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;hibuser&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;password=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;driverClassName=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.postgresql.Driver&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;url=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc:postgresql://localhost:5432/hibernate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;validationQuery=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;select 1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;Resource&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc/Quartz&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;auth=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;Container&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;type=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;javax.sql.DataSource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;factory=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.apache.commons.dbcp.BasicDataSourceFactory&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;maxActive=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;maxIdle=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;maxWait=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;10000&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;username=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;pentaho_user&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;password=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;driverClassName=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.postgresql.Driver&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;url=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc:postgresql://localhost:5432/quartz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;validationQuery=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;select 1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/Context&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ce/pentaho-solutions/system/applicationContext-spring-security-jdbc.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;id=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;dataSource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#369&#34;&gt;class=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.springframework.jdbc.datasource.DriverManagerDataSource&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;driverClassName&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.postgresql.Driver&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc:postgresql://localhost:5432/hibernate&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;username&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;hibuser&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ce/pentaho-solutions/system/applicationContext-spring-security-hibernate.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdbc.driver=org.postgresql.Driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdbc.url=jdbc:postgresql://localhost:5432/hibernate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdbc.username=hibuser
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdbc.password=password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ce/pentaho-solutions/system/hibernate/hibernate-settings.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;config-file&amp;gt;&lt;/span&gt;system/hibernate/postgresql.hibernate.cfg.xml&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/config-file&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ce/pentaho-solutions/system/hibernate/postgresql.hibernate.cfg.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.driver_class&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;org.postgresql.Driver&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.url&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;jdbc:postgresql://localhost:5432/hibernate&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;dialect&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;org.hibernate.dialect.PostgreSQLDialect&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.username&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;hibuser&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.password&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;password&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ce/pentaho-solutions/system/simple-jndi/jdbc.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hibernate/type=javax.sql.DataSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hibernate/driver=org.postgresql.Driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hibernate/url=jdbc:postgresql://localhost:5432/hibernate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hibernate/user=hibuser
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hibernate/password=password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quartz/type=javax.sql.DataSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quartz/driver=org.postgresql.Driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quartz/url=jdbc:postgresql://localhost:5432/quartz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quartz/user=pentaho_user
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quartz/password=password&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Specify the pentaho solutions path, server url and port in web.xml of tomcat webapp&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;biserver-ce/tomcat/webapps/pentaho/WEB-INF/web.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;solution-path&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;/opt/avr-new/biserver-ce/pentaho-solutions&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;fully-qualified-server-url&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;http://localhost:8080/pentaho/&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pentaho can be run tomcat custom ports by modifying the ports in server.xml and web.xml&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;biserver-ce/tomcat/conf/server.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;Connector&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;URIEncoding=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;port=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;9090&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;protocol=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;HTTP/1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#369&#34;&gt;connectionTimeout=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;20000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#369&#34;&gt;redirectPort=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;8443&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ce/tomcat/webapps/pentaho/WEB-INF/web.xml &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;fully-qualified-server-url&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;http://localhost:8080/pentaho/&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let’s start the Pentaho BI server and try out its great features. Commands to start and stop the BI server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ce$ ./start-pentaho.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ce$ ./stop-pentaho.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Troubleshooting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ce$ tail -f tomcat/logs/catalina.out
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ce$ tail -f tomcat/logs/pentaho.out&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


      </content>
    </entry>
  
    <entry>
      <title>Install Pentaho BI Server 5 Enterprise Edition with PostgreSQL repository</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2013/11/install-pentaho-bi-server-5-enterprise/"/>
      <id>https://www.endpointdev.com/blog/2013/11/install-pentaho-bi-server-5-enterprise/</id>
      <published>2013-11-07T00:00:00+00:00</published>
      <author>
        <name>Selvakumar Arumugam</name>
      </author>
      <content type="html">
        &lt;p&gt;Pentaho provides different ways to install Pentaho BI server. Each method has its own flexibility in installation.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Installer mode—​Easy to install BA &amp;amp; DI server &amp;amp; tools in one flow with default PostgreSQL repo &amp;amp; default Tomcat server. (New Postgres installed on port 5432.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Archive mode—​BA server installed with own BA repository &amp;amp; default Tomcat server. Necessary tools need to be installed manually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Manual mode—​BA server installed with own BA repository &amp;amp; own application server (Tomcat or JBoss). Necessary tools need to installed manually.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We have a Postgres instance running on our server and are good with Tomcat as application server so Archive mode of installation is suitable for us. Pentaho installation requires two things be installed before starting with Pentaho installation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 7&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Archive mode installation files can be accessible only to license purchased users. Download biserver-ee-5.x-dist.zip from Pentaho customer portal with account credentials here: &lt;a href=&#34;https://support.pentaho.com/forums/20413716-Downloads&#34;&gt;https://support.pentaho.com/forums/20413716-Downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unzip the archive file and you can see the installation files inside extracted directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ unzip biserver-ee-5.x-dist.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#038&#34;&gt;cd&lt;/span&gt; biserver-ee-5.x;ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;install.bat  installer.jar  install.sh  license.txt  README.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In remote servers Pentaho can be installed on console mode with -console’. Accept the license and provide the installation path to install Pentaho BI server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ java -jar installer.jar -console&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Find biserver-ee directory under the installation path and set sh files to executable mode.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#038&#34;&gt;cd&lt;/span&gt; biserver-ee;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ find . -type f -iname &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;*.sh&amp;#39;&lt;/span&gt; -exec chmod a+x {} &lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let’s create repository databases by running queries in SQL files located at biserver-ee/data/postgresql.&lt;/p&gt;
&lt;p&gt;quartz, hibernate and jackrabbit databases will be created by executing these SQL files. Database names, usernames and password can be changed by modifying in SQL files if required.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#038&#34;&gt;cd&lt;/span&gt; biserver-ee/data/postgresql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -p &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;5432&lt;/span&gt; -a -f create_jcr_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -p &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;5432&lt;/span&gt; -a -f create_quartz_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -p &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;5432&lt;/span&gt; -a -f create_repository_postgresql.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ psql -U postgres -p &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;5432&lt;/span&gt; -a -f pentaho_mart_postgresql.sql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pentaho uses postgresql as default database and files are configured to use postgresql. So just verify the database_name, username and password to work with installed postgresql and databases created.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;biserver-ee/pentaho-solutions/system/quartz/quartz.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ee/pentaho-solutions/system/hibernate/hibernate-settings.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;config-file&amp;gt;&lt;/span&gt;system/hibernate/postgresql.hibernate.cfg.xml&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/config-file&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;biserver-ee/pentaho-solutions/system/hibernate/postgresql.hibernate.cfg.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.driver_class&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;org.postgresql.Driver&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.url&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;jdbc:postgresql://localhost:5432/hibernate&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;dialect&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;org.hibernate.dialect.PostgreSQLDialect&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.username&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;pentaho_user&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;connection.password&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;password&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are more occurrences in this file. Carefully do the necessary changes in all the places.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;biserver-ee/pentaho-solutions/system/jackrabbit/repository.xml&lt;/li&gt;
&lt;li&gt;biserver-ee/pentaho-solutions/system/jackrabbit/repository/workspaces/default/workspace.xml&lt;/li&gt;
&lt;li&gt;biserver-ee/tomcat/webapps/pentaho/META-INF/context.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;Resource&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc/PDI_Operations_Mart&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;auth=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;Container&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;type=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;javax.sql.DataSource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#369&#34;&gt;factory=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.apache.commons.dbcp.BasicDataSourceFactory&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;maxActive=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;maxIdle=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#369&#34;&gt;maxWait=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;10000&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;username=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;pentaho_user&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;password=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#369&#34;&gt;driverClassName=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;org.postgresql.Driver&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#369&#34;&gt;url=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;jdbc:postgresql://localhost:5432/hibernate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#369&#34;&gt;validationQuery=&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;select 1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Download postgresql and h2 drivers then place it under biserver-ee/tomcat/lib&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;postgresql-9.x.jdbc4.jar&lt;/p&gt;
&lt;p&gt;h2-1.2.x.jar&lt;/p&gt;
&lt;p&gt;Change Tomcat port on these two files to run Pentaho on different port.&lt;/p&gt;
&lt;p&gt;Specify the Pentaho solutions path, server URL and port in web.xml of Tomcat webapp.&lt;/p&gt;
&lt;p&gt;biserver-ee/tomcat/webapps/pentaho/WEB-INF/web.xml&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;solution-path&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;$INSTALLATION_PATH/biserver-ee/pentaho-solutions&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;fully-qualified-server-url&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;http://localhost:8080/pentaho/&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pentaho can be configured to run on different ports by changing ports on Tomcat server.xml and web.xml&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;biserver-ee/tomcat/biserver-ee/tomcat/server.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;Connector&lt;/span&gt; &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;URIEncoding&amp;#34;UTF-8&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;port&amp;#34;9090&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;protocol&amp;#34;HTTP/1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;connectionTimeout&amp;#34;20000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;redirectPort&amp;#34;8443&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- biserver-ee/tomcat/webapps/pentaho/WEB-INF/web.xml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;fully-qualified-server-url&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;http://localhost:9090/pentaho/&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install license&lt;/p&gt;
&lt;p&gt;A license needs to be installed to use Pentaho. Navigate to the license-installer directory in installation path. Feed license file to install_license.sh, separating more than one license file with spaces.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./install_license.sh install ../license/Pentaho&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\ &lt;/span&gt;BI&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\ &lt;/span&gt;Platform&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\ &lt;/span&gt;Enterprise&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\ &lt;/span&gt;Edition.lic&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install plugins&lt;/p&gt;
&lt;p&gt;Archive mode of installation installs only BI Server. Necessary plugins can to be installed manually. Here install the plugins for reporting, analyzer and dashboard. Plugins are available at the same place where download BI server. Download these three files and place at any path on server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reporting—​pir-plugin-ee-5.x-dist.zip&lt;/li&gt;
&lt;li&gt;Analyzer—​pdd-plugin-ee-5.0.0.1-dist.zip&lt;/li&gt;
&lt;li&gt;Dashboard—​paz-plugin-ee-5.0.0.1-dist.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All the plugins installed through same procedure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unzip the plugins and navigate to extracted directory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run installer on console, accept the license and provide $INSTALLATION_PATH/biserver-ee/pentaho-solutions/system as location to install plugins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ java -jar installer.jar -console&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let’s start the BI server&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ee$ ./start-pentaho.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install the licenses for the plugins by login as admin user (default—​Admin:password) or install through the command line:&lt;/p&gt;
&lt;p&gt;Administration -&amp;gt; License -&amp;gt; install licenses for plugin by click +&lt;/p&gt;
&lt;p&gt;Troubleshooting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ee$ tail -f tomcat/logs/catalina.out
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ee$ tail -f tomcat/logs/pentaho.log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If the pentaho.xml is present at tomcat/conf/Catalina directory, delete it. It will be generated again when you start the BA Server.&lt;/p&gt;
&lt;p&gt;Start and stop the BI server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ee$ ./start-pentaho.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;biserver-ee$ ./stop-pentaho.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


      </content>
    </entry>
  
    <entry>
      <title>Conversion Tracking via JavaScript</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2013/01/conversion-tracking-via-javascript/"/>
      <id>https://www.endpointdev.com/blog/2013/01/conversion-tracking-via-javascript/</id>
      <published>2013-01-08T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;Most analytics conversion tracking is done these days with JavaScript or invisible pixel requests on the page that indicates a user has reached a conversion event, such as the receipt page. For example, Google Analytics conversion code might look like this on the receipt page:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_setAccount&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;UA-XXXXX-X&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_trackPageview&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_addTrans&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;1234&amp;#39;&lt;/span&gt;,           &lt;span style=&#34;color:#888&#34;&gt;// transaction ID - required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Womens Apparel&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#888&#34;&gt;// affiliation or store name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;28.28&amp;#39;&lt;/span&gt;,          &lt;span style=&#34;color:#888&#34;&gt;// total - required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;1.29&amp;#39;&lt;/span&gt;,           &lt;span style=&#34;color:#888&#34;&gt;// tax
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;15.00&amp;#39;&lt;/span&gt;,          &lt;span style=&#34;color:#888&#34;&gt;// shipping
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;San Jose&amp;#39;&lt;/span&gt;,       &lt;span style=&#34;color:#888&#34;&gt;// city
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;California&amp;#39;&lt;/span&gt;,     &lt;span style=&#34;color:#888&#34;&gt;// state or province
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;USA&amp;#39;&lt;/span&gt;             &lt;span style=&#34;color:#888&#34;&gt;// country
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_addItem&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;1234&amp;#39;&lt;/span&gt;,           &lt;span style=&#34;color:#888&#34;&gt;// transaction ID - necessary to associate item with transaction
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;DD44&amp;#39;&lt;/span&gt;,           &lt;span style=&#34;color:#888&#34;&gt;// SKU/code - required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;T-Shirt&amp;#39;&lt;/span&gt;,        &lt;span style=&#34;color:#888&#34;&gt;// product name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Olive Medium&amp;#39;&lt;/span&gt;,   &lt;span style=&#34;color:#888&#34;&gt;// category or variation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;11.99&amp;#39;&lt;/span&gt;,          &lt;span style=&#34;color:#888&#34;&gt;// unit price - required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;               &lt;span style=&#34;color:#888&#34;&gt;// quantity - required
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_trackTrans&amp;#39;&lt;/span&gt;]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But what happens when a single page with various JavaScript-driven UI updates drives a user to a conversion event via AJAX? All of the conversion events have to be triggered via JavaScript after the conversion event. After some experimentation and verification with Google’s Developer Tools (Network) or Firebug’s Net Tool, I’ve implemented the following tracking services and code in JavaScript upon a conversion event for our Ruby on Rails client &lt;a href=&#34;https://web.archive.org/web/20130112044344/http://www.mobixa.com:80/&#34;&gt;Mobixa&lt;/a&gt;:&lt;/p&gt;
&lt;h3 id=&#34;msn-conversion&#34;&gt;MSN Conversion&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tagid = &lt;span style=&#34;color:#888&#34;&gt;/* tag id */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;domainid = &lt;span style=&#34;color:#888&#34;&gt;/* domain id */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;actionid = &lt;span style=&#34;color:#888&#34;&gt;/* action id */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jQuery(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;lt;iframe src=&amp;#34;//flex.atdmt.com/mstag/tag/&amp;#39;&lt;/span&gt; + tagid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/analytics.html?dedup=1&amp;amp;domainId=&amp;#39;&lt;/span&gt; + domainid + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;amp;type=1&amp;amp;actionid=&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + actionid + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#34; frameborder=&amp;#34;0&amp;#34; scrolling=&amp;#34;no&amp;#34; width=&amp;#34;1&amp;#34; height=&amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;  style=&amp;#34;visibility:hidden;display:none&amp;#34;&amp;gt;&amp;lt;0/iframe&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .appendTo(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;#hidden_tracking&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;google-ad-services&#34;&gt;Google Ad Services&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;google_conversion_id = &lt;span style=&#34;color:#888&#34;&gt;/*conversion id*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;google_conversion_label = &lt;span style=&#34;color:#888&#34;&gt;/* conversion label */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; image = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;new&lt;/span&gt; Image(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;image.src = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;http://www.googleadservices.com/pagead/conversion/&amp;#39;&lt;/span&gt; +
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  google_conversion_id + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/?label=&amp;#39;&lt;/span&gt; + google_conversion_label +
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;amp;value=1&amp;amp;guid=ON&amp;amp;script=0&amp;#39;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;floodlight-conversion&#34;&gt;Floodlight Conversion&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jQuery(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;lt;img height=&amp;#34;1&amp;#34; width=&amp;#34;1&amp;#34; src=&amp;#34;http://sa.jumptap.com/a/conversion?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;  event=Purchase&amp;#34; /&amp;gt;&amp;#39;&lt;/span&gt;).appendTo(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;#hidden_tracking&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;adparlor-conversion&#34;&gt;AdParlor Conversion&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adid = &lt;span style=&#34;color:#888&#34;&gt;/* Ad Parlor id */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jQuery(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;lt;img height=&amp;#34;1&amp;#34; width=&amp;#34;1&amp;#34; alt=&amp;#34;AP_pixel&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;  src=&amp;#34;http://fbads.adparlor.com/conversion.php?adid=&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + adid + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;  /&amp;gt;&amp;#39;&lt;/span&gt;).appendTo(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;#hidden_tracking&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;adknowledge&#34;&gt;AdKnowledge&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adknowledgeid = &lt;span style=&#34;color:#888&#34;&gt;/* adknowledge id */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jQuery(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;lt;iframe src=&amp;#34;https://www.lynxtrack.com/track.frame.php?g=&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + adknowledgeid + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;amp;o=&amp;#39;&lt;/span&gt; + &lt;span style=&#34;color:#888&#34;&gt;/* order number */&lt;/span&gt; + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;amp;s=&amp;#39;&lt;/span&gt; + &lt;span style=&#34;color:#888&#34;&gt;/* total */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#34; height=&amp;#34;1&amp;#34; width=&amp;#34;1&amp;#34; frameborder=&amp;#34;0&amp;#34;&amp;gt;  &amp;lt;script
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;  language=&amp;#34;JavaScript&amp;#34; src=&amp;#34;https://www.lynxtrack.com/trackjs/g-&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + adknowledgeid + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/o-&amp;#39;&lt;/span&gt; + &lt;span style=&#34;color:#888&#34;&gt;/* order number */&lt;/span&gt; + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/s-&amp;#39;&lt;/span&gt; + &lt;span style=&#34;color:#888&#34;&gt;/* total */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/track.js&amp;#34;&amp;gt; &amp;lt;/script&amp;gt;&amp;lt;noscript&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;  &amp;lt;img src=&amp;#34;https://www.lynxtrack.com/track.php?g=&amp;#39;&lt;/span&gt; + adknowledgeid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;amp;o=&amp;#39;&lt;/span&gt; + &lt;span style=&#34;color:#888&#34;&gt;/* order number */&lt;/span&gt; + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;amp;s=&amp;#39;&lt;/span&gt; + &lt;span style=&#34;color:#888&#34;&gt;/* total */&lt;/span&gt; + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#34; width=&amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;  height=&amp;#34;1&amp;#34; border=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;/noscript&amp;gt;&amp;lt;/iframe&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .appendTo(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;#hidden_tracking&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;google-analytics-ecommerce-conversion&#34;&gt;Google Analytics Ecommerce Conversion&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_addTrans&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* order number */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* affiliation */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* total */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* tax */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* shipping */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* city */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* state */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888&#34;&gt;/* country */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$.each(purchased_items, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;(i, item) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_addItem&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888&#34;&gt;/* order number */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888&#34;&gt;/* item sku */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888&#34;&gt;/* item name */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888&#34;&gt;/* item category */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888&#34;&gt;/* item price */&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888&#34;&gt;/* item quantity */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_trackTrans&amp;#39;&lt;/span&gt;]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Here are a few important takeaways in working with conversion tracking via JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most of the above conversion tracking calls have a specific ID that is provided by the marketing service.&lt;/li&gt;
&lt;li&gt;Images and iframes are appended to a div with an id of hidden_tracking on the page to trigger the conversion request. Tracking did not appear to work if the images or iframes were appended to the body element. Also in the case of Google Ad Services conversion, the image itself did not have to be appended to the page; a request alone was enough.&lt;/li&gt;
&lt;li&gt;It’s important and extremely helpful to use Google Developer Tools or Firebug to verify these requests go through during development.&lt;/li&gt;
&lt;li&gt;Google Analytics tracking does not look much different from non-AJAX conversion tracking, but much of the other tracking code differs from what you might see in on-page tracking events.&lt;/li&gt;
&lt;/ul&gt;

      </content>
    </entry>
  
    <entry>
      <title>Cannot parse Cookie header in Ruby on Rails</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2012/09/cannot-parse-cookie-header-in-ruby-on/"/>
      <id>https://www.endpointdev.com/blog/2012/09/cannot-parse-cookie-header-in-ruby-on/</id>
      <published>2012-09-07T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;Yesterday I resolved a client emergency for a Ruby on Rails site that continues to leave me scratching my head, even with follow-up investigation. In short, the emergency came up after an email marketing campaign was sent out in the morning, and resulted in server (HTTP 500 Status Code) errors for every customer that clicked on the email links. Despite the fact that Rails exception emails are sent to the client and me, the errors were never reaching the exception email code, so I was unaware of the emergency until the client contacted me.&lt;/p&gt;
&lt;p&gt;Upon jumping on the server, I saw this in the production log repeatedly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ArgumentError (cannot parse Cookie header: invalid %-encoding (...)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ArgumentError (cannot parse Cookie header: invalid %-encoding (...)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ArgumentError (cannot parse Cookie header: invalid %-encoding (...)):&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The URLs that the production log was complaining about had a bunch of Google Analytics tracking variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;utmcmd=Email&lt;/li&gt;
&lt;li&gt;utmcct=customeremail&lt;/li&gt;
&lt;li&gt;utmccn=New Site Sale 70% off&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After a user visits the site, these variables are typically stored as cookies for Google Analytics tracking. Upon initial investigation, the issue appeared to be triggered from any Google campaign variable that contained a &amp;lsquo;%&amp;rsquo; character.&lt;/p&gt;
&lt;p&gt;After follow-up investigation today, the more complete story looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Email blast sent&lt;/li&gt;
&lt;li&gt;User clicks on link in email. That link goes to the email marketing company first for tracking, then is redirected to the website.&lt;/li&gt;
&lt;li&gt;According to the email marketing campaign (after chatting with them today), Google Analytics tacks on their own tracking here, which is the source of the non-parseable URLs.&lt;/li&gt;
&lt;li&gt;Rack receives the request and tries to parse the query, utilizing the Ruby URI module:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#06b;font-weight:bold&#34;&gt;decode_www_form_component&lt;/span&gt;(str, enc=&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Encoding&lt;/span&gt;::&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;UTF_8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;TBLDECWWWCOMP_&lt;/span&gt;.empty?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      tbl = {} 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;256&lt;/span&gt;.times &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;do&lt;/span&gt; |i|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        h, l = i&amp;gt;&amp;gt;&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;4&lt;/span&gt;, i&amp;amp;&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;15&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tbl[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;%%%X%X&amp;#39;&lt;/span&gt; % [h, l]] = i.chr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tbl[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;%%%x%X&amp;#39;&lt;/span&gt; % [h, l]] = i.chr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tbl[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;%%%X%x&amp;#39;&lt;/span&gt; % [h, l]] = i.chr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tbl[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;%%%x%x&amp;#39;&lt;/span&gt; % [h, l]] = i.chr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      tbl[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;+&amp;#39;&lt;/span&gt;] = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;TBLDECWWWCOMP_&lt;/span&gt;.replace(tbl)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;TBLDECWWWCOMP_&lt;/span&gt;.freeze
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;rescue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;ArgumentError&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;invalid %-encoding (&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;#{&lt;/span&gt;str&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;)&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;unless&lt;/span&gt; &lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/\A[^%]*(?:%\h\h[^%]*)*\z/&lt;/span&gt; =~ str
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    str.gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/\+|%\h\h/&lt;/span&gt;, &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;TBLDECWWWCOMP_&lt;/span&gt;).force_encoding(enc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;The argument error on line 18 trickles up the pipeline in &lt;a href=&#34;http://rack.github.com/&#34;&gt;rack&lt;/a&gt;, and is not handled elegantly, so a rack-originated server (HTTP 500 Status Code) error is triggered. Again, the &amp;lsquo;%&amp;rsquo; character in the URL appears to be the problem here likely based on the regexp match on line 18 — the error is not triggered when the Google variable does not contain a &amp;lsquo;%&amp;rsquo; character.&lt;/li&gt;
&lt;li&gt;Customer sees server error page and is unhappy :(&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At the time of the emergency we tried solving the problem on multiple avenues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigated removal of Google Analytics tracking URLs from email blast links, but this wouldn&amp;rsquo;t help all the customers who already received the emails.&lt;/li&gt;
&lt;li&gt;Remove CGI parameters or sanitize them via nginx.&lt;/li&gt;
&lt;li&gt;Make web application changes to ignore or handle the ArgumentError.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultimately, I ended up added a begin/rescue statement to the rack code to skip escaping URLs where decode_www_form_component was raising an error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06b;font-weight:bold&#34;&gt;unescape&lt;/span&gt;(s, encoding = &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Encoding&lt;/span&gt;::&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;UTF_8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;URI&lt;/span&gt;.decode_www_form_component(s, encoding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;rescue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Rails&lt;/span&gt;.logger.warn &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;DECODING on &lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;#{&lt;/span&gt;s.inspect&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt; with &lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;#{&lt;/span&gt;encoding.inspect&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt; FAILING.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While this is a reasonable fix, I&amp;rsquo;m still puzzled for a number of reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The email marketing company (via chatting) claims that Google Analytics is tacking on the tracking variables, however, there is only one redirect from the email marketing company to the website. I don&amp;rsquo;t understand the mechanism for which Google Analytics tracking variables are added to the URL, and if this process can be cleaned up to ensure proper URL encoding.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m not sure if the issue happens immediately upon a customer landing on the site, or after a cookie is stored.&lt;/li&gt;
&lt;li&gt;At the moment, I&amp;rsquo;m not able to reproduce this issue in development mode, which makes it difficult to troubleshoot on my development instance.&lt;/li&gt;
&lt;li&gt;When I use the URI module directly in a console, no ArgumentError is raised:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;URI&lt;/span&gt;.decode_www_form_component(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;url_with_google_campaign_variables&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;span style=&#34;color:#888&#34;&gt;#happy dance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;My best advice at this point is to tell the client not to use &amp;lsquo;%&amp;rsquo; character in the Google Campaign ID, but I&amp;rsquo;m still putting all the pieces together in the virtual code map in my head. I think a fix is more likely needed on the Ruby and rack side to handle URL parameters with the &amp;lsquo;%&amp;rsquo; character, and to elegantly handle situations where the URI.decode_www_form_components method dies.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>An Introduction to Google Website Optimizer</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2012/04/google-website-optimizer-introduction/"/>
      <id>https://www.endpointdev.com/blog/2012/04/google-website-optimizer-introduction/</id>
      <published>2012-04-17T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;On End Point’s website, &lt;a href=&#34;/team/jon-jensen/&#34;&gt;Jon&lt;/a&gt; and I recently discussed testing out use of Google Website Optimizer to run a few A/B tests on content and various website updates. I’ve worked with a couple of clients who use Google Website Optimizer, but I’ve never installed it from start to finish. Here are a few basic notes that I made during the process.&lt;/p&gt;
&lt;h3 id=&#34;whats-the-point&#34;&gt;What’s the Point?&lt;/h3&gt;
&lt;p&gt;Before I get into the technical details of the implementation, I’ll give a quick summary of why you would want to A/B test something. A basic A/B test will test user experiences of content A versus content B. The goal is to decide which of the two (content A or content B) leads to higher conversion (or higher user interactivity that indirectly leads to conversion). After testing, one would continue to use the higher converting content. An example of this in ecommerce may be product titles or descriptions.&lt;/p&gt;
&lt;h3 id=&#34;ab-tests-in-google-website-optimizer&#34;&gt;A/B tests in Google Website Optimizer&lt;/h3&gt;
&lt;p&gt;I jumped right into the Google Website Optimizer sign-up and wanted to set up a simple A/B test to test variations on our home page content. Unfortunately, I found right away that basic A/B tests in Google Website optimizer require two different URLs to test. In test A, the user would be see index.html, and in test B, the user would see index_alt.html. This is unfortunate because for SEO and technical reasons, I didn’t want to create an alternative index page.&lt;/p&gt;
&lt;table cellpadding=&#34;0&#34; cellspacing=&#34;0&#34; width=&#34;100%&#34;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td valign=&#34;bottom&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2012/04/google-website-optimizer-introduction/image-0.png&#34; width=&#34;350&#34;/&gt;&lt;/td&gt;
&lt;td valign=&#34;bottom&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2012/04/google-website-optimizer-introduction/image-1.png&#34; width=&#34;350&#34;/&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;small&gt;Test A: Keep existing text&lt;/small&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;small&gt;Test B: Remove some paragraph text in first section&lt;/small&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&#34;multivariate-testing&#34;&gt;Multivariate Testing&lt;/h3&gt;
&lt;p&gt;Rather than implement a basic A/B tests in Google Website optimizer, I decided to implement a multivariate test with just the two options (A and B). The basic setup required this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy provided JavaScript into my test page just above &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wrap &lt;code&gt;&amp;lt;script&amp;gt;utmx_section(&amp;quot;stephs_test&amp;quot;)&amp;lt;/script&amp;gt;&lt;/code&gt;&amp;hellip;&lt;code&gt;&amp;lt;/noscript&amp;gt;&lt;/code&gt; around the section of text that will be modified by the test.&lt;/li&gt;
&lt;li&gt;Copy provided JavaScript into my converting test page just above &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google Website Optimizer will verify the code and provide a user interface to enter the variations of the test text.&lt;/p&gt;
&lt;p&gt;I used multivariate testing to test the homepage changes described above. After a couple of weeks of testing, my test results were inconclusive:&lt;/p&gt;
&lt;p&gt;&lt;img border=&#34;0&#34; height=&#34;191&#34; src=&#34;/blog/2012/04/google-website-optimizer-introduction/image-2.png&#34; width=&#34;400&#34;/&gt;&lt;br/&gt;
&lt;small&gt;Example multivariate test result in Google Website Optimizer&lt;/small&gt;&lt;/p&gt;
&lt;h3 id=&#34;a-limitation-with-multivariate-testing&#34;&gt;A Limitation with Multivariate Testing&lt;/h3&gt;
&lt;p&gt;One thing we wanted to test was a site-wide CSS change. Unfortunately, the multivariate testing in place is designed to test on page content only rather than global CSS changes. You could potentially come up with a “creative” hack and set a cookie inside the variation to specify which layout option you would use. And then the page would always look at that cookie while rendering to apply the special CSS behavior. However, this requires a bit of customization and development.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>A comparison of Jaspersoft iReport and Pentaho Reporting</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2011/10/comparison-of-jaspersoft-ireport-and/"/>
      <id>https://www.endpointdev.com/blog/2011/10/comparison-of-jaspersoft-ireport-and/</id>
      <published>2011-10-02T00:00:00+00:00</published>
      <author>
        <name>Josh Tolley</name>
      </author>
      <content type="html">
        &lt;p&gt;I’ve recently been involved in reporting projects using both &lt;a href=&#34;https://community.jaspersoft.com/project/ireport-designer&#34;&gt;Jaspersoft’s iReport&lt;/a&gt; and &lt;a href=&#34;https://community.hitachivantara.com/docs/DOC-1009856&#34;&gt;Pentaho’s Reporting&lt;/a&gt;, so this seemed a good opportunity to compare the two. Both are Java-based, open source reporting systems which claim to build “pixel-perfect” documents (“pixel-perfect” means that when you put something somewhere on a report design, it doesn’t move around. That this isn’t taken for granted is a rant for another time). I have more experience with Pentaho than with Jaspersoft, and once &lt;a href=&#34;/blog/2009/10/pentaho-reporting-35-for-java_28/&#34;&gt;reviewed a book&lt;/a&gt; on Pentaho; I’ll try to give the two a fair evaluation, but in the end I can’t promise my greater experience with Pentaho won’t affect my conclusions one way or the other. Both suites are available in open source and commercial flavors; I’ll consider only the open source versions here.&lt;/p&gt;
&lt;p&gt;First let me point out that &lt;a href=&#34;https://www.jaspersoft.com/&#34;&gt;Jaspersoft&lt;/a&gt; and &lt;a href=&#34;https://www.hitachivantara.com/go/pentaho.html?source=pentaho-redirect&#34;&gt;Pentaho&lt;/a&gt; both produce business intelligence software &lt;em&gt;suites&lt;/em&gt;. The two suites exist in both community (open source) and enterprise (commercial) forms, are well worth comparing in their entirety, but I’m focusing principally on the report builder component of each, because that’s where my recent experience has led me. These report builder packages allow users to build complex and visually interesting data-based documents from many different kinds of data sources. A “document” could be a simple form letter, an address book, or a complex dashboard of business metrics. In each case, users build documents by dragging and dropping various components into report “bands”, and then modifying components’ properties. “Bands” are horizontal sections of the page with different roles. The page header and footer bands, for instance, are (obviously) printed at the top and bottom of each page. “Detail” bands print once per row returned by the query that underlies the report. Both iReport and Pentaho Reporting will group and filter query results for you, if you want, and include header and footer bands for each group. Both products allow users to publish finished reports to a server where other users can view them, schedule them to run periodically, or modify them for new purposes, and both provide a Java-based reporting library to embed reporting in other applications.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/10/comparison-of-jaspersoft-ireport-and/image-0-big.png&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5666449473763820738&#34; src=&#34;/blog/2011/10/comparison-of-jaspersoft-ireport-and/image-0.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 205px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;ireport-query-dialog&#34;&gt;iReport Query Dialog&lt;/h3&gt;
&lt;p&gt;Reports in both products are based on queries. These queries may be SQL using JDBC data sources, or they can come from other more obscure data sources, such as &lt;a href=&#34;/blog/2009/07/mdx/&#34;&gt;MDX queries&lt;/a&gt;, XQuery, scripts in various languages, web services, and more. Both also provide a query editor, at least for SQL queries, and in fact, both use the same query editor. I’ve only used it rarely, and only in Pentaho; both products also allow users to type in queries free-form, which I much prefer. In Pentaho, the data source for the query is embedded in the report itself, in the form of a JDBC URL, a JNDI name, or something else appropriate for that data source, so if you publish the report to a server, you’re responsible for ensuring that JNDI name or JDBC URL or whatever makes sense on that server. Jasper, on the other hand, prompts the user with a list of available data sources when publishing a report to a server. Jasper’s method seems more friendly, but Pentaho’s choice may have its advantages here, because each report is self-contained, whereas Jasper’s reports have metadata outside the single report file to describe the associated data source.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/10/comparison-of-jaspersoft-ireport-and/image-1-big.png&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5666451561727159042&#34; src=&#34;/blog/2011/10/comparison-of-jaspersoft-ireport-and/image-1.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 262px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;the-pentaho-report-builder&#34;&gt;The Pentaho Report Builder&lt;/h3&gt;
&lt;p&gt;The component libraries available in each product are fairly similar. Users can select from basic drawing components such as lines and circles, static formatted text labels, and of course various numeric, textual, and date components to display query results. Both products also include complex charting components, to display visualizations of many different kinds. Though the charting functionality of both products, at least at the basic level I’ve used, is quite similar, I found iReport’s charting dialogs quite helpful for making complex charts much easier to create than they would otherwise be. In Pentaho, after adding a chart component the user can open a special properties window, but the window offers few clues beyond the usual tooltips and occasionally meaningful property names to help the user know what to do. In contrast, iReport describes many of the properties involved in clear language.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/10/comparison-of-jaspersoft-ireport-and/image-2-big.png&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5666452990293303922&#34; src=&#34;/blog/2011/10/comparison-of-jaspersoft-ireport-and/image-2.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 301px; height: 320px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;ireports-chart-selection-dialog&#34;&gt;iReport’s chart selection dialog&lt;/h3&gt;
&lt;p&gt;This brings me to the topic of documentation, which, in fact, I found lacking for both produts. Yes, these are open source projects, and yes, documentation isn’t always as fun to write as code, so yes, open source projects &lt;em&gt;sometimes&lt;/em&gt; end up with lousy documentation. The enterprise versions come with documentation in one form or another, and there are several books published on the different suites’ components, including reporting. But the documentation available free-of-charge on the web left me unimpressed. Here Pentaho was particularly frustrating, largely because Pentaho’s reporting has changed a great deal from version to version, especially with its 3.5 release a couple years ago, so much of the help available in forums and wikis is completely out of date. Jasper documentation was more difficult to find, in general, but more accurate and up-to-date when I found it.&lt;/p&gt;
&lt;p&gt;Both products save their results in fairly comprehensible formats, which is helpful if you ever need to modify them by hand, without the help of the report building tool. iReport’s files are in a single XML file; Pentaho creates a ZIP-ed archive of several XML files. That fact has come in quite handy several times, both with Pentaho and with iReport, typically because it’s faster for me to edit XML by hand than click on each of 20 components and tweak properties one-by-one, because (in Pentaho) I needed to modify a data source, or because the tool failed to figure out what columns to expect from a query and I wanted to enter them manually.&lt;/p&gt;
&lt;p&gt;One major difference between the two products stems from what is available in their open source “community editions”. Jasper looks a bit more polished to me, the documentation is somewhat more consistent, and its selection of sample reports and sample code is more comprehensive—​but the community edition does little more than support iReport. Pentaho’s community edition, in addition to the reporting functions I’ve discussed, also offers ad-hoc web based reporting and a powerful MDX analysis package. Jaspersoft offers those features only in its enterprise edition. That may not be a big deal in some places, but it is the deciding factor in others. Having access to Pentaho’s code has made possible a number of things we certainly couldn’t have done otherwise.&lt;/p&gt;
&lt;p&gt;I’ve been trying to keep this “a comparison” of Pentaho Reporting and iReport, rather than a “showdown” or “shootout” or even “Jasper vs. Pentaho”, but at some point, conclusions must be drawn. I’ll draw here somewhat on evidence not mentioned above, because, well, the post was getting a bit long as it was, and I didn’t want to describe &lt;em&gt;everything&lt;/em&gt;. I admit to liking iReport’s interface better, because to me it seems to make better use of screen real estate. Google was much better able to answer questions for iReport than for Pentaho. But, although both products sometimes seem to make simple things hard, Pentaho seemed to do this less than iReport, and the various magic incantations I needed to get things working were fewer in Pentaho. In the end, the much greater capability of Pentaho’s open source offering over Jaspersoft’s clinches it for me. I’ll take open source over closed any day.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>PostgreSQL log analysis / PGSI</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2011/08/postgresql-log-analysis-pgsi/"/>
      <id>https://www.endpointdev.com/blog/2011/08/postgresql-log-analysis-pgsi/</id>
      <published>2011-08-19T00:00:00+00:00</published>
      <author>
        <name>Greg Sabino Mullane</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;a href=&#34;/blog/2011/08/postgresql-log-analysis-pgsi/image-0-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5642400584741062274&#34; src=&#34;/blog/2011/08/postgresql-log-analysis-pgsi/image-0.jpeg&#34; style=&#34;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 221px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Image by &lt;a href=&#34;https://www.flickr.com/photos/exfordy/&#34;&gt;“exfordy” on Flickr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;End Point recently started working with a new client (a startup in &lt;a href=&#34;https://en.wikipedia.org/wiki/Stealth_mode&#34;&gt;stealth mode&lt;/a&gt;, cannot name names, etc.) who is using &lt;a href=&#34;https://www.postgresql.org/&#34;&gt;PostgreSQL&lt;/a&gt; because of the great success some of the people starting the company have had with Postgres in previous companies. One of the things we recommend to our clients is a regular look at the database to see where the bottlenecks are. A good way to do this is by analyzing the logs. The two main tools for doing so are &lt;a href=&#34;https://bucardo.org/Pgsi/&#34;&gt;PGSI&lt;/a&gt; (Postgres System Impact) and &lt;a href=&#34;http://pgfoundry.org/projects/pgfouine/&#34;&gt;pgfouine&lt;/a&gt;. We prefer PGSI for a few reasons: the output is better, it considers more factors, and it does not require you to munge &lt;a href=&#34;https://www.postgresql.org/docs/9.0/static/runtime-config-logging.html#GUC-LOG-LINE-PREFIX&#34;&gt;your log_line_prefix&lt;/a&gt; setting quite as badly.&lt;/p&gt;
&lt;p&gt;Both programs work basically the same: given a large number of log lines from Postgres, normalize the queries, see how long they took, and produce some pretty output.If you only want to look at the longest queries, it’s usually enough to set your log_min_duration_statement to something sane (such as 200), and then run a daily &lt;a href=&#34;https://bucardo.org/tail_n_mail/&#34;&gt;tail_n_mail&lt;/a&gt; job against it. This is what we are doing with this client, and it sends a daily report that looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date: Mon Aug 29 11:22:33 2011 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host: acme-postgres-1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Minimum duration: 2000 ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Matches from /var/log/pg_log/postgres-2011-08-29.log: 7
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[1] (from line 227)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2011-08-29 08:36:50 UTC postgres@maindb [25198]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LOG: duration: 276945.482 ms statement: COPY public.sales 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(id, name, region, item, quantity) TO stdout;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[2] (from line 729)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2011-08-29 21:29:18 UTC tony@quadrant [17176]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LOG: duration: 8229.237 ms execute dbdpg_p29855_1: SELECT 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;id, singer, track FROM album JOIN artist ON artist.id = 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;album.singer WHERE id &amp;lt; 1000 AND track &amp;lt;&amp;gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, the PGSI program was born of the need to look at &lt;em&gt;&lt;strong&gt;all&lt;/strong&gt;&lt;/em&gt; the queries in the database, not just the slowest-running ones; the cumulative effect of many short queries can have much more of an impact on the server than a smaller number of long-running queries. Thus, PGSI looks not only at how long a query takes to run, but how many times it has run in a certain period, as well as how often it runs. All of this information is put together to give a score to each normalized query, known as the “system impact”. Like the costs on a Postgres explain plan, this is a unit-less number and of little importance in and of itself—​the important thing is to compare it to the other queries to see the relative impact. We also have that report emailed out, it looks similar to this (this is a text version of the HTML produced):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Log file: /var/log/pg_log/postgres-2011-08-29.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * SELECT (24)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * UPDATE (1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Query System Impact : SELECT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Log activity from 2011-08-29 11:00:01 to 2011-08-29 11:15:01
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   +----------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |   System Impact: | 0.15          |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |   Mean Duration: | 1230.95 ms    |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   | Median Duration: | 1224.70 ms    |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |     Total Count: | 411           |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |   Mean Interval: | 4195 seconds  |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |  Std. Deviation: | 126.01 ms     |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   +---------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; SELECT *
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  FROM albums
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  WHERE track &amp;lt;&amp;gt; ? AND artist = ?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ORDER BY artist, track&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point you may be wondering how we get all the queries into the log. This is done by setting log_min_duration_statement to 0. However, most (but not all!) clients do not want full logging 24 hours a day, as this creates some very large log files. So the solution we use is to analyze a slice of the day, only. It depends on the client, but we try for about 15 minutes during a busy time of day. Thus, the sequence of events is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Turn on “full logging” by dropping log_min_duration_statement to zero1. Some time later, set log_min_duration_statement back to what it was (e.g. 200)1. Extract the logs from the time it was set to zero to when it was flipped back.1. Run PGSI against the log subsection we pulled out1. Mail the results out&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of this is run by cron. The first problem is how to update the postgresql.conf file and have Postgres re-read it, all automatically. As &lt;a href=&#34;/blog/2011/08/changing-postgresqlconf-from-script/&#34;&gt;covered previously&lt;/a&gt;, we use the &lt;a href=&#34;https://github.com/bucardo/modify_postgres_config&#34;&gt;modify_postgres.pl&lt;/a&gt; script for this.&lt;/p&gt;
&lt;p&gt;The exact incantation looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0 11 * * * perl bin/modify_postgres_conf --quiet \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --pgconf /etc/postgresql/9.0/main/postgresql.conf \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --change log_min_duration_statement=0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;15 11 * * * perl bin/modify_postgres_conf --quiet \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --pgconf /etc/postgresql/9.0/main/postgresql.conf \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --change log_min_duration_statement=200 --no-comment
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## The above are both one line each, but split for readability here&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This changes log_min_duration_statement to 0 at 11AM, and then back to 200 15 minutes later. We use the &amp;ndash;quiet argument as this is run from cron so we don’t want any output from modify_postgres_conf on success. We do want a comment when we flip it to 0, as this is the temporary state and we want people viewing the postgresql.conf file at that time to realize it (or someone just doing a “git diff”). We don’t want a comment when we flip it back, as the timestamp in the comment would cause git to think the file had changed.&lt;/p&gt;
&lt;p&gt;Now for the tricky bit: extracting out just the section of logs that we want and sending it to PGSI. Here’s the recipe I came up with for this client:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;16 11 * * * tac `ls -1rt /var/log/pg_log/postgres*log \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  | tail -1` \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  | sed -n &amp;#39;/statement&amp;#34; changed to &amp;#34;200&amp;#34;/,/statement&amp;#34; changed to &amp;#34;0&amp;#34;/ p&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  | tac \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  | bin/pgsi.pl --quiet &amp;gt; tmp/pgsi.html &amp;amp;&amp;amp; bin/send_pgsi.pl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## Again, the above is all one line&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What does this do? First, it finds the latest file in the /var/log/pg_log directory that starts with ‘postgres’ and ends with ‘log’. Then it uses the &lt;strong&gt;tac&lt;/strong&gt; program to spool the file backwards, one line at a time (‘tac’ is the opposite of ‘cat’). Then it pipes &lt;em&gt;that&lt;/em&gt; output to the &lt;strong&gt;sed&lt;/strong&gt; program, which prints out all lines starting with the one where we changed the log_min_duration_statement to 200, and ending with the one where we changed it to 0 (the reverse of what we actually did, as we are reading it backwards). Finally, we use tac again to put the lines back in the correct order, pipe the output to &lt;strong&gt;pgsi&lt;/strong&gt;, write the output to a temporary file, and then call a quick Perl script named &lt;strong&gt;send_pgsi.pl&lt;/strong&gt; which mails the temporary HTML file to some interested parties.&lt;/p&gt;
&lt;p&gt;Why do we use tac? Because we want to read the file backwards, so as to make sure we get the correct slice of log files as delimited by the log_min_duration_statement changes. If we simply started at the beginning of the file, we might encounter other similar changes that were made earlier and not by us.&lt;/p&gt;
&lt;p&gt;All of this is not foolproof, of course, but it does not have to be, as it is very easy to run manually is something (for example the sed recipe) goes wrong, as the log file will still be there. Yes, it’s also possible to grab the ranges in other ways (such as perl), but I find sed the quickest and easiest. As tempting as it was to write Yet Another Perl Script to extract the lines, sometimes a few chained Unix programs can do the job quite nicely.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Virtual Page Tracking and Goals with Google Analytics</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2011/04/virtual-page-tracking-google-analytics/"/>
      <id>https://www.endpointdev.com/blog/2011/04/virtual-page-tracking-google-analytics/</id>
      <published>2011-04-06T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;Sometimes I come across websites that don’t use RESTful URLs or have too unique (with an order number) URLs during checkout and I need to implement Goal Tracking in Google Analytics on these user interactions. I’ve also had to implement Goal Tracking in a non-ecommerce web application where tabbed on-page browsing guides users through a 3-step process. Examples of situations that pose challenges to traditional page tracking in Google Analytics include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Throughout &lt;a href=&#34;/expertise/perl-interchange/&#34;&gt;Interchange’s&lt;/a&gt; checkout, URLs are posts to “/process”, which makes the user interactions difficult to distinguish.&lt;/li&gt;
&lt;li&gt;Throughout Spree’s checkout, URLs are posts to “/order/:id/edit”, which are distinct and can be difficult to aggregate.&lt;/li&gt;
&lt;li&gt;In a Sinatra application we developed recently, the single page URL is “/locate.html”, but tabbed browsing occurs through three unique steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;google-analytics-tagging&#34;&gt;Google Analytics Tagging&lt;/h3&gt;
&lt;p&gt;To add Goal Tracking by URL, pages must first be tagged as “virtual pages”. To implement virtual page tracking in Google, it’s as simple as including a new virtual page URL in the _trackPageview action:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script type=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; _gaq = _gaq || [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  _gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_setAccount&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;UA-XXXXXXXX-1&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- _gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_trackPageview&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+ _gaq.push([&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;_trackPageview&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/cart/basket&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; ga = &lt;span style=&#34;color:#038&#34;&gt;document&lt;/span&gt;.createElement(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;); ga.type = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;text/javascript&amp;#39;&lt;/span&gt;; ga.&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;async&lt;/span&gt; = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ga.src = (&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;https:&amp;#39;&lt;/span&gt; == &lt;span style=&#34;color:#038&#34;&gt;document&lt;/span&gt;.location.protocol ? &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;https://ssl&amp;#39;&lt;/span&gt; : &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;http://www&amp;#39;&lt;/span&gt;) + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;.google-analytics.com/ga.js&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; s = &lt;span style=&#34;color:#038&#34;&gt;document&lt;/span&gt;.getElementsByTagName(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;)[&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;0&lt;/span&gt;]; s.parentNode.insertBefore(ga, s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  })();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the cases I described above, here are the tags used for each:&lt;/p&gt;
&lt;table cellpadding=&#34;10&#34; cellspacing=&#34;0&#34; width=&#34;100%&#34;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Interchange&lt;/td&gt;
&lt;td&gt;Spree&lt;/td&gt;
&lt;td&gt;Sinatra App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&#34;top&#34;&gt;
On a three page checkout process, the following virtual pages were tagged:
&lt;ul&gt;
&lt;li&gt;Shopping Basket: /cart/basket&lt;/li&gt;
&lt;li&gt;Checkout: /cart/checkout&lt;/li&gt;
&lt;li&gt;Receipt: /cart/receipt&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign=&#34;top&#34;&gt;
On a multi-page checkout process, the following virtual pages were tagged:
&lt;ul&gt;
&lt;li&gt;Shopping Basket: /checkout/cart&lt;/li&gt;
&lt;li&gt;Registration (optional): /checkout/register&lt;/li&gt;
&lt;li&gt;Address: /checkout/address&lt;/li&gt;
&lt;li&gt;Delivery: /checkout/delivery&lt;/li&gt;
&lt;li&gt;Payment: /checkout/payment&lt;/li&gt;
&lt;li&gt;Confirm: /checkout/confirm&lt;/li&gt;
&lt;li&gt;Receipt: /checkout/complete&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td valign=&#34;top&#34;&gt;
On a three page process, the following virtual pages were tagged:
&lt;ul&gt;
&lt;li&gt;Step 1: /step1&lt;/li&gt;
&lt;li&gt;Step 2: /step2&lt;/li&gt;
&lt;li&gt;Step 3: /step3&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&#34;goal-definition&#34;&gt;Goal Definition&lt;/h3&gt;
&lt;p&gt;After tagging is complete, you’ll need to define a Goal in Google Analytics to begin tracking it.&lt;/p&gt;
&lt;table cellpadding=&#34;0&#34; cellspacing=&#34;0&#34; width=&#34;100%&#34;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td valign=&#34;top&#34;&gt;
&lt;a href=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-0-big.png&#34; target=&#34;_blank&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5592479390319049522&#34; src=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-0.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 430px;&#34;/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td style=&#34;padding-left:10px;&#34; valign=&#34;top&#34;&gt;
&lt;p&gt;First, you’ll want to name your goal. Here I’ve named the goal “Purchase”. In this case, the Goal is a URL Destination based on our new tags.&lt;/p&gt;
&lt;p&gt;The Goal URL is set to “/checkout/complete” for the Spree example described above. In this case, I have it set to a Regular Expression Match, but an Exact Match will work as well. I haven’t assigned a Goal Value and I’ve left the match case insensitive for now.&lt;/p&gt;
&lt;p&gt;Next, I add the steps involved leading up to the goal URL. This will allow you to visualize a goal funnel and see where users may be abandoning checkout. In this example, each of the steps of the funnel correspond to a checkout step (shopping basket, optional register page, individual checkout steps, receipt/complete page).&lt;/p&gt;
&lt;p&gt;Note that this screenshot was taken from the new Google Analytics interface. The old Google Analytics interface may appear slightly different, but contains similar content.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&#34;looking-at-the-data&#34;&gt;Looking at the Data&lt;/h3&gt;
&lt;p&gt;With virtual page tracking and goal tracking, you can see how many goals have been completed during a certain time frame:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-1-big.png&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5592103553131530306&#34; src=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-1.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 750px; height: 217px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also compare regular segments of traffic: e.g. users that found your site through search versus referrals:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-2-big.png&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5592103554605643474&#34; src=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-2.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 750px; height: 287px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can compare advanced segments of visitors: e.g. marketing campaign #1 versus marketing campaign #2. This type of comparison may give you more actionable metrics to determine which marketing campaign to put more resources into.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-3-big.png&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5592103553415454706&#34; src=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-3.png&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 750px; height: 289px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last but not least, you can visualize the funnel of conversion to see where you might be losing customers. This might also be actionable in that you may be able to A/B test checkout process (or another type of conversion) changes to improve conversion.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-4-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5592478865317278466&#34; src=&#34;/blog/2011/04/virtual-page-tracking-google-analytics/image-4.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 750px; height: 548px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Referral Tracking with Google Analytics</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2011/03/referral-tracking-google-analytics/"/>
      <id>https://www.endpointdev.com/blog/2011/03/referral-tracking-google-analytics/</id>
      <published>2011-03-25T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-0-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588025431694738370&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-0.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 98px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s pretty easy to use Google Analytics to examine referral traffic, including using custom referral tracking codes. Here’s how:&lt;/p&gt;
&lt;p&gt;Once you have referrers or affiliates that plan to link to your site, you can ask that those affiliates append a unique tracking ID to the end of the URL. For example, I’ll use the following referral ID’s to track metrics from Milton and Roger’s websites to End Point’s site.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.endpoint.com/?ref=milton&#34;&gt;http://www.endpoint.com/?ref=milton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.endpoint.com/?ref=roger&#34;&gt;http://www.endpoint.com/?ref=roger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After you’ve seen some traffic build up from those affiliates, you must create two Custom Advanced Segments in Google Analytics:&lt;/p&gt;
&lt;table cellpadding=&#34;0&#34; cellspacing=&#34;0&#34; width=&#34;100%&#34;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td valign=&#34;bottom&#34;&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-1-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588030206055790546&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-1.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 229px; height: 400px;&#34;/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td valign=&#34;bottom&#34;&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-2-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588025427517347346&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-2.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 192px;&#34;/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34; valign=&#34;top&#34;&gt;Follow the link to create an Advanced Segment.&lt;/td&gt;
&lt;td align=&#34;center&#34; valign=&#34;top&#34;&gt;The New Advanced Segment page.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Once you’ve landed on the New Advanced Segment page, you create a custom segment by dragging “Landing Page” from the “Content” tab to define the criteria, and set it to contains your unique referral identifier.&lt;/p&gt;
&lt;table cellpadding=&#34;0&#34; cellspacing=&#34;0&#34; width=&#34;100%&#34;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-3-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588027705314505746&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-3.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 289px;&#34;/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-4-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588027702483872770&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-4.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 289px;&#34;/&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;Roger’s Referral Traffic&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;Milton’s Referral Traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;That’s it! You now have custom Advanced Segments defined to track referral or affiliate data. You can select the Advanced Segments from any metrics page:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-5-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588034647905335026&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-5.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 111px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All traffic compared to referral traffic from Milton and Roger’s sites.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-6-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588028227247239538&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-6.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 93px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Traffic from Milton’s website only.&lt;/p&gt;
&lt;p&gt;You can also examine conversion driven from the affiliate. For example, how does conversion driven by one affiliate compare to the entire site’s conversion? On our site, conversion is measured by contact form submission — but on ecommerce sites, you can measure conversion in the form of purchases relative to different affiliates.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/blog/2011/03/referral-tracking-google-analytics/image-7-big.jpeg&#34; onblur=&#34;try {parent.deselectBloggerImageGracefully();} catch(e) {}&#34;&gt;&lt;img alt=&#34;&#34; border=&#34;0&#34; id=&#34;BLOGGER_PHOTO_ID_5588028222680855938&#34; src=&#34;/blog/2011/03/referral-tracking-google-analytics/image-7.jpeg&#34; style=&#34;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 94px;&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Roger’s Referral conversion versus conversion of the entire site. Roger’s doing pretty good!&lt;/p&gt;
&lt;p&gt;One potential disadvantage to this method for affiliate tracking is that you are creating duplicate content in Google by introducing additional URLs. You may want to use the &lt;a href=&#34;/blog/2009/12/content-syndication-seo-rel-canonical/&#34;&gt;rel=&amp;ldquo;canonical&amp;rdquo;&lt;/a&gt; tag on the homepage to minimize duplicate content in search engine indexes. A very similar alternative to this method to bypass adding a referral ID would be to create custom segments defined by Source and Referral Path, however, the method described in this article is valuable for sites that may have a redirect between the referral site and the landing URL (&lt;a href=&#34;http://www.miltonsblog.com/&#34;&gt;http://www.miltonsblog.com/&lt;/a&gt; links to &lt;a href=&#34;http://www.endpointcorp.com/?ref=milton&#34;&gt;http://www.endpointcorp.com/?ref=milton&lt;/a&gt; redirects to &lt;a href=&#34;http://www.endpoint.com/?ref=milton&#34;&gt;http://www.endpoint.com/?ref=milton&lt;/a&gt; retains the referral information).&lt;/p&gt;
&lt;p&gt;Google Analytics is a great tool that allows you to measure analytics such as the ones shown in this post. It’s fairly standard for our all of our clients to request Google Analytics installation. &lt;a href=&#34;https://analytics.googleblog.com/2011/03/looking-towards-future-of-google.html&#34;&gt;Google announced last week&lt;/a&gt; that a new Google Analytics platform will be rolled out soon, which includes a feature update to multiple segments that will allow us to examine traffic from multiple affiliates without showing “All Visits”.&lt;/p&gt;
&lt;p&gt;Note that the data presented in this article is fictitious.
I don’t think Milton and Roger will be linking to End Point’s site any time soon!&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>In Our Own Words</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2011/02/in-our-own-words/"/>
      <id>https://www.endpointdev.com/blog/2011/02/in-our-own-words/</id>
      <published>2011-02-02T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;What do our words say about us?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2011/02/in-our-own-words/image-0.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Recently, I came across &lt;a href=&#34;https://web.archive.org/web/20110202003216/http://www.wordle.net/&#34;&gt;Wordle&lt;/a&gt;, a Java-based Google App Engine application that generates word clouds from websites and raw text. I wrote a cute little rake task to grab text from our blog to plug into Wordle. The rake task grabs the blog contents, uses REXML for parsing, and then lowercases the results. The task also applies a bit of aliasing since we use postgres, postgreSQL and pg interchangeably in our blog.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:wordle&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:environment&lt;/span&gt; &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   data = &lt;span style=&#34;color:#038&#34;&gt;open&lt;/span&gt;(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;http://blog.endpoint.com/feeds/posts/default?alt=rss&amp;amp;max-results=999&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Ruby-Wget&amp;#39;&lt;/span&gt;).read
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   doc = &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;REXML&lt;/span&gt;::&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Document&lt;/span&gt;.new(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   text = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   doc.root.each_element(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;//item&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;do&lt;/span&gt; |item|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     text += item.elements[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;].text.gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/&amp;lt;\/?[^&amp;gt;]*&amp;gt;/&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     text += item.elements[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;title&amp;#39;&lt;/span&gt;].text.gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/&amp;lt;\/?[^&amp;gt;]*&amp;gt;/&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) + &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   text = text.downcase \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     .gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/\./&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;)   \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     .gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/^\n/&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)   \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     .gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/ postgres /&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; postgresql &amp;#39;&lt;/span&gt;) \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     .gsub(&lt;span style=&#34;color:#080;background-color:#fff0ff&#34;&gt;/ pg /&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; postgresql &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   file = &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;File&lt;/span&gt;.new(&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;ENV&lt;/span&gt;[&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;], &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   file.puts text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   file.close
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So, you tell me: Do you think we write like engineers? How well does this word cloud represent our skillset?&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>New Year Bug Bites</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2011/01/new-year-bug-bites/"/>
      <id>https://www.endpointdev.com/blog/2011/01/new-year-bug-bites/</id>
      <published>2011-01-06T00:00:00+00:00</published>
      <author>
        <name>Benjamin Goldstein</name>
      </author>
      <content type="html">
        &lt;p&gt;Happy New Year! And what would a new year be without a new year bug bite? This year we had one where figuring out the species wasn’t easy.&lt;/p&gt;
&lt;p&gt;On January 2nd one of our ecommerce clients reported that starting with the new year a number of customers weren’t able to complete their web orders because of credit card security code failures. Looking in the Interchange server error logs we indeed found a significant spike in the number of CVV2 code verification failures (Payflow Pro gateway error code “114”) starting January 1st.&lt;/p&gt;
&lt;p&gt;We hadn’t made any programming or configuration changes on the system in the recent days. We double-checked to make sure: nope, no code changes. So it had to be a New Year’s bug and presumably something with the Payflow Pro gateway or banks further upstream. We checked error logs for other customers to see if they were being similarly impacted, but they weren’t. Our client contacted PayPal (the vendor for Payflow Pro) and they reported there were no problems with their system. The failures must indeed be card failures or a problem with the website according to them. We further checked our code looking for what we could possibly have done that might be the cause, double-checking our Git repository (which showed no recent changes) and reexamining our checkout code for possible year-based logic flaws.&lt;/p&gt;
&lt;p&gt;Our client’s top-notch customer service group got on the phone with a customer who’d gotten a security code failure and got PayPal tech support on another line. The customer service rep tried to place the customer’s order on the website using the customer’s credit card info and once again got the CVV2 error. She then did the credit card transaction using the swipe machine in the office, and lo and behold the order went through! What was going on??!&lt;/p&gt;
&lt;p&gt;It turned out that despite the Payflow Pro gateway returning CVV2 verification errors what was really happening was that the year of the credit card was coming into the Payflow Pro gateway as “2012”—not as “2011” as entered into the checkout form. We knew all along that it was possible that the 114 error code responses were possibly misleading because payment gateway error codes are notorious this way. (Payment gateways blame the banks, saying they can only pass along what the banks give them. Some banks’ credit card validations don’t actually even care about the years being correct, but just that they not be in the past; but I digress&amp;hellip;)&lt;/p&gt;
&lt;p&gt;Previously we’d reviewed the checkout pages and the dropdown menus to verify that the dropdown menus weren’t off, but nevertheless it very much sounded like this rather stupid problem could very well be the culprit. So we checked and checked again. What we found is that &lt;em&gt;&lt;strong&gt;sometimes&lt;/strong&gt;&lt;/em&gt; on the checkout form the year dropdown menu was mangled such that the values associated with the displayed years were YYYY+1.&lt;/p&gt;
&lt;p&gt;The oddly intermittent behavior of the problem, the process of elimination and the all around hair pulling this loss of business was causing made somebody in the marketing group at our client realize that they are in fact still running an Omniture Test &amp;amp; Target A/B test on the checkout pages that they thought had been discontinued. To quote David Christensen (thanks, David!): “The Omniture system works by replacing select content for randomly chosen users in an effort to track user behavior/response to proposed site changes. Alternate site content is created and dynamically replaced for these users as they use the site, such as the specific content on the checkout page in this instance.”&lt;/p&gt;
&lt;p&gt;We verified that the Omniture A/B test’s JavaScript replacement code was alternately mangling and not mangling the year dropdown on the checkout form as mentioned. Our client took out the A/B test and the “security code errors” dropped back to a normal low level.&lt;/p&gt;
&lt;p&gt;This was a difficult and expensive problem—not only was there business lost because of the problem, but there were a lot of resources put into troubleshooting it. We’ve come away from this episode with some lessons learned and with plenty of food for thought. I’ll leave it to commentators to opine away on this, including the End Point folks who scratched this itch: &lt;a href=&#34;/blog/authors/david-christensen/&#34;&gt;David Christensen&lt;/a&gt;, Jeff Boes, &lt;a href=&#34;/team/mark-johnson/&#34;&gt;Mark Johnson&lt;/a&gt;, and &lt;a href=&#34;/team/jon-jensen/&#34;&gt;Jon Jensen&lt;/a&gt;.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>More Code and SEO with the Google Analytics API</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2010/02/code-seo-google-analytics-api/"/>
      <id>https://www.endpointdev.com/blog/2010/02/code-seo-google-analytics-api/</id>
      <published>2010-02-22T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;My latest blog article inspiration came from an &lt;a href=&#34;https://moz.com/&#34;&gt;SEOmoz&lt;/a&gt; pro webinar on Actionable Analytics. This time around, I wrote the article and it was published on SEOmoz’s YOUmoz Blog and I thought I’d summarize and extend the article here with some technical details more appealing to our audience. The article is titled &lt;a href=&#34;https://moz.com/ugc/visualizing-keyword-data-with-the-google-analytics-api&#34;&gt;Visualizing Keyword Data with the Google Analytics API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the article, I discuss and show examples of how the number of unique keywords receiving search traffic has diversified or expanded over time and that our SEO efforts (including writing blog articles) are likely resulting in this diversification of keywords. Some snapshots from the articles:&lt;/p&gt;
&lt;img src=&#34;/blog/2010/02/code-seo-google-analytics-api/image-0.png&#34; /&gt;
&lt;img src=&#34;/blog/2010/02/code-seo-google-analytics-api/image-1.png&#34; /&gt;
&lt;p&gt;[The unique keyword (keywords receiving at least one search visit) count per month (top) compared to the number of articles available on our blog at that time (bottom).]&lt;/p&gt;
&lt;p&gt;I also briefly examined how unique keywords receiving at least one visit overlapped between each month and saw about 10-20% of overlapping keywords (likely the short-tail of SEO).&lt;/p&gt;
&lt;img src=&#34;/blog/2010/02/code-seo-google-analytics-api/image-2.png&#34; /&gt;
&lt;p&gt;[The keyword overlap per month, where the keywords receiving at least one visit in consecutive months are shown in the overlap section.]&lt;/p&gt;
&lt;p&gt;Now, on to things that End Point’s audience may find more interesting. Something that might appeal more to our developer-types is the code written to use the Google Analytics API to generate the data used for this article. I researched a bit and tried writing my own ruby code (gem-less) to pull from the Google API, followed by using the Gattica gem, and finally the garb gem. After wrestling with the former two options, I settled on the &lt;a href=&#34;https://github.com/vigetlabs/garb&#34;&gt;garb&lt;/a&gt; gem, which had decent documentation &lt;a href=&#34;https://github.com/vigetlabs/garb/wiki&#34;&gt;here&lt;/a&gt; to get me up and running with a Google Analytics report quickly. Here’s an example of the code required to create your first Google Analytics API report:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;#!/usr/bin/ruby&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#038&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#038&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;garb&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# set email, password, profile_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Garb&lt;/span&gt;::&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Session&lt;/span&gt;.login(email, password)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;profile = &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Garb&lt;/span&gt;::&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Profile&lt;/span&gt;.first(profile_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;report = &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Garb&lt;/span&gt;::&lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Report&lt;/span&gt;.new(profile,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:limit&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:start_date&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Date&lt;/span&gt;.today - &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;30&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:end_date&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#036;font-weight:bold&#34;&gt;Date&lt;/span&gt;.today)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;report.dimensions &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:keyword&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;report.metrics &lt;span style=&#34;color:#a60;background-color:#fff0f0&#34;&gt;:visits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;report.results.each &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;do&lt;/span&gt; |result|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#038&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;#{&lt;/span&gt;result.keyword&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;#{&lt;/span&gt;result.visits&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you aren’t familiar with the Google Analtyics API, possible dimensions and metrics are documented &lt;a href=&#34;https://developers.google.com/analytics/devguides/reporting/core/dimsmets&#34;&gt;here&lt;/a&gt;. There are some Google Analytics API limitations on metric and dimension combinations, but I think if you get creative you’d be able to overcome most of those limitations (assuming you won’t be exceeding the limit of 1,000 API requests per day).&lt;/p&gt;
&lt;p&gt;Why should you care about the Google Analytics API? Well, the API allowed me to programmatically aggregate the keyword counts in monthly increments for the SEOmoz article. One thing I consider to be pretty lame is the inability to select more than 3 custom segments and exclude the “All Visits” segment to allow a better visual comparison of the segments. In the data below, I have 3 defined custom segments. I would prefer to compare about 10 custom segments of End Point’s blog keyword groupings (e.g., “Rails Keywords”, “Postgres Keywords”), but Google Analytics limits the selected segments and includes “All Visits” when you select more than one custom segment.&lt;/p&gt;
&lt;img src=&#34;/blog/2010/02/code-seo-google-analytics-api/image-3.png&#34; /&gt;
&lt;p&gt;Another thing I consider to be lame is the inability to merge Google Analytics profiles. Recently, End Point combined its corporate blog GA profile with its main website GA profile to better track conversion between the sites:&lt;/p&gt;
&lt;img src=&#34;/blog/2010/02/code-seo-google-analytics-api/image-4.png&#34; /&gt;
&lt;p&gt;[Dead metrics from migrated profile.]&lt;/p&gt;
&lt;p&gt;With the Google Analytics API, we could compute different aggregates of data, compare more than a few custom data segments, and combine two google profiles if they have merged. Of course, these things wouldn’t necessarily be easy, but working with the gem proved to be simple, so in theory this all could be done and in the meantime we’ll keep our dead profile around.&lt;/p&gt;
&lt;p&gt;Again, please read the original article &lt;a href=&#34;https://moz.com/ugc/visualizing-keyword-data-with-the-google-analytics-api&#34;&gt;here&lt;/a&gt; if you are interested. :)&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Safari 4 Top Sites feature skews analytics</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2010/02/safari-4-top-sites-google-analytics/"/>
      <id>https://www.endpointdev.com/blog/2010/02/safari-4-top-sites-google-analytics/</id>
      <published>2010-02-13T00:00:00+00:00</published>
      <author>
        <name>Jon Jensen</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;a href=&#34;https://www.apple.com/safari/&#34;&gt;Safari&lt;/a&gt; version 4 has a new “Top Sites” feature that shows thumbnail images of the sites the user most frequently visits (or, until enough history is collected, just generally popular sites).&lt;/p&gt;
&lt;p&gt;Martin Sutherland describes this feature in details and shows &lt;a href=&#34;https://web.archive.org/web/20100316231239/http://www.sunpig.com/martin/archives/2010/01/08/how-to-detect-a-page-request-from-safari-4s-top-sites-feature.html&#34;&gt;how to detect these requests&lt;/a&gt;, which set the X-Purpose HTTP header to “preview”.&lt;/p&gt;
&lt;p&gt;The reason this matters is that Safari uses its normal browsing engine to fetch not just the HTML, but all embedded JavaScript and images, and runs in-page client JavaScript code. And these preview thumbnails are refreshed fairly frequently—​possibly several times per day per user.&lt;/p&gt;
&lt;p&gt;Thus every preview request looks just like a regular user visit, and this skews analytics which see a much higher than average number of views from Safari 4 users, with lower time-on-site averages and higher bounce rates since no subsequent visits are registered (at least as part of the preview function).&lt;/p&gt;
&lt;p&gt;The solution is to simply not output any analytics code when the X-Purpose header is set to “preview”. In &lt;a href=&#34;/expertise/perl-interchange/&#34;&gt;Interchange&lt;/a&gt; this is easily done if you have an include file for your analytics code, by wrapping the file with an [if] block such as this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[tmp x_purpose][env HTTP_X_PURPOSE][/tmp]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[if scratch x_purpose eq &amp;#39;preview&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;!-- skip analytics for browser previews --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[else]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(normal Google Analytics, Omniture SiteCatalyst, or other analytics code)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[/else]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[/if]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In &lt;a href=&#34;/expertise/ruby-on-rails/&#34;&gt;Ruby on Rails&lt;/a&gt; you’d check request.env[&amp;ldquo;HTTP_X_PURPOSE&amp;rdquo;].&lt;/p&gt;
&lt;p&gt;In PHP you’d check $_SERVER[&amp;ldquo;HTTP_X_PURPOSE&amp;rdquo;].&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;/expertise/django-python/&#34;&gt;Django&lt;/a&gt; you’d check request.META[&amp;ldquo;HTTP_X_PURPOSE&amp;rdquo;] or the equivalent request.META.get(&amp;ldquo;HTTP_X_PURPOSE&amp;rdquo;) (from the &lt;a href=&#34;https://docs.djangoproject.com/en/dev/ref/request-response/&#34;&gt;HttpRequest&lt;/a&gt; class).&lt;/p&gt;
&lt;p&gt;And so on.&lt;/p&gt;
&lt;p&gt;I confirmed the analytics tracking code was omitted by waiting for Safari to make its preview request and inspecting the response with the &lt;a href=&#34;https://www.telerik.com/download/fiddler&#34;&gt;Fiddler proxy&lt;/a&gt;, on Windows. The same can be done for Safari on Mac OS X with a suitable Mac OS X HTTP proxy.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>End Point Blogging Stats Year In Review</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2010/01/2009-end-point-blogging/"/>
      <id>https://www.endpointdev.com/blog/2010/01/2009-end-point-blogging/</id>
      <published>2010-01-04T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;Many of the blogs I follow recently published a list of most popular articles from 2009, so I thought we should too. End Point started the blog in July of 2008, and has since then backported our older technical articles and company news to the blog, which is why you may see older articles in the archives. In 2009, we published just over 150 articles.&lt;/p&gt;
&lt;p&gt;Here’s a breakdown of article categories (the categorization was a bit difficult: the “Tips, Community, Etc.” was a fallback category for any articles that didn’t have more than a few similar articles):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2010/01/2009-end-point-blogging/image-0.png&#34; style=&#34;margin: 0px auto 10px; display: block; text-align: center&#34;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In 2009, the top 10 articles with the highest number of unique visitors were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/07/git-push-know-your-refspecs/&#34;&gt;/blog/2008/07/git-push-know-your-refspecs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/11/10000-databases-on-postgresql-cluster/&#34;&gt;/blog/2008/11/10000-databases-on-postgresql-cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/02/slony1-200-postgresql-84devel/&#34;&gt;/blog/2009/02/slony1-200-postgresql-84devel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/01/slow-xen-virtualization-of-rhel-3-i386/&#34;&gt;/blog/2009/01/slow-xen-virtualization-of-rhel-3-i386&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/08/file-test-comparison-table-for-shell/&#34;&gt;/blog/2009/08/file-test-comparison-table-for-shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/12/mysql-and-postgres-command-equivalents/&#34;&gt;/blog/2009/12/mysql-and-postgres-command-equivalents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/08/switching-from-sendmail-to-postfix-on/&#34;&gt;/blog/2008/08/switching-from-sendmail-to-postfix-on&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/11/multiple-reverse-dns-pointers-per-ip/&#34;&gt;/blog/2008/11/multiple-reverse-dns-pointers-per-ip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/08/acts-as-xapian-it-just-works/&#34;&gt;/blog/2008/08/acts-as-xapian-it-just-works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/12/truecrypte-whole-disk-encryption-for/&#34;&gt;/blog/2008/12/truecrypte-whole-disk-encryption-for&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The top 10 “Top Pages”, according to a tool provided by &lt;a href=&#34;https://moz.com/&#34;&gt;SEOmoz&lt;/a&gt;, which is calculated using SEOmoz popularity metrics based on external links and quality of external linking pages to the url, are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/09/migrating-postgres-with-bucardo-4/&#34;&gt;/blog/2009/09/migrating-postgres-with-bucardo-4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/08/text-sequences/&#34;&gt;/blog/2009/08/text-sequences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/07/git-push-know-your-refspecs/&#34;&gt;/blog/2008/07/git-push-know-your-refspecs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/07/bucardo-and-truncate-triggers/&#34;&gt;/blog/2009/07/bucardo-and-truncate-triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/09/seo-external-links-and-pagerank/&#34;&gt;/blog/2009/09/seo-external-links-and-pagerank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/09/permission-denied-for-postgresqlconf/&#34;&gt;/blog/2009/09/permission-denied-for-postgresqlconf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/07/mdx/&#34;&gt;/blog/2009/07/mdx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/08/two-quick-tips-egrep-sql-dumps-vim-and/&#34;&gt;/blog/2009/08/two-quick-tips-egrep-sql-dumps-vim-and&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/07/slony-slstatus-and-diagnosing/&#34;&gt;/blog/2009/07/slony-slstatus-and-diagnosing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2009/08/perlpostgres-changes-in-dbdpg-2151/&#34;&gt;/blog/2009/08/perlpostgres-changes-in-dbdpg-2151&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It would probably be more interesting to normalize the data above by the total number of days published to get an idea of which articles were the most impacting. This is likely an example of normalization that search engines employ in popularity algorithms.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;lamest&lt;/strong&gt; articles, ordered by the number of unique visitors ascending, were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2005/06/death-taxes-and-spam/&#34;&gt;/blog/2005/06/death-taxes-and-spam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/02/dbdpg-200-released/&#34;&gt;/blog/2008/02/dbdpg-200-released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2005/08/end-point-celebrates-10-years-of/&#34;&gt;/blog/2005/08/end-point-celebrates-10-years-of&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/08/camps-presentation-at-utosc-2008/&#34;&gt;/blog/2008/08/camps-presentation-at-utosc-2008&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/06/railsconf-2008-report/&#34;&gt;/blog/2008/06/railsconf-2008-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/06/pgcon-2008-report/&#34;&gt;/blog/2008/06/pgcon-2008-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2006/06/review-practices-of-agile-developer/&#34;&gt;/blog/2006/06/review-practices-of-agile-developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2006/01/interchange-54-released/&#34;&gt;/blog/2006/01/interchange-54-released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2005/08/rowe-promotes-good-data-vpns/&#34;&gt;/blog/2005/08/rowe-promotes-good-data-vpns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Phew&lt;/strong&gt;—​none of my articles were on that list :)&lt;/p&gt;
&lt;p&gt;I should probably note that those aren’t really &lt;strong&gt;lame&lt;/strong&gt; articles. They likely didn’t get a ton of traffic because they were published around the time we started our blog that received little traffic at the time and because they probably weren’t marketed through social media as some of our recent blog articles have been.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But what does this all mean?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This past year, I’ve approached blogging as a sales or marketing tool to get traffic from potential clients or to inform existing clients of the variety of services we provide. So, I was interested in comparing traffic between our blog and main site. The graph below shows the total page views for the main site and blog:&lt;/p&gt;
&lt;img src=&#34;/blog/2010/01/2009-end-point-blogging/image-1.png&#34; style=&#34;margin: 0px auto 10px; display: block; text-align: center&#34;/&gt;
&lt;p&gt;And I was interested in looking at the amount of referral traffic (page views again) our main site receives from the blog:&lt;/p&gt;
&lt;img src=&#34;/blog/2010/01/2009-end-point-blogging/image-2.png&#34; style=&#34;margin: 0px auto 10px; display: block; text-align: center&#34;/&gt;
&lt;p&gt;It’s pretty cool that in the last few months, our blog traffic has been 2 to 3 times as much as our main web site. And also interesting that 1/4 to 1/3 of the referral traffic to our main site came from our blog in the last few months. Referral traffic makes up roughly one third of our main site traffic, so we get about 10% of total traffic from blog referral traffic—​which is fairly effective.&lt;/p&gt;
&lt;p&gt;There are many other metrics I’m interested in, specifically segmenting our traffic into categories similar to the blog categories in the pie chart above to examine which topics bring us the most traffic. I hope we continue to blog about topics that bring us unique (and converting) traffic. But I’ll save discussion of those metrics for another blog article, that hopefully won’t make the “2010 Lamest Blog Articles” list :)&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>WordPress Plugin for Omniture SiteCatalyst</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2009/11/wordpress-plugin-for-omniture/"/>
      <id>https://www.endpointdev.com/blog/2009/11/wordpress-plugin-for-omniture/</id>
      <published>2009-11-18T00:00:00+00:00</published>
      <author>
        <name>Steph Skardal</name>
      </author>
      <content type="html">
        &lt;p&gt;A couple of months ago, I integrated Omniture SiteCatalyst into an Interchange site for one of End Point’s clients, &lt;a href=&#34;https://www.citypass.com/&#34;&gt;CityPass&lt;/a&gt;. Shortly after, the client added a blog to their site, which is a standalone WordPress instance that runs separately from the Interchange ecommerce application. I was asked to add SiteCatalyst tracking to the blog.&lt;/p&gt;
&lt;p&gt;I’ve had some experience with WordPress plugin development, and I thought this was a great opportunity to develop a plugin to abstract the SiteCatalyst code from the WordPress theme. I was surprised that there were limited Omniture WordPress plugins available, so I’d like to share my experiences through a brief tutorial for building a WordPress plugin to integrate Omniture SiteCatalyst.&lt;/p&gt;
&lt;p&gt;First, I created the base wordpress file to append the code near the footer of the wordpress theme. This file must live in the ~/wp-content/plugins/ directory. I named the file omniture.php.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;?php &lt;span style=&#34;color:#888&#34;&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;    Plugin Name: SiteCatalyst for WordPress
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;    Plugin URI: https://www.endpointdev.com/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;    Version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;    Author: Steph Powell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;    */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#06b;font-weight:bold&#34;&gt;omniture_tag&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    add_action(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;wp_footer&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;omniture_tag&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c00;font-weight:bold&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the code above, the wp_footer is a specific WordPress hook that runs just before the &lt;/body&gt; tag. Next, I added the base Omniture code inside the omniture_tag function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#06b;font-weight:bold&#34;&gt;omniture_tag&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c00;font-weight:bold&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;lt;script type=&amp;#34;text/javascript&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;lt;!-- var s_account = &amp;#39;omniture_account_id&amp;#39;; --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;lt;script type=&amp;#34;text/javascript&amp;#34; src=&amp;#34;/path/to/s_code.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;lt;script type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;!--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.pageName=&amp;#39;&amp;#39; //page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.channel=&amp;#39;&amp;#39; //channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.pageType=&amp;#39;&amp;#39; //page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.prop1=&amp;#39;&amp;#39; //traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.prop2=&amp;#39;&amp;#39; //traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.prop3=&amp;#39;&amp;#39; //traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.prop4= &amp;#39;&amp;#39; //traffic variable 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.prop5= &amp;#39;&amp;#39; //traffic variable 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.campaign= &amp;#39;&amp;#39; //campaign variable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.state= &amp;#39;&amp;#39; //user state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.zip= &amp;#39;&amp;#39; //user zip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.events= &amp;#39;&amp;#39; //user events
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.products= &amp;#39;&amp;#39; //user products
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.purchaseID= &amp;#39;&amp;#39; //purchase ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.eVar1= &amp;#39;&amp;#39; //conversion variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.eVar2= &amp;#39;&amp;#39; //conversion variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.eVar3= &amp;#39;&amp;#39; //conversion variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.eVar4= &amp;#39;&amp;#39; //conversion variable 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.eVar5= &amp;#39;&amp;#39; //conversion variable 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;/************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;var s_code=s.t();if(s_code)document.write(s_code)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;--&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To test the footer hook, I activated the plugin in the WordPress admin. A blog refresh should yield the Omniture code (with no variables defined) near the &lt;/body&gt; tag of the source code.&lt;/p&gt;
&lt;p&gt;After verifying that the code was correctly appended near the footer in the source code, I determined how to track the WordPress traffic in SiteCatalyst. For our client, the traffic was to be divided into the home page, static page, articles, tag pages, category pages and archive pages. The Omniture variables pageName, channel, pageType, prop1, prop2, and prop3 were modified to track these pages. Existing WordPress functions is_home, is_page, is_single, is_category, is_tag, is_month, the_title, get_the_category, the_title, single_cat_title, single_tag_title, the_date were used.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script type=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;!--
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;if&lt;/span&gt;(is_home()) {    &lt;span style=&#34;color:#888&#34;&gt;//WordPress functionality to check if page is home page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$channel&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$pageType&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop1&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Blog Home&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;elseif&lt;/span&gt; (is_page()) {    &lt;span style=&#34;color:#888&#34;&gt;//WordPress functionality to check if page is static page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$channel&lt;/span&gt; = the_title(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageType&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop1&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Static Page&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;elseif&lt;/span&gt; (is_single()) { &lt;span style=&#34;color:#888&#34;&gt;//WordPress functionality to check if page is article
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$categories&lt;/span&gt; = get_the_category();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop2&lt;/span&gt; = the_title(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$channel&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$categories&lt;/span&gt;[&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;0&lt;/span&gt;]-&amp;gt;&lt;span style=&#34;color:#369&#34;&gt;name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageType&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop1&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Article&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;elseif&lt;/span&gt; (is_category()) {    &lt;span style=&#34;color:#888&#34;&gt;//WordPress functionality to check if page is category page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$channel&lt;/span&gt; = single_cat_title(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Category: &amp;#39;&lt;/span&gt; . &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageType&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop1&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Category&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;elseif&lt;/span&gt; (is_tag()) {     &lt;span style=&#34;color:#888&#34;&gt;//WordPress functionality to check if page is tag page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$channel&lt;/span&gt; = single_tag_title(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageType&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop1&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Tag&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;elseif&lt;/span&gt; (is_month()) {     &lt;span style=&#34;color:#888&#34;&gt;//WordPress functionality to check if page is month page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;list&lt;/span&gt;(&lt;span style=&#34;color:#369&#34;&gt;$month&lt;/span&gt;, &lt;span style=&#34;color:#369&#34;&gt;$year&lt;/span&gt;) = split(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, the_date(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;F Y&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;false&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$pageName&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Month Archive: &amp;#39;&lt;/span&gt; . &lt;span style=&#34;color:#369&#34;&gt;$month&lt;/span&gt; . &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; . &lt;span style=&#34;color:#369&#34;&gt;$year&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$channel&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$pageType&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$prop1&lt;/span&gt; = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Month Archive&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$prop2&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$year&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#369&#34;&gt;$prop3&lt;/span&gt; = &lt;span style=&#34;color:#369&#34;&gt;$month&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;s.pageName = &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;$pageName&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; //page name&lt;/span&gt;&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;s.channel = &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;$channel&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; //channel&lt;/span&gt;&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;s.pageType = &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;$pageType&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;  //page type&lt;/span&gt;&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;s.prop1 = &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;$prop1&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; //traffic variable 1&lt;/span&gt;&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;s.prop2 = &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;$prop2&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; //traffic variable 2&lt;/span&gt;&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;s.prop3 = &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#33b;background-color:#fff0f0&#34;&gt;$prop3&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39; //traffic variable 3&lt;/span&gt;&lt;span style=&#34;color:#04d;background-color:#fff0f0&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c00;font-weight:bold&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;s.prop4 = &amp;#39;&amp;#39; //traffic variable 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The plugin allows you to freely switch between WordPress themes without having to manage the SiteCatalyst code and to track the basic WordPress page hierarchy. Here are example outputs of the SiteCatalyst variables broken down by page type:&lt;/p&gt;
&lt;h3 id=&#34;homepage&#34;&gt;Homepage&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s.pageName = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Blog Home&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.channel = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Blog Home&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.pageType = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Blog Home&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#888&#34;&gt;//page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop1 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Blog Home&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop2 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop3 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;tag-page&#34;&gt;Tag Page&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s.pageName = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;chocolate&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.channel = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;chocolate&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.pageType = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Tag&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#888&#34;&gt;//page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop1 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Tag&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop2 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop3 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;category-page&#34;&gt;Category Page&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s.pageName = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Category: Food&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.channel = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Food&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.pageType = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Category&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#888&#34;&gt;//page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop1 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Category&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop2 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop3 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;static-page&#34;&gt;Static Page&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s.pageName = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;About&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.channel = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;About&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.pageType = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Static Page&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#888&#34;&gt;//page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop1 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Static Page&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop2 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop3 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;archive&#34;&gt;Archive&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s.pageName = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Month Archive: November 2009&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.channel = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Month Archive&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.pageType = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Month Archive&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#888&#34;&gt;//page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop1 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Month Archive&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop2 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;2009&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop3 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;November&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;article&#34;&gt;Article&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s.pageName = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Hello world!&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//page name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.channel = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Test Category&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//channel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.pageType = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Article&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#888&#34;&gt;//page type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop1 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Article&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop2 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Hello world!&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;s.prop3 = &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;//traffic variable 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A followup step to this plugin would be to use the wp_options table in WordPress to manage the Omniture account id, which would allow admin to set the Omniture account id through the WordPress admin without editing the plugin code. I’ve uploaded the plugin to a GitHub repository &lt;a href=&#34;https://github.com/stephskardal/wordpress-sitecatalyst/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update: This plugin is included in the WordPress plugin registry and can be found at &lt;a href=&#34;https://wordpress.org/extend/plugins/omniture-sitecatalyst-tracking/&#34;&gt;https://wordpress.org/extend/plugins/omniture-sitecatalyst-tracking/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Using the new-style Google Analytics pageTracker functions in Interchange</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2009/06/using-new-style-google-analytics/"/>
      <id>https://www.endpointdev.com/blog/2009/06/using-new-style-google-analytics/</id>
      <published>2009-06-05T00:00:00+00:00</published>
      <author>
        <name>Richard Templet</name>
      </author>
      <content type="html">
        &lt;p&gt;For a while now there have been two different ways to setup the JavaScript calls to report traffic back to Google Analytics. The older method uses functions names that mention “urchin,” while the newer method uses a function named “pageTracker”. This post describes an approach for using the new method at a standard Interchange store.&lt;/p&gt;
&lt;p&gt;You can see an example of the new method of reporting a page view &lt;a href=&#34;https://gist.github.com/anonymous/124271&#34;&gt;here&lt;/a&gt;. Nothing Interchange-related is required for normal page tracking, but you may want to use a variable for the Google Account Number, of which more below.&lt;/p&gt;
&lt;p&gt;If you have your Google Analytics account setup to treat the website as an E-commerce site, then you can also add the order tracking tags to your receipt page, so that it sends order data over to Google Analytics at the time of conversion. The order tracking tags can be viewed &lt;a href=&#34;https://gist.github.com/anonymous/123987&#34;&gt;here&lt;/a&gt;. This gist shows the typical Interchange tags you might want to use to transmit the order specifics. Of course you might need to change the field used for the category for the products since not everyone uses the prod_group field from the products table to hold this information.&lt;/p&gt;
&lt;p&gt;As you can see, both normal and the order-conversion scripts need to be modified to contain the individual Google Analytics account number for the website. I tend to set up an Interchange variable such as GOOGLE_ANALYTICS_ID in the variable.txt file or catalog.cfg.&lt;/p&gt;

      </content>
    </entry>
  
</feed>
