<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Shopzilla Tech Blog</title>
	
	<link>http://tech.shopzilla.com</link>
	<description />
	<lastBuildDate>Fri, 11 Nov 2011 05:07:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ShopzillaTechBlog" /><feedburner:info uri="shopzillatechblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Automation Agility – The Evolution of Quality</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/-0Y2rPy4ZVQ/</link>
		<comments>http://tech.shopzilla.com/2011/11/automation-agility-%e2%80%93-the-evolution-of-quality/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 22:42:41 +0000</pubDate>
		<dc:creator>Jason Epel</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Quality Assurance]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[Awesome]]></category>
		<category><![CDATA[Efficiency]]></category>
		<category><![CDATA[Evolution]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[Quality]]></category>
		<category><![CDATA[Super]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=1068</guid>
		<description><![CDATA[You have likely already heard that technology is advancing at an accelerated rate.  Every year, we see discoveries, inventions and new breakthroughs in science.  As technology evolves, so do our expectations.  Expectations of quality have now taken center stage virtually across all industries that use technology in any capacity.  While there is a perception that [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div>
<p dir="ltr">You have likely already heard that technology is advancing at an accelerated rate.  Every year, we see discoveries, inventions and new breakthroughs in science.  As technology evolves, so do our expectations.  Expectations of quality have now taken center stage virtually across all industries that use technology in any capacity.  While there is a perception that technology is becoming more disposable, from a higher-level perspective, we are becoming more agile.  Our newer agile perspective and approach to business has proven to give us access to processes and new ways of thinking that enable us to become even more proficient at creating valuable business solutions.  The idea that we, at Shopzilla, can succeed at creating a new online business in a matter of months that can generate significant revenue is a testament to business strategy and resources, but more significantly, a testament to quality in process.  We are taking steps to evolve our world-class business to the next level.  This article will give you insight into what steps we are taking to evolve key engineering processes that have repeatedly proven to increase value and efficiency.  Given our track record of successes, we are excited at what new successes these changes will yield.</p>
<p dir="ltr">Today, we at Shopzilla are taking the next step.  We are evolving our processes to improve efficiency and quality even further.  Expensive processes that now lead to the slowing down of our agility are being optimized.  To promote the level of sustainability and agility that our business needs, automating testing is now a core competency.  In the spirit of this evolution we are changing how this vital role in our organization is being perceived by our teams and by those who will soon become members of the Shopzilla family.  The perception of value is core to the definition of quality.  We are evolving our perception of the traditional Quality Assurance paradigm by resetting expectations to higher levels, essentially raising the bar.</p>
<p dir="ltr">As values and perceptions evolve, language also changes.  Since change to language intrinsically communicates core values, intentions, and expectations, we are changing the language of job titles to reflect the new values within our new paradigm.  Quality Assurance titles are being converted to Software Engineer titles because quality is even more of an integral part of the software engineering process.  Even though the title is changing, the role is still focused on testing and assuring quality.  This change promotes and increases the value that assuring quality has in our organization, as well as increases collaboration among the team and its stakeholders.  We are all now Engineers in a team working in partnership to deliver a robust quality solution.</p>
<p dir="ltr">This change will bring new opportunities and a renewed emphasis on the significance of understanding our business technologies and automation.  In this evolved role you will have greater opportunities to learn better software engineering practices from peer developers, write better automation, performance, and other test programs and solutions.  If you are a traditional black-box tester, this is your chance to take advantage of this change, to learn, expand your horizons, and become more involved in the development process from both automation and general software development perspectives. The more you learn, the more depth you will add to the level of quality you can assure within the teams and processes you effect on a daily basis.</p>
<p dir="ltr">As a Software Engineer assuring quality in our organization, you serve as a liaison between business stakeholders and your Software Engineering team.  As a unified team, communications is emphasized and expected; all members of the team engage and communicate with all parties involved in this process.  Your role is one where you ensure that expectations are clearly communicated, understood, and that risks are assessed, communicated, and where possible mitigated.</p>
<p dir="ltr">Here at Shopzilla, quality is considered from business concept inception through to its deployment to our customers.  Utilizing a form of<a href="http://en.wikipedia.org/wiki/Scrum_(development)"> Scrum</a> and behavior driven development (<a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a>) within an Agile project management process, we are able to incrementally deliver testable and deployable new and evolving features to our various websites within two week sprints or iterations.</p>
<p dir="ltr">As we assure the quality of what we are implementing we also write automation tests. Since change is constant, we need a constant way to monitor change.  The scripts we write help us maintain our velocity in our iterations, as every change can have isolated or far reaching impact that can alter the landscape and introduce risk in unforeseen ways (e.g., changing an API requirement for an existing service endpoint).  By using automation in our testing, we can more efficiently and continuously deploy releases to production while continually monitoring the health of existing features, feature changes, and new features.  While our developers are responsible for the creation of unit tests, you will be responsible for testing newer features and services into the larger integration landscape, from end-to-end.</p>
<p dir="ltr">At Shopzilla, we are a Java based shop writing web apps in a service oriented architecture.  We assure quality by testing in various forms:</p>
<p dir="ltr">·      Acceptance and functional testing (whitebox, graybox, and blackbox)</p>
<p dir="ltr">·      Regression testing</p>
<p dir="ltr">·      Performance testing</p>
<p dir="ltr">·      Load testing</p>
<p dir="ltr">Software Engineers that fulfill this role have many exciting opportunities to learn and use various open source and homegrown technologies.  Our existing automation framework utilizes Python, JMeter and Selenium, to name a few.  If you don’t have experience with these tools but do have experience with writing scripts or programming in any modern object oriented programming language, you will be given the opportunity to learn what makes us unique and successful.</p>
<p dir="ltr">As a unified team, all Engineers are now even more focused on designing with quality in mind.  We are agile and fun.  Through our own insights and through emerging trends and technologies, we are constantly looking for new ways to improve and evolve.  If you want someplace fun and exciting to work at, Shopzilla is the place to be.  For more perks and insight on what we do, please visit our <a href="http://about.shopzilla.com/our-company/company-mission">About Shopzilla</a> page to learn more about our company.</p>
</div>
</div>
</div>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/-0Y2rPy4ZVQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/11/automation-agility-%e2%80%93-the-evolution-of-quality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/11/automation-agility-%e2%80%93-the-evolution-of-quality/</feedburner:origLink></item>
		<item>
		<title>Python and web frameworks at Shopzilla</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/ejFnvBls7Tk/</link>
		<comments>http://tech.shopzilla.com/2011/10/python-and-web-frameworks-at-shopzilla/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 00:46:54 +0000</pubDate>
		<dc:creator>Rob Roland</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[pylons]]></category>
		<category><![CDATA[pyramid]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=1013</guid>
		<description><![CDATA[Recently, a colleague at Shopzilla shared an InfoWorld article with me about Python web frameworks, and it really lined up well with our experience related to the various frameworks available to us. Here at Shopzilla, we have written several of our internal management tools in Python. We&#8217;ve worked with several different frameworks, notably Pylons, Pyramid, [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, a colleague at Shopzilla shared <a href="http://www.infoworld.com/d/application-development/pillars-python-six-python-web-frameworks-compared-169442?source=IFWNLE_nlt_daily_2011-08-10">an InfoWorld article</a> with me about Python web frameworks, and it really lined up well with our experience related to the various frameworks available to us.</p>
<p>Here at Shopzilla, we have written several of our internal management tools in Python.  We&#8217;ve worked with several different frameworks, notably Pylons, Pyramid, web2py and Django.</p>
<h4>Pylons/Pyramid</h4>
<p>In the first of the Python tools, we used Pylons. At the time, the thinking was that Pylons would be easy to swallow for Java developers &#8211; it&#8217;s very similar to using Spring MVC. You have to choose your ORM, template engine, session management strategy, etc. This fit well with how our Java code exists in theory. Ultimately, we were constantly left wondering if another template engine or ORM might be better, etc. We found that we spent more time thinking about the mechanics of the behind-the-scenes than the actual business need at hand.</p>
<p>After a few tools in Pylons, we migrated to an early version of Pyramid for a new tool.  The development experience was ultimately very similar to Pylons.  Powerful, but low-level.</p>
<h4>web2py</h4>
<p>Our DevOps crew created a deployment and configuration management tool entirely in web2py.  It is used by every engineer within our organization several times a day.  It is stable, extensible and replaced a hodgepodge of perl and shell scripts and manual effort.  It has enabled our engineering team to be self-sufficient, letting DevOps focus on production and &#8220;keeping the lights on.&#8221;</p>
<h4>Django</h4>
<p>Django required us to think a little differently about several things.  Django required us to spend less time worrying about the mechanics &#8211; the ORM, available databases, the template engine, how sessions were managed, etc were already there for us.  As an engineer, this is fairly counter-intuitive to how we think.  We like to focus on the low-level pieces of the problem, sometimes more than the actual business goal.  We think of this level as fun and entertaining.</p>
<p>We also had to approach schema designs slightly differently. Example: Django&#8217;s ORM can only use surrogate keys on tables. Business keys don&#8217;t work as they often are composite keys. </p>
<p>Django&#8217;s productivity gains really clicked when we made a very small application using only the internal administration-focused scaffolding to build a user management tool for the TaDa Merchant Tools site. Within four hours, we had something in production. When we originally talked about building this tool, we had complex UI mockups, and had scoped this out to be a two to three week project total!  The tool we ended up with was much less complex, but it met our needs perfectly.  This sort of immediate productivity is amazing, and provided a big benefit to our business.</p>
<p>Django is not restricted to it&#8217;s ORM, template engine, etc, but unless you have a real use case for a different implementation, you&#8217;ll see immediate productivity gains using what it ships with.</p>
<p>This is not to say that Django doesn&#8217;t have its own things to worry about before and after you get to production, however.  By default, Django does not use connection pooling, so that had a performance impact for us.  We added <a href="http://pypi.python.org/pypi/django-oraclepool">django-oraclepool</a> to address this.  It was nearly a drop-in addition, and not having to set up and tear down database connections on every request has a very obvious gain.  You also have to pay close attention to what the ORM is doing; it&#8217;s not always obvious when it&#8217;s making more queries than you intend for one page, and you pay the price because they all execute serially.  We added <a href="http://pypi.python.org/pypi/django-debug-toolbar/0.8.4">django-debug-toolbar</a> for use during development to help track down ORM issues and general request debugging.  The default is lazy loading for relationships &#8211; profile, profile, profile and hint the ORM appropriately in your queries!</p>
<h4>Standards</h4>
<p>All of our Python applications are built using industry-established development standards to ensure that our code is maintainable, deployable and supportable, thus adding real business value.</p>
<ul>
<li>virtualenv during development and deployment for isolation</li>
<li>setuptools for dependency management and packaging</li>
<li>Hudson to build and run tests</li>
<li>flup/FastCGI behind nginx for serving in QA and production</li>
<li>Unit testing via <a href="http://readthedocs.org/docs/nose/en/latest/">nose</a></li>
<li>Code coverage using <a href="http://pypi.python.org/pypi/coverage">coverage</a> (and the <a href="http://pypi.python.org/pypi/django-coverage">django-coverage</a> wrapper for Django projects)</li>
</ul>
<p>We&#8217;ve added support to our internal deployment tools for our Django and Pylons/Pyramid projects.  We deploy new builds or update configurations with a few clicks.  It&#8217;s as seamless as our Java projects.</p>
<p>I&#8217;m confident we have built a solid foundation to continue utilizing Python within Shopzilla, and it&#8217;s finding wider adoption in other aspects of the business, like QA automation, text processing, etc.  Python is helping us deliver software <strong>faster</strong>, without sacrificing our quality in the progress.</p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/ejFnvBls7Tk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/10/python-and-web-frameworks-at-shopzilla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/10/python-and-web-frameworks-at-shopzilla/</feedburner:origLink></item>
		<item>
		<title>Oracle wallet with thin driver, with connection pool, with database timeouts</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/oZ4OuOcZhL8/</link>
		<comments>http://tech.shopzilla.com/2011/09/oracle-wallet-with-thin-driver-with-connection-pool-with-database-timeouts/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 00:17:22 +0000</pubDate>
		<dc:creator>Steve Corwin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[thin driver]]></category>
		<category><![CDATA[wallet]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=1021</guid>
		<description><![CDATA[Introduction At Shopzilla we began using the Oracle thick drivers a couple of years ago. We needed them to get Oracle wallets to work. We needed the wallets to avoid storing the database usernames and passwords in clear text files on our production servers, which obviously isn&#8217;t good. However, as time went by and we [...]]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>At Shopzilla we began using the Oracle thick drivers a couple of years ago.  We needed them to get Oracle wallets to work.  We needed the wallets to avoid storing the database usernames and passwords in clear text files on our production servers, which obviously isn&#8217;t good.</p>
<p>However, as time went by and we analyzed various crash logs, we kept finding the thick driver code was involved.  We had conversations with a variety of people at Oracle, and repeatedly heard the recommendation that we switch to the thin driver.  So we set out to switch, but it wasn&#8217;t so simple.  Before going to production with the thin driver we needed to meet a number of conditions:</p>
<ul>
<li>we had to use Oracle wallets so we didn&#8217;t expose passwords</li>
<li>we needed a working connection pool to scale to production loads</li>
<li>we needed working database timeouts for situations such as losing connectivity to the database</li>
</ul>
<p>The combination documented here is the first one we found that met all our criteria.</p>
<h2>The Basics</h2>
<p>To get the thin driver to work with wallets, you&#8217;ll need to use a recent thin driver and 3 PKI-related jars from Oracle.  To get database timeouts to work with that combination you must use the Oracle Universal Connection Pool, which was introduced with Oracle version 11.2.</p>
<p>As an example, here are the jars that we are currently using:</p>
<p>1. ojdbc6-11.2.0.2.0.jar       (latest Oracle thin driver)<br />
2. oraclepki-11.2.0.0.jar       (for wallet support)<br />
3. osdt_cert-11.2.0.0.jar       (for wallet support)<br />
4. osdt_core-11.2.0.0.jar       (for wallet support)<br />
5. ucp-11.2.0.1.0.jar       (for the connection pool)</p>
<p>These jar files come from various Oracle downloads.</p>
<ul>
<li>ojdbc6: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
<li>ucp: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/ucp-112010-099129.html</li>
<li>oraclepki, osdt_cert, and osdt_core are not available as separate downloads.  Originally I used the ones that come with JDeveloper 11g:
<p>http://www.oracle.com/technetwork/developer-tools/jdev/downloads/index.html</p>
<p>For production we ones that the Oracle DBAs obtained from some enterprise Oracle software &#8211; unfortunately I&#8217;m not sure which one.</li>
<p>To test, naturally you&#8217;ll need a wallet.  Ours are generated by our Oracle DBAs.  Dev wallets can be generated to not be machine-specific, so you can put one in version control with the project source if desired.</p>
<p>Before going further, it&#8217;s worth taking the time to get a simple test app working.  Here&#8217;s an example that can be modified to suit your circumstances:</p>
<pre class="brush: java;">
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

public class WalletTest {

    private PoolDataSource pds = null;

    public WalletTest() throws SQLException {
        // Create pool-enabled data source instance.
        pds = PoolDataSourceFactory.getPoolDataSource();

        // PoolDataSource and UCP configuration
        // set the connection properties on the data source and pool properties
        // pds.setUser(&quot;scott&quot;);
        // pds.setPassword(&quot;tiger&quot;);
        pds.setURL(&quot;jdbc:oracle:thin:/@WALLET_TEST_CONNECTION_ID&quot;);  // (1)
        pds.setConnectionFactoryClassName(&quot;oracle.jdbc.pool.OracleDataSource&quot;);
        pds.setInitialPoolSize(10);
        pds.setMinPoolSize(10);
        pds.setMaxPoolSize(20);
        pds.setConnectionProperty(&quot;oracle.jdbc.ReadTimeout&quot;, &quot;5000&quot;);

        System.setProperty(&quot;oracle.net.wallet_location&quot;,
            &quot;(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/home/scorwin/swdev/WalletExp/wallet)))&quot;);  // (2)
    }

    public void displayPoolDetails() throws SQLException {
        System.out.println(&quot;-----------&quot;);
        System.out.println(&quot;NumberOfAvailableConnections: &quot; + pds.getAvailableConnectionsCount());
        System.out.println(&quot;BorrowedConnectionsCount: &quot; + pds.getBorrowedConnectionsCount());
        System.out.println(&quot;-----------&quot;);
    }

    public void run() throws SQLException {
        List&lt;Connection&gt; connList = new ArrayList&lt;Connection&gt;();

        for (int i = 0; i &lt; 5; i++) {
            // Get a database connection from the datasource.
            Connection conn = pds.getConnection();
            System.out.println(&quot;Retrieved a connection from pool&quot;);
            displayPoolDetails();
            connList.add(conn);
        }

        Connection conn = connList.get(0);
        Statement stmt = conn.createStatement();
        ResultSet rset = stmt.executeQuery(&quot;select sysdate from dual&quot;);
        while (rset.next()){
            System.out.println(&quot;sysdate from dual: &quot; + rset.getString(1) + &quot; as of &quot;
                    + new Date());
        }
        rset.close();
        stmt.close();

        // close all connections
        for (int j = 0; j &lt; connList.size(); j++) {
            ((Connection) connList.get(j)).close();
        }

        // finally display pool details again
        displayPoolDetails();
    }

    public static void main(String[] args) {
        System.out.println(&quot;Started at &quot; + new Date());

        try {
            WalletTest basicDemo = new WalletTest();
            basicDemo.run();
        } catch (SQLException e) {
            System.out.println(&quot;SQLException occurred: &quot; + e.getMessage());
            e.printStackTrace();
        }

        System.out.println(&quot;Ended at &quot; + new Date());
    }
}
</pre>
<p>(1) replace WALLET_TEST_CONNECTION_ID with a connection identifier from your wallet.</p>
<p>(2) replace &#8216;/home/scorwin/swdev/WalletExp/wallet&#8217; with the path to your wallet, being careful not to change anything else.  In particular there are exactly three closing parentheses.</p>
<p>Here is an example of a simple shell script that compiles and runs the test app:</p>
<pre>#!/bin/bash

export CLASSPATH=/home/scorwin/.m2/repository/com/oracle/ojdbc6/11.2.0.2.0/ojdbc6-11.2.0.2.0.jar
CLASSPATH=$CLASSPATH:/home/scorwin/apps/oracle/Middleware/jdeveloper/modules/oracle.pki_11.1.1/oraclepki.jar
CLASSPATH=$CLASSPATH:/home/scorwin/apps/oracle/Middleware/jdeveloper/modules/oracle.osdt_11.1.1/osdt_cert.jar
CLASSPATH=$CLASSPATH:/home/scorwin/apps/oracle/Middleware/jdeveloper/modules/oracle.osdt_11.1.1/osdt_core.jar
CLASSPATH=$CLASSPATH:/home/scorwin/apps/oracle/ucp11.2.0.1.0/ucp-11.2.0.1.0.jar
echo $CLASSPATH

rm WalletTest.class
$JAVA_HOME/bin/javac -Xlint:deprecation WalletTest.java

CLASSPATH=$CLASSPATH:.
$JAVA_HOME/bin/java -Doracle.net.tns_admin=/home/scorwin/swdev/WalletExp/wallet WalletTest</pre>
<p>&nbsp;</p>
<p>When the app runs successfully, it will produce output like this:</p>
<pre>Started at Mon May 16 16:54:50 PDT 2011
Retrieved a connection from pool
-----------
NumberOfAvailableConnections: 9
BorrowedConnectionsCount: 1
-----------
Retrieved a connection from pool
-----------
NumberOfAvailableConnections: 8
BorrowedConnectionsCount: 2
-----------
Retrieved a connection from pool
-----------
NumberOfAvailableConnections: 7
BorrowedConnectionsCount: 3
-----------
Retrieved a connection from pool
-----------
NumberOfAvailableConnections: 6
BorrowedConnectionsCount: 4
-----------
Retrieved a connection from pool
-----------
NumberOfAvailableConnections: 5
BorrowedConnectionsCount: 5
-----------
sysdate from dual: 2011-05-16 16:55:09 as of Mon May 16 16:55:08 PDT 2011
-----------
NumberOfAvailableConnections: 10
BorrowedConnectionsCount: 0
-----------
Ended at Mon May 16 16:55:08 PDT 2011</pre>
<p>&nbsp;</p>
<p>Note: so far we have not found a need to change the code to include</p>
<pre> Security.addProvider(new oracle.security.pki.OraclePKIProvider());</pre>
<p>or to modify the JDK config file jre/lib/security/java.security to load this provider either.</p>
<h2>Real-world Apps</h2>
<h4>Pass the wallet path</h4>
<p>The wallet path must be supplied in the system property oracle.net.tns_admin.  This can be passed to the JVM as a command-line parameter:</p>
<pre> -Doracle.net.tns_admin=/path/to/wallet/files</pre>
<p>where &#8220;/path/to/wallet/files&#8221; ends with the name of the directory that contains cwallet.sso and the related files).</p>
<p>When using Tomcat we instead add</p>
<pre>-Doracle.net.tns_admin=/path/to/wallet/files</pre>
<p>to the end of the existing catalina.opts file.  Tomcat must be restarted for this to take effect.</p>
<h4>Assemble the JDBC URI</h4>
<p>The JDBC URI will be of the form <code>jdbc:oracle:thin:/@connection_identifer</code>, for example <code>jdbc:oracle:thin:/@PROD_CONN_ID</code>.  Note that the URI contains &#8220;thin&#8221;, not &#8220;oci&#8221;.  This is vital.  oci = thick driver.</p>
<h4>Additional Configs</h4>
<ul>
<li>when configuring the datasource, the wallet location must be specified.  It contains the path to the wallet in the middle of it.</li>
<li>the database read timeout must be specified.  This is done by setting the OracleDataSource connection property oracle.jdbc.ReadTimeout to the desired timeout in milliseconds.</li>
<li>if you&#8217;re converting an existing app, any existing username and password configs should be removed.  They will be ignored and only cause confusion.</li>
</ul>
<p>Here is an example of configuring a datasource using Spring:</p>
<pre class="brush: xml;">
&lt;bean id=&quot;dataSource&quot; class=&quot;oracle.ucp.jdbc.PoolDataSourceFactory&quot;
       factory-method=&quot;getPoolDataSource&quot;&gt;
   &lt;property name=&quot;URL&quot; value=&quot;${DATA_SOURCE_URI}&quot; /&gt;
   &lt;property name=&quot;connectionFactoryClassName&quot; value=&quot;oracle.jdbc.pool.OracleDataSource&quot; /&gt;
   &lt;property name=&quot;initialPoolSize&quot; value=&quot;${POOL_CONNECTIONS_INITIAL}&quot; /&gt;
   &lt;property name=&quot;minPoolSize&quot; value=&quot;${POOL_CONNECTIONS_MIN}&quot; /&gt;
   &lt;property name=&quot;maxPoolSize&quot; value=&quot;${POOL_CONNECTIONS_MAX}&quot; /&gt;
   &lt;property name=&quot;abandonedConnectionTimeout&quot; value=&quot;${POOL_CONNECTIONS_MAX_WAIT_TIME}&quot; /&gt;
   &lt;property name=&quot;loginTimeout&quot; value=&quot;${POOL_CONNECTIONS_LOGIN_TIMEOUT}&quot; /&gt;
   &lt;property name=&quot;validateConnectionOnBorrow&quot; value=&quot;true&quot; /&gt;
   &lt;property name=&quot;SQLForValidateConnection&quot; value=&quot;select 1 from dual&quot; /&gt;
   &lt;property name=&quot;connectionProperties&quot;&gt;
     &lt;props merge=&quot;default&quot;&gt;
       &lt;prop key=&quot;oracle.jdbc.ReadTimeout&quot;&gt;${POOL_CONNECTIONS_READ_TIMEOUT}&lt;/prop&gt;
       &lt;prop key=&quot;oracle.net.wallet_location&quot;&gt;(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=${DATA_SOURCE_WALLET_PATH})))&lt;/prop&gt;
     &lt;/props&gt;
   &lt;/property&gt;
 &lt;/bean&gt;
</pre>
<p>Example property values:</p>
<pre>DATA_SOURCE_URI=jdbc:oracle:thin:/@PROD_CONN_ID
POOL_CONNECTIONS_INITIAL=2
POOL_CONNECTIONS_MIN=2
POOL_CONNECTIONS_MAX=4
POOL_CONNECTIONS_MAX_WAIT_TIME=20    (value is in seconds)
POOL_CONNECTIONS_LOGIN_TIMEOUT=30    (value is in seconds)
POOL_CONNECTIONS_READ_TIMEOUT=20000    (value is in milliseconds)
DATA_SOURCE_WALLET_PATH=/path/to/wallet/files</pre>
<h4>Finally, test your app</h4>
<p>1. verify that it starts up successfully.<br />
2. perform operations that will cause a variety of database operations to be performed, and verify that they succeeded.<br />
3. you can test the timeouts by starting a database operation and then unplugging the network cable or blocking port 1521 outgoing.</p>
<h2>Troubleshooting</h2>
<p><em>Note</em>: some of these entries mention native code.  These apply when the thin drivers must coexist with the thick drivers in the same JVM, and do not imply that the thin drivers need native code.</p>
<h4>java.sql.SQLRecoverableException: IO Error: Socket read timed out</h4>
<p>This is thrown when the database connection times out; it actually indicates that timeouts are working correctly.</p>
<h4>java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier</h4>
<p>For example java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier  &#8220;WALLET_TEST_CONNECTION_ID&#8221;.  This means that the wallet files which define the connection identifier (WALLET_TEST_CONNECTION_ID) were not found.</p>
<p>Note: you can look in manifest.txt in the wallet files to see which identifiers are contained in a particular wallet.</p>
<h4>ClassNotFoundException: oracle.ucp.jdbc.PoolDataSourceFactory</h4>
<p>The ucp*.jar file is missing from the classpath.</p>
<h4>java.sql.SQLException: &#8220;invalid arguments in call&#8221;</h4>
<p>This may indicate that an older version of ojbc*.jar was found in the classpath.</p>
<h4>oracle.net.ns.NetException: Unknown host specified</h4>
<p>This may mean that the mapping from connect identifier to hostname is not being found.  The mapping is in the wallet file tnsnames.ora.</p>
<p>Check that the system property oracle.net.tns_admin has the correct value for the path to where the wallet files are.  If you&#8217;re passing the value on the command line, verify that the command-line parameter &#8220;-Doracle.net.tns_admin=&#8230;&#8221; is being passed to the JVM.</p>
<h4>ORA-00942: table or view does not exist</h4>
<p>This is most likely due to the incorrect user being specified, one who does not have permission to see the table, or the connection being made to the wrong database.  Check the connection identifier values in your URIs.</p>
<p>To see which connection identifiers map to which users, check the wallet file manifest.txt.  If you get stuck, copy the wallet to a place that&#8217;s used by your test app and modify the test app to select from the table you&#8217;re trying to access.  Then you can try different connection identifiers and see which ones work.</p>
<h4>java.lang.UnsatisfiedLinkError: oracle.jdbc.driver.T2CConnection.getLibraryVersionNumber()</h4>
<p>The Oracle thick drivers use code in ojdbc6.jar before calling the native code.  Therefore the OCI version and thin driver version need to match exactly, for both the jars and the .so files and other native code.  For example if the native code files are at version 11.2.0.1.0 and ojdbc6.jar is at version 11.2.0.2.0 this exception will be thrown.</p>
<h4>Exception in thread &#8220;com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1&#8243; java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path</h4>
<p>This is probably due to LD_LIBRARY_PATH pointing to version 10 thick driver native code, but also check for older versions of ojdbc*.jar in the classpath.</p>
<h4>java.sql.SQLException: Unable to start the Universal Connection Pool: oracle.ucp.UniversalConnectionPoolException: Invalid Universal Connection Pool configuration</h4>
<p>This exception is thrown when there is something wrong with the values set for the minimum, initial, and/or maximum number of connections the pool should open.  For example, if the initial number is greater than the maximum number, such as initial = 6 but max = 2, then this exception will be thrown.</p>
<h4>java.lang.NoSuchMethodError: oracle.i18n.text.converter.CharacterConverterOGS.getInstance(I)Loracle/i18n/text/converter/CharacterConverter</h4>
<p>Check the classpath for older versions of ojdbc*.jar.</p>
<h4>java.sql.SQLException: ORA-01017: invalid username/password; logon denied</h4>
<p>Check for JDBC URLs which have not been converted to use a wallet.  The driver will still attempt to connect with an old URL, but then fail because the username and password are no longer being supplied.</p>
<h4>ORA-12154: TNS:could not resolve the connect identifier specified</h4>
<p>This can happen if the driver found a URL with a wallet connect identifier in it, but couldn&#8217;t find the files for the matching wallet.</p>
<h4>ORA-12534: TNS:operation not supported</h4>
<p>Saw this on a test system where the TNS_ADMIN environment variable was pointing to a directory that contained a wallet, but the sqlnet.ora file in that directory contained a entry for the wallet directory but the specified path did not exist on the file system.</p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/oZ4OuOcZhL8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/09/oracle-wallet-with-thin-driver-with-connection-pool-with-database-timeouts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/09/oracle-wallet-with-thin-driver-with-connection-pool-with-database-timeouts/</feedburner:origLink></item>
		<item>
		<title>Shopzilla’s Hadoop Hackathon: Learning to Contribute</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/NhVkxCeAikA/</link>
		<comments>http://tech.shopzilla.com/2011/06/shopzillas-hadoop-hackathon-learning-to-contribute/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 09:40:35 +0000</pubDate>
		<dc:creator>Andrew Look</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=995</guid>
		<description><![CDATA[With the objective of recruiting new contributors to the Hadoop ecosystem, our most recent meetup of the LA-HUG included a 5-hour hackathon in which attendees learned to set up a development environment, checkout/build/test the Hadoop codebase, find issues to work on in the Apache JIRA system, and understand the community review process. Aaron T. Myers [...]]]></description>
			<content:encoded><![CDATA[<p>With the objective of recruiting new contributors to the Hadoop ecosystem, our most recent <a href="http://www.meetup.com/LA-HUG/">meetup</a> of the LA-HUG included a 5-hour hackathon in which attendees learned to set up a development environment, checkout/build/test the Hadoop codebase, find issues to work on in the Apache JIRA system, and understand the community review process.</p>
<p>Aaron T. Myers and Eric Sammers of <a href="https://ccp.cloudera.com/display/SUPPORT/Hadoop+Tutorial">Cloudera</a> expertly led the session of roughly 15 developers, describing how developers can make contributions to Hadoop Common, MapReduce, and HDFS. While the learning curve was steep, a number of developers were able to submit patches during the session; they are currently pending community review for inclusion into the release of Hadoop 0.23.0.</p>
<ul>
<li><a id="key-val" rel="12477613" href="https://issues.apache.org/jira/browse/HADOOP-7418">HADOOP-7418</a> support for multiple slashes in the path separator</li>
<li><a id="key-val" rel="12470502" href="https://issues.apache.org/jira/browse/HDFS-1322">HDFS-1322</a> DistributedFileSystem.mkdirs(dir, dirPermission) doesn&#8217;t set the permissions of created dir to dirPermission</li>
<li><a id="key-val" rel="12469946" href="https://issues.apache.org/jira/browse/HDFS-1314">HDFS-1314</a> dfs.block.size accepts only absolute value</li>
<li><a id="key-val" rel="12470379" href="https://issues.apache.org/jira/browse/HDFS-1321">HDFS-1321</a> If service port and main port are the same, there is no clear log message explaining the issue.</li>
</ul>
<p>For those interested in contributing to project in the Hadoop ecosystem, Aaron has prepared a <a href="http://bit.ly/ifGaMc">very helpful document</a>, which explains how to pull down the source code, set up a development environment, run the tests, and find JIRA issues to work on.</p>
<p>As a final note, Eric made an exciting announcement that several independent open-source projects related to Hadoop, which Cloudera has been maintaining, have been accepted into the Apache incubator program. They are actively recruiting committers; your help will make a big difference, whether you&#8217;re a Java developer, build/release/scripting ninja, documentation-writer, web designer, bug reporter, or even an end-user who pulls down the code and runs it! The list of projects is as follows:</p>
<p><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Consolas; color: #1e39f6} span.s1 {text-decoration: underline} --></p>
<ul>
<li><a title="Flume" href="http://incubator.apache.org/projects/flume.html">Flume</a></li>
<li><a title="MRUnit" href="http://incubator.apache.org/projects/mrunit.html">MRUnit</a></li>
<li><a title="BigTop" href="http://incubator.apache.org/projects/bigtop.html">BigTop</a></li>
<li><a title="Sqoop" href="http://incubator.apache.org/projects/sqoop.html">Sqoop</a></li>
</ul>
<p>Thank you to everyone who attended! We hope to see more Hadoop enthusiasts give back to this ever-growing community.<br />
<a href="http://www.flickr.com/photos/cloudera/5861178605/" title="LA-Hackathon by cloudera, on Flickr"><img src="http://farm6.static.flickr.com/5033/5861178605_93a23c9f42.jpg" width="375" height="500" alt="LA-Hackathon"></a></p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/NhVkxCeAikA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/06/shopzillas-hadoop-hackathon-learning-to-contribute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/06/shopzillas-hadoop-hackathon-learning-to-contribute/</feedburner:origLink></item>
		<item>
		<title>Secure That Elephant!</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/rxwrN99m65A/</link>
		<comments>http://tech.shopzilla.com/2011/06/secure-that-elephant/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 09:12:04 +0000</pubDate>
		<dc:creator>Andrew Look</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=964</guid>
		<description><![CDATA[Aaron T. Myers gave a fascinating presentation on the recent integration of Kerberos authentication into the latest Cloudera distribution of Hadoop. For more details on the motivation for these changes, see the initial design documentation for this security upgrade in the JIRA attachment from 2009. Prior to this security upgrade, the state of Hadoop security [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tech.shopzilla.com/wp-content/uploads/2011/06/hadoop-security-logo.jpg"><img class="aligncenter size-full wp-image-988" title="hadoop-security-logo" src="http://tech.shopzilla.com/wp-content/uploads/2011/06/hadoop-security-logo.jpg" alt="" width="112" height="116" /></a><br />
Aaron T. Myers gave a fascinating presentation on the recent integration of Kerberos authentication into the latest Cloudera distribution of Hadoop. For more details on the motivation for these changes, see the initial design documentation for this security upgrade in the <a href="https://issues.apache.org/jira/secure/attachment/12428537/security-design.pdf">JIRA attachment from 2009</a>.</p>
<p>Prior to this security upgrade, the state of Hadoop security has been dismal; client-side authentication means that a malicious user could trivially:</p>
<ul>
<li>impersonate a privileged user and execute arbitrary Java code on the cluster</li>
<li>view and edit potentially sensitive data stored on HDFS</li>
<li>perform man-in-the-middle attacks by impersonating the cluster services.</li>
</ul>
<p>As a result, Hadoop clusters could only be considered secure by maintaining strict network segmentation and by only allowing completely trusted users to access the cluster; given the fact that Hadoop is <em>designed</em> to execute arbitrary code, network security is still important, since any implementation of Hadoop security still makes certain assumptions (for instance, that packets going over the wire cannot be read or injected). For a more detailed analysis of Hadoop&#8217;s past vulnerabilities and ongoing security challenges, see <a href="https://media.blackhat.com/bh-us-10/whitepapers/Becherer/BlackHat-USA-2010-Becherer-Andrew-Hadoop-Security-wp.pdf">Andrew Becherer&#8217;s BlackHat presentation</a>.</p>
<p>Aaron&#8217;s slides contain some useful insight on how to integrate these new features into your own Hadoop clusters. For more details, see below:</p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/rxwrN99m65A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/06/secure-that-elephant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/06/secure-that-elephant/</feedburner:origLink></item>
		<item>
		<title>Why Bother Committing?</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/Eyh5df8e0QI/</link>
		<comments>http://tech.shopzilla.com/2011/06/why-bother-committing/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 00:15:40 +0000</pubDate>
		<dc:creator>Miranda Robinson-Perez</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=934</guid>
		<description><![CDATA[I’d been hearing murmurs about Kanban for the last six months or so but I only knew the basic concepts: it was a ‘pull method’ of Agile development that was picking up momentum and limited the amount of work the team took on at a given time. However, no one in the company was talking [...]]]></description>
			<content:encoded><![CDATA[<p>I’d been hearing murmurs about Kanban for the last six months or so but I only knew the basic concepts: it was a ‘pull method’ of Agile development that was picking up momentum and limited the amount of work the team took on at a given time. However, no one in the company was talking about it or implementing it on their teams and I hadn&#8217;t seen it in action yet. We’d toyed with maybe trying it out with one of the Bizrate teams but decided to hold off since January was rather hectic.</p>
<p>After a turbulent Q1 that threw our normal scrum process into disarray, it became obvious to the Bizrate operations team that we needed a change.</p>
<ul>
<li>A series of production emergencies made it apparent that although scrum gave us flexibility, it didn’t enable us to react to rapidly shifting business priorities. Even though we moved stories out to accommodate unscheduled work, the two week cycle wasn’t a good fit for how often our business changed – both in priorities and releases.</li>
<li>Our team’s sense of commitment was constantly being eroded.  There was no way to protect the team’s focus. At the start of an iteration they’d implement a strategy to complete the body of work but the shifting priorities prevented them from executing.  The commitment went from, ‘We WILL get this done’ to ‘We’ll try, but it depends on what happens’.  What was the point of committing?</li>
<li>We tried a dedicated resource to act as a <a href="http://tech.shopzilla.com/2010/03/fire-chief/">fire chief</a> for production emergencies but found often there were so many fires that tied directly to revenue that we actually needed the support of the entire team.</li>
<li>Perhaps most important of all, there was so much waste. The team would start on something and have to abandon it mid way to support an emergency story.  Or, in other cases, we’d finish development &amp; testing on a story but the effort to release was separate and could take two days or a week before the feature hit production which was becoming a source of frustration for the product team.</li>
</ul>
<p>So when Kanban came back up in discussions it seemed like the perfect<em> </em>time to try something new. We knew a few things were going to have to change:</p>
<ul>
<li>The team would decide on a work in progress limit, or ‘WIP’. By limiting the number of things that are in progress at one time, the team works as a whole to deliver that piece of functionality and everyone owns getting those stories completed.</li>
<li>Stories live on a Kanban board (Japanese for ‘sign board’) with a minimum of three columns: Ready, WIP &amp; Done. Bizrate Ops has opted to only use these three general columns but other Kanban practitioners elect to have more.</li>
<li>No more iteration planning. Kanban replaces this with small, adhoc meetings that happen as a new story is pulled in.  Only those who are going to be working on a story are involved in the conversation, cutting down on team members sitting through discussion on a story they don’t ever touch.  Same goes for demos. Retrospectives stay intact – what kind of an Agile team would we be if we never inspected &amp; adapted? <img src='http://tech.shopzilla.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Priorities in the ‘Ready’ column are in constant flux. This gives the business team the flexibility to decide, as often as needed, what the most important story is while limiting the impact to the team and reducing wasted effort.</li>
</ul>
<p>As part of implementing Kanban, the Bizrate operations team agreed we needed a new definition of &#8216;done&#8217;.  We decided that &#8216;done&#8217; would no longer mean marked business accepted; instead it would mean live and available for use in production. This is a super exciting shift that pushes us to release things as soon as they&#8217;re ready, since a new story can&#8217;t be pulled in until we release and can see the feature in production.  If we&#8217;re at our WIP limit and there&#8217;s not any engineering to be done developers and front end engineers jump in to help execute test cases, run regression on release candidates; whatever it takes to get the story moved over to ‘Done’ so we can start on something new.</p>
<p>We’ve been using Kanban for the last 8 weeks and we’ve already eliminated some of our major problems with scrum.  Limiting our in progress work has greatly reduced abandoned stories.  Since applying Kanban we’ve only had to swap out one story and it came right back into the queue.  The business no longer waits for a release window; the team is eager to get a feature live so they can start something new.  We’re constantly delivering business value – as soon as a feature is blessed for production it’s deployed. Things hit production as soon as they possibly can; no more features languishing while they wait for a release window, and the team is empowered to see them all the way to done.</p>
<h4>It’s Not All Roses</h4>
<p>There are new obstacles to work through and we tackle these issues in our retrospectives.  Kanban makes bottlenecks and inefficiencies visible and we’re realizing that, although we’ve cut down our release preparation and deployment time, we still spend a lot of time on this step in our process.  At the outset, the team knew that adjusting the definition of done to include release to production would be painful. Adopting the mantra <a href="http://ehukai.typepad.com/blog/2010/12/what-i-learned-about-continuous-deployment.html">&#8220;if something&#8217;s painful, do it a lot&#8221;,</a> we&#8217;re slowly but surely reducing the time taken to release.  As we continue as a team, this won&#8217;t be the last time we need to adapt our process to meet our needs, but that&#8217;s the luxury of being Agile.</p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/Eyh5df8e0QI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/06/why-bother-committing/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/06/why-bother-committing/</feedburner:origLink></item>
		<item>
		<title>Los Angeles Hadoop Users Group: Join us on 6/22 for the Apache Hadoop Hackathon, and stay afterwards to learn about Hadoop security!</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/dDdjgsYUMG4/</link>
		<comments>http://tech.shopzilla.com/2011/06/los-angeles-hadoop-users-group-join-us-on-622-for-the-apache-hadoop-hackathon-and-stay-afterwards-to-learn-about-hadoop-security/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 21:29:58 +0000</pubDate>
		<dc:creator>Andrew Look</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cloudera]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[LA-HUG]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=931</guid>
		<description><![CDATA[Wednesday, June 22 will be a busy day for LA-HUG&#8217;ers! First, we have the Hadoop Hackathon, from 1-6pm, which will be led by Cloudera’s Aaron Myers (Hadoop Committer) and Eric Sammer (Solution Architect). There you will learn about the submission process and how to make legitimate contributions to Apache Hadoop &#8211; I&#8217;m sure everyone will find this to be an engaging, interactive way [...]]]></description>
			<content:encoded><![CDATA[<p>Wednesday, June 22 will be a busy day for LA-HUG&#8217;ers!</p>
<p>First, we have the Hadoop Hackathon, from 1-6pm, which will be led<br />
by Cloudera’s Aaron Myers (Hadoop Committer) and Eric Sammer (Solution<br />
Architect). There you will learn about the submission process and how to<br />
make legitimate contributions to Apache Hadoop &#8211; I&#8217;m sure everyone will find<br />
this to be an engaging, interactive way to gain some experience with the<br />
internals of Hadoop.</p>
<p><a title="http://www.meetup.com/LA-HUG/events/21380931/" href="http://www.meetup.com/LA-HUG/events/21380931/">http://www.meetup.com/LA-HUG/events/21380931/</a></p>
<p>After the Hackathon, we&#8217;ll have a presentation from 6-8pm by Aaron Myers in<br />
which he will discuss Hadoop Security &#8211; both how it&#8217;s implemented within<br />
Hadoop, and how you can leverage this security model to keep your data safe.<br />
See the following post from Cloudera&#8217;s blog for a taste of the<br />
material: <a title="Configuring Security Features in CDH3" href="http://www.cloudera.com/blog/2011/01/configuring-security-features -in-cdh3/">http://www.cloudera.com/blog/2011/01/configuring-security-features<br />
-in-cdh3/</a></p>
<p><a title="http://www.meetup.com/LA-HUG/events/17448133/" href="http://www.meetup.com/LA-HUG/events/17448133/">http://www.meetup.com/LA-HUG/events/17448133/</a></p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/dDdjgsYUMG4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/06/los-angeles-hadoop-users-group-join-us-on-622-for-the-apache-hadoop-hackathon-and-stay-afterwards-to-learn-about-hadoop-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/06/los-angeles-hadoop-users-group-join-us-on-622-for-the-apache-hadoop-hackathon-and-stay-afterwards-to-learn-about-hadoop-security/</feedburner:origLink></item>
		<item>
		<title>Modifying an Existing Maven Archetype</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/ftcMTTP7LkU/</link>
		<comments>http://tech.shopzilla.com/2011/05/modifying-an-existing-maven-archetype/#comments</comments>
		<pubDate>Fri, 27 May 2011 01:20:28 +0000</pubDate>
		<dc:creator>Steve Corwin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=921</guid>
		<description><![CDATA[Shopzilla uses Maven archetypes as the starting point for a variety of things, in particular creating a new web service. Recently I had to update our web service archetype because the code it was generating wouldn&#8217;t compile. As it happens I hadn&#8217;t modified the archetype much, and not for a long time. My first attempt [...]]]></description>
			<content:encoded><![CDATA[<p>Shopzilla uses Maven archetypes as the starting point for a variety of things, in particular creating a new web service.  Recently I had to update our web service archetype because the code it was generating wouldn&#8217;t compile.  As it happens I hadn&#8217;t modified the archetype much, and not for a long time.  My first attempt to modify it failed, so I searched for docs on how to modify an archetype but didn&#8217;t find anything.  Everything I found stops after the first archetype creation, as if it would be perfect and never-changing.  So I typed up my notes and posted them here.</p>
<p>Steps needed to modify an archetype:<br />
1. checkout the archetype to a local directory<br />
2. make sure you&#8217;re working with a SNAPSHOT version. (After modifying the archetype you need to do a Maven build on it, or your changes won&#8217;t take effect.)<br />
3. generate from the archetype in a different directory. Make sure you specify the correct SNAPSHOT version for the archetype version. (You can generate in the same directory, but the top-level pom.xml will be modified if you do. Then you&#8217;ll have to revert the modifications somehow each time you go through this process.)<br />
4. check the results<br />
5. delete the existing generated code<br />
6. edit the archetype<br />
7. rebuild the archetype: mvn clean install<br />
8. repeat steps 3 to 7 until happy</p>
<p>This much repetition deserves a shell script.  Here&#8217;s an example:</p>
<pre><code>
# rebuild the archetype
cd ~/swdev/Service/archetype-webservice
mvn clean install

# clean the previously-generated code
cd ~/temp
rm -rf archetype-test

# generate from the archetype
#
# If you are making changes to the local archetype, make sure you're specifying the matching
# version.  Otherwise you will generate from a downloaded version, and none of your local
# changes will take effect.
#
mvn archetype:generate -DarchetypeGroupId=com.shopzilla.site.archetypes \
-DarchetypeArtifactId=shopzilla-modular-hibernate \
-DarchetypeVersion=3.2-SNAPSHOT \
-DgroupId=com.shopzilla.site.service.archetypetest \
-DartifactId=archetype-test \
-Dversion=1.0-SNAPSHOT \
-Dservice-version=1 \
-Duser=scorwin \
-DcurrentYear=2011 \
-Dfull-service-name='Test of editing archetype'

# smoke test: see if the generated code will at least build
echo "about to build"
cd ~/temp/archetype-test
mvn clean install
</code></pre>
<p>
<p>
A side note: if you&#8217;re generating from the archetype and generation stops with a line that contains only<br />
<code>Y: :</code><br />
hitting &#8220;y&#8221; and Enter should get it going.</p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/ftcMTTP7LkU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/05/modifying-an-existing-maven-archetype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/05/modifying-an-existing-maven-archetype/</feedburner:origLink></item>
		<item>
		<title>AgileCafe at Shopzilla with Rally on Thursday May 19, 2011</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/rzfhpKv35-w/</link>
		<comments>http://tech.shopzilla.com/2011/05/agilecafe-at-shopzilla-with-rally-on-thursday-may-19-2011/#comments</comments>
		<pubDate>Tue, 10 May 2011 02:13:22 +0000</pubDate>
		<dc:creator>Rony Sawdayi</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=907</guid>
		<description><![CDATA[Already Agile? Interested in being more Agile? New to Agile? Register for the Agile Cafe on Thursday May 19th from 9am to 12pm at Shopzilla in Los Angeles and hear from experienced users on why Agile makes sense for their teams and organizations. Visit AgileCafe to register today. At the event, you will learn how: [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://www.rallydev.com/events/agile_cafe/?src=homepage"><img class="alignnone size-full wp-image-910" title="Agile Cafe Napkin" src="http://tech.shopzilla.com/wp-content/uploads/2011/05/Agile-Cafe-Napkin.png" alt="" width="150" height="95" /></a> Already Agile? Interested in being more Agile? New to Agile? Register for the Agile Cafe on <strong>Thursday May 19th</strong> from 9am to 12pm at Shopzilla in Los Angeles and hear from experienced users on why Agile makes sense for their teams and organizations. Visit <a href="http://www.rallydev.com/events/agile_cafe/?src=homepage">AgileCafe</a> to register today.</p>
<p><strong>At the event, you will learn how:</strong></p>
<ul>
<li>To accelerate delivery and reduce defects</li>
<li>To adopt and scale Agile across distributed teams</li>
<li>Your organization can benefit from Agile</li>
<li>Agile teams are more productive</li>
</ul>
<p>It&#8217;s a morning dedicated to all things Agile, with an interactive format and a lively Q&amp;A session. Bring your tough questions, your Agile mind, and share a morning with like-minded practitioners.</p>
<p><strong>Register</strong> at <a href="http://www.rallydev.com/events/agile_cafe/?src=homepage">AgileCafe</a>.  <em>Space is limited so reserve your spot soon!</em></p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/rzfhpKv35-w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/05/agilecafe-at-shopzilla-with-rally-on-thursday-may-19-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/05/agilecafe-at-shopzilla-with-rally-on-thursday-may-19-2011/</feedburner:origLink></item>
		<item>
		<title>SMJUG: Seven Deadly Sins of Solr</title>
		<link>http://feedproxy.google.com/~r/ShopzillaTechBlog/~3/al2vn-6V8-w/</link>
		<comments>http://tech.shopzilla.com/2011/04/smjug-seven-deadly-sins-of-solr/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 18:59:02 +0000</pubDate>
		<dc:creator>Mik Quinlan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://tech.shopzilla.com/?p=891</guid>
		<description><![CDATA[Shopzilla will be hosting another SMJUG event on May 19th at 7pm. Jay Hill from Lucid Imagination will be presenting. Come along for another excellent presentation and Q&#038;A session, this time wholly focused on Apache Solr! Jay&#8217;s presentation of the &#8220;Seven Deadly Sins of Solr&#8221; will include; Sloth: embrace Solr / Lucene technology, importance of [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft alignbottom" style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px;" title="Jay Hill" src="http://tech.shopzilla.com/wp-content/uploads/2011/04/smjug.jpeg" alt="" width="100" height="100" align="left" />Shopzilla will be hosting another <a href="http://www.meetup.com/SM-JUG/events/17317913/">SMJUG event on May 19th at 7pm</a>. Jay Hill from Lucid Imagination will be presenting. Come along for another excellent presentation and Q&#038;A session, this time wholly focused on Apache Solr!</p>
<div style="clear:both"> </div>
<p>Jay&#8217;s presentation of the &#8220;Seven Deadly Sins of Solr&#8221; will include;</p>
<ul>
<li><strong>Sloth</strong>: embrace Solr / Lucene technology, importance of schema definition, leveraging the dismax query parser, buttoning up the JVM settings</li>
</li>
<li><strong>Greed</strong>: importance of RAM allocation, physical separation of indexing and searching concerns</li>
<li><strong>Pride</strong>: don&#8217;t reinvent the wheel!
</li>
<li><strong>Lust</strong>: don&#8217;t forget the operating system!
</li>
<li><strong>Envy</strong>: what features do you really need, and how big does that index really need to be?
</li>
<li><strong>Gluttony</strong>: importance of schema field configuration, leveraging filter queries
</li>
<li><strong>Wrath</strong>: don&#8217;t rush to production, and don&#8217;t assume you will never need to reindex your data</ul>
</li>
</ul>
<h4>Jay Hill</h4>
<p><img class="alignleft alignbottom" style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px;" title="Jay Hill" src="http://tech.shopzilla.com/wp-content/uploads/2011/04/jay-hill.jpg" alt="" width="100" height="100" align="left" /><a href="http://www.lucidimagination.com/blog/author/jay-hill/">Jay Hill</a>  of Lucid Imagination will deliver the &#8220;Seven Deadly Sins of Solr&#8221; presentation. Jay Hill has been building enterprise search applications since 2003, and has worked extensively with Autonomy IDOL, Lucene, and Solr.</p>
<img src="http://feeds.feedburner.com/~r/ShopzillaTechBlog/~4/al2vn-6V8-w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tech.shopzilla.com/2011/04/smjug-seven-deadly-sins-of-solr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tech.shopzilla.com/2011/04/smjug-seven-deadly-sins-of-solr/</feedburner:origLink></item>
	</channel>
</rss>

